web-dev-qa-db-ja.com

get_post_meta()でシリアル化解除の問題 - ブール値(false)を返します

私は外部XMLデータをカスタムフィールドの直列化された配列として解析して保存する単純なカスタムプラグインを使用しています。ただし、投稿を更新すると、配列ではなく「bool(false)」というメッセージが表示されるだけです。シリアライズ/アンシリアライズが必要だと思いますが、手がかりが見つかりませんでした。

update_post_meta($post_id, 'tb_data', serialize($new_value_array));を使用してpost metaを更新するときにシリアライズする必要がありましたupdate_post_meta($post_id, 'tb_data', $new_value_array);のようにserializeを省略するとカスタムフィールドにデータが格納されません。さらに、結果を出力するにはmaybe_unserialize(get_post_meta($post->ID, 'tb_data', true));を使わなければなりません。

2つのカスタムフィールド、(1)tb_item_group_idおよび(2)tb_dataがあります。以下の関数を使ってtb_dataの値を追加します。

私が投稿メタを更新するために使用している機能は以下の通りです。

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>
3
Dipak G.

私は自分でそれを修正することができました。

私は以下のコードを使って投稿メタを更新しました

update_post_meta($post_id, 'tb_data', base64_encode(serialize($new_value_array)));

...メタを投稿するための次のコード

$tb_meta = get_post_meta($post->ID, 'tb_data', true);
$tb_meta_unserialized = unserialize(base64_decode($tb_meta));

これが誰かに役立つことを願っています。

2
Dipak G.