从序列化数组获取数据

时间:2017-12-22 作者:Mohsin

我已经在post表中创建了一个自定义元键,现在当我转储它给我的值时,它的值是序列化的

数组([0]=>a:3:{s:10:“产品id”;s:4:“2592”;s:7:“用户id”;i:41;i:0;a:1:{i:0;s:63:“a:3:{s:10:“产品id”;s:4:“2592”;s:7:“用户id”;i:2;i:0;a:0:{};}})

我想从中获取user\\u id和product\\u id。其主要思想是为ID存储在此meta\\u密钥中的特定产品的用户隐藏一个按钮,该产品的ID位于此序列化数组中,以及如何做到这一点的任何想法我已经尝试了以下代码,但什么都没有发生

$next_in_line = get_post_meta(esc_attr($product->get_id()), \'_next_in_line\');
print_r($next_in_line);
$unserilize_data = unserialize($next_in_line);
print_r($unserilize_data[\'0\']);
但是给了我bool(false),当我使用这个函数时

$next_in_line = get_post_meta(esc_attr($product->get_id()), \'_next_in_line\');
print_r($next_in_line);
$un_data = maybe_unserialize($next_in_line);
print_r($un_data[\'0\']);
它以以下格式返回值

a: 3:{s:10:“产品id”;s:4:“2592”;s:7:“用户id”;i:41;i:0;a:1:{i:0;s:63:“a:3:{s:10:“产品id”;s:4:“2592”;s:7:“用户id”;i:2;i:0;a:0:{};};}}

现在我如何才能做出我上面提到的条件,我现在是空白的,请有人帮助我。提前谢谢你

UPDATE

我正在存储这样的数据

function nextInLine(){
$product_id = $_POST[\'product_id\'];
$user_id = get_current_user_id();

$next_customer_meta = get_post_meta($product_id, \'_next_in_line\');

if($next_customer_meta == \'\'){
    $meta_array = array(
        \'product_id\' => $product_id,
        \'user_id\' => $user_id
    );

    $meta_value = maybe_serialize($meta_array);
} else {
    $meta_array = array(
        \'product_id\' => $product_id,
        \'user_id\' => $user_id
    );

    array_push($meta_array, $next_customer_meta);
    $meta_value = maybe_serialize($meta_array);
}
var_dump($meta_value);
update_post_meta($product_id, \'_next_in_line\', $meta_value);
return true;    

}
 add_action(\'wp_ajax_nextInLine\', \'nextInLine\');
 add_action(\'wp_ajax_nopriv_nextInLine\', \'nextInLine\');

2 个回复
SO网友:Sid

使用此选项:

$next_in_line = get_post_meta(esc_attr($product->get_id()), \'_next_in_line\', true);
print_r($next_in_line[\'user_id\']);
print_r($next_in_line[\'product_id\']);
如果有效,请告诉我。

SO网友:Mohsin

我用另一种方式解决了这个问题,改变了我的逻辑。我所做的不是一个合适的解决方法,但它像一个魔咒一样工作。下面是我所做的。

我现在只将user\\u id发送到数据库中,而不进行序列化。

function nextInLine(){
$product_id = $_POST[\'product_id\'];
$user_id = get_current_user_id();

$next_customer_meta = get_post_meta($product_id, \'_next_in_line\');
var_dump($next_customer_meta);

if( empty($next_customer_meta) ){
    $meta_value = $user_id;
} else {
    $user_id = $next_customer_meta[\'0\'] . \',\' . $user_id;
    $meta_value = $user_id;
}
update_post_meta($product_id, \'_next_in_line\', $meta_value);
return true;    

 }
  add_action(\'wp_ajax_nextInLine\', \'nextInLine\');
  add_action(\'wp_ajax_nopriv_nextInLine\', \'nextInLine\');
然后在获取和编写条件时,我使用了此代码。

<?php
            if(is_user_logged_in()){
                $next_in_line = get_post_meta(esc_attr($product->get_id()), \'_next_in_line\', true);
                $status_data = explode(\',\', $next_in_line);
                if( !in_array(get_current_user_id(), $status_data) ){
        ?>
            <button class="btn btn-sm btn-default" id="next-btn" value="<?php echo $product->get_id(); ?>">
                Next 
            </button>
            <span class="text-tiny">
                    Press this button to get in line for this item
            </span>
        <?php
                } else {
                    echo "<h4>You are already in line for this item</h4>";
                } 
            } else { 
        ?>
            <a href="<?php echo get_site_url() . \'/my-account\'; ?>">Login 
            </a><span>to get in line for this item.</span>
        <?php } ?>
    </div>
    <?php } ?>
这样做的目的是,如果用户已经点击了按钮,那么就隐藏按钮,因此从这个逻辑来看,我已经实现了我想要实现的目标。

谢谢大家宝贵的时间和努力这对我来说真的很重要

结束