Get_post_meta()取消序列化问题-返回布尔值(FALSE)

时间:2014-12-02 作者:Dipak G.

我正在使用一个简单的自定义插件,该插件将外部XML数据解析并保存为自定义字段中的序列化数组。这很好,但是,当我更新帖子时,我看到的不是数组,而是一条消息:“bool(false)”。我想它必须进行序列化/取消序列化,但没有找到任何线索。

我需要使用update_post_meta($post_id, \'tb_data\', serialize($new_value_array)); 通过省略类似序列化update_post_meta($post_id, \'tb_data\', $new_value_array); 不在自定义字段中存储任何数据。此外,我必须使用maybe_unserialize(get_post_meta($post->ID, \'tb_data\', true)); 打印结果。

共有2个自定义字段,(1)tb\\U item\\U group\\U id和(2)tb\\U data。tb\\U数据的值将使用以下功能添加,

我用来更新帖子元的函数如下。

function parse_file_func($title) {
    // get_tickets_array();exit;
    $language = explode(\'-\', get_bloginfo(\'language\'));
    $language = $language[0];
    $file = file_get_contents(\'https://dl.dropboxusercontent.com/u/12344450/feed.xml\');
    if (!$file) {
        exit;
    }
    $domObj = new xmlToArrayParser($file);
    $domArr = $domObj->array;
    if (($domObj->parse_error)) {
        echo $domObj->get_xml_error();
    } else {
        $first = $domArr[\'rss\'][\'channel\'][\'item\'];
        foreach ($first as $item) {
            if ($item[\'languageCode\'] == $language) {
                $args = array(
                    \'meta_key\' => \'tb_item_group_id\',
                    \'meta_value\' => $item[\'g:item_group_id\'],
                    \'post_type\' => \'tickets\',
                );
                $post = get_posts($args);
                if (empty($post)) {
                    continue;
                } else {
                    $args = array(
                        \'meta_key\' => \'tb_item_group_id\',
                        \'meta_value\' => $item[\'g:item_group_id\'],
                        \'post_type\' => \'tickets\',
                    );
                    $post = get_posts($args);
                    $post_id = $post[0]->ID;
                    $meta_values = get_post_meta($post_id, \'tb_data\');
                    if (empty($meta_values)) {
                        $new_value_array = array();
                        unset($item[\'cdata\']);
                        $new_value_array[\'tb_\' . $item[\'g:item_group_id\'] . \'_\' . $item[\'ticketID\']] = $item;
                    }
                    else {
                        $meta_arrays = unserialize($meta_values[0]);
                        $new_value_array = $meta_arrays;
                        foreach ($meta_arrays as $meta_ticketbar => $tb_content) {
                            if ($meta_ticketbar == \'tb_\' . $item[\'g:item_group_id\'] . \'_\' . $item[\'ticketID\']) {
                                unset($item[\'cdata\']);
                                $new_value_array[$meta_ticketbar] = $item;
                            } else {
                                $new_value_array = $meta_arrays;
                                unset($item[\'cdata\']);
                                $new_value_array[\'tb_\' . $item[\'g:item_group_id\'] . \'_\' . $item[\'ticketID\']] = $item;
                            }
                        }
                    }
                    update_post_meta($post_id, \'tb_data\', serialize($new_value_array));
                    // update_post_meta($post_id, \'tb_data\', base64_encode($new_value_array));
                }
            } else {
                continue;
            }
        }
    }
}
并使用在前端显示get_post_meta

<?php
    // $tb_meta = get_post_meta($post->ID, \'tb_data\', true);
    $tb_meta = get_post_meta($post->ID, \'tb_data\', true);
    $tb_meta_unserialized = maybe_unserialize( $tb_meta );
?>
<pre><?php
    // print_r ($tb_meta_unserialized);
    var_dump($tb_meta_unserialized);
?></pre>

2 个回复
SO网友:Dipak G.

我自己设法修好了。

我使用了以下代码来更新post-meta

update_post_meta($post_id, \'tb_data\', base64_encode(serialize($new_value_array)));
。。。和下面的代码来获取post meta

$tb_meta = get_post_meta($post->ID, \'tb_data\', true);
$tb_meta_unserialized = unserialize(base64_decode($tb_meta));
我希望这能帮助别人。

SO网友:Christos Lytras

你肯定不需要base64_encode/base64_dencode 用于执行PHP序列化/非序列化。

如果元数据包含序列化数组,则将由unserialize 作用因此,要获取未序列化的数据,不需要使用unserialize 也没有maybe_unserialize 使用时接收数据的功能get_post_meta.

此外,不需要使用serialize 使用时add_post_metaupdate_post_meta; 如果传递的不是基元和非结构化数据类型(如数组或对象),那么将检测并序列化该数据类型。因此,我们仅在希望显式序列化字符串、整数等基本数据类型时才使用序列化数据。

结束

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在