サポート » 使い方全般 » wp_postmetaテーブルのmeta_valueカラムにはシリアライズされた値が入ることは正しい動作なのでしょうか?

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • こんにちは

    配列やオブジェクトを入れたらシリアライズされます

    こんにちは

    get_post_meta() は、第3引数を省略すると配列を返します。

    (int)$count = get_post_meta($post->ID, $count_key);

    (int)$count = get_post_meta( $post->ID, $count_key, true );

    カスタムフィールドが表示されない現象はちょっと分かりません。そのような事例は見つかりませんでした。
    JavaScript で表示をコントロールしているようなので、JavaScript のエラーを確認してみてはと思います。
    あとは単純にスタイルで消しているとか・・・?

    トピック投稿者 echizenya

    (@echizenya)

    @munyagu さん。
    いつもコメントありがとうございます。
    いただいたコメントについて下記のとおりご回答を申し上げます。

    >配列やオブジェクトを入れたらシリアライズされます

    Codexをよく読んでいませんでした。get_post_metaの項目を読み直すと確かに配列やオブジェクトが入るとシリアライズされることが書かれていることが分かりました。

    ただCodexにしたがって第三引数をtrueにしても、meta_valueのカラムにはシリアライズ値が入ります(GitHub)。これはなぜでしょうか?

    たびたびの質問となり恐れ入りますが再度ご回答をいただければ幸いです。以上、よろしくお願い申し上げます。

    トピック投稿者 echizenya

    (@echizenya)

    @ishitaka さん。
    いつもコメントありがとうございます。
    いただいたコメントについて4点ご回答を申し上げます。
    特に1と2について、再度コメントをいただければ幸いです。

    1.
    >get_post_meta() は、第3引数を省略すると配列を返します。
    @munyagu さんへのコメントでも書きましたが、第3引数をtrueにしても、meta_valueのカラムにはシリアライズ値が入ります。これはなぜでしょうか?

    2.
    >JavaScript で表示をコントロールしているようなので、JavaScript のエラーを確認してみてはと思います。
    ここでいう「JavaScriptで表示をコントロールする」とはどういう意味でしょうか?
    任意で作成したJavaScriptコードは、navbtn.jsしかありません。navbtn.jsではカスタムフィールドに影響を及ぼすことはないと考えられるのですが…。

    3.
    >あとは単純にスタイルで消しているとか・・・?
    style.cssでは管理画面に対してスタイルをあてていないと思います。

    4.
    JavaScriptといえばプラグインのAutoptimizeを有効化して使っています。その設定で「JavaScript コードの最適化」にチェックを入れています。

    たびたびの質問となり恐れ入りますが再度ご回答をいただければ幸いです。以上、よろしくお願い申し上げます。

    配列を読み込むと配列で返しますので、既存のデータが配列だとそうなると思います。
    既存のデータをクリアするか、下記のようにすると良いかと思います。

    $count = get_post_meta( $post->ID, $count_key, true );
    if ( ! is_int( $count ) ) {
    	$count = 0;
    }

    カスタムフィールドが表示されない件ですが、 @echizenya さんのコードで検証してみました。
    カスタムフィールドが配列だけのときは表示されないようです。
    シリアライズされる問題を解決することでこちらも解決すると思います。

    ishitaka さんが書かれているように、postmeta に入っている値はすでにシリアライズされた文字列なので、 true を入れてもシリアライズされた文字列が取得できるだけです。
    postmeta を一旦クリアする必要があると思います。

    あと、このソースの(int)は何の仕事もしていないと思います。

    (int)$count = get_post_meta

    キャストするなら
    $count = (int) get_post_meta
    じゃないですかね。

    参考)http://php.net/manual/ja/language.types.type-juggling.php

    シリアライズされた文字列がキャストで 0 になれば自動的に 0 から始められるかもしれません。
    検証していないので分かりませんが。

    • この返信は5年、 5ヶ月前にmunyaguが編集しました。
    トピック投稿者 echizenya

    (@echizenya)

    @ishitaka さん。
    たびたびのコメントありがとうございます。

    既存のデータをクリアするか、下記のようにすると良いかと思います。

    <?php 
      if (!is_user_logged_in() ) {
        $count_key = 'postviews';
        $count = (int)get_post_meta($post->ID, $count_key, true);
        if (!is_int($count)) {
            $count = 0;
        }
        $count++;
        update_post_meta($post->ID, $count_key, $count);
      }
    ?>

    上記のコードに変更しました(GitHub)。ただこのコードに変更してもwp_postmetaテーブルのmeta_value値は配列のままで整数値に変わりません。現状、次に取りうる選択肢はwp_postmetaテーブルのデータを削除することになりますが、どのカラムをどのように削除すべきか迷っています。これ以上今回の質問で「wp_postmetaテーブルの削除方法」について質問をすると、本来の質問の主旨からズレるような気がしますので、一旦質問を打ち切ります。ありがとうございました。

    今後ともどうぞよろしくお願いします。

    トピック投稿者 echizenya

    (@echizenya)

    @munyagu さん。
    たびたびのコメントありがとうございます。
    現状のコードは、@ishitaka さんへのコメント欄で記述した通りです。

    postmeta を一旦クリアする必要があると思います。

    この件に関しましては、別途質問をするか、オフラインでリアルに会える知人を通して質問をするかどちらかの方法で対処します。今回の質問はひとまず解決済みとします。ありがとうございました。

    今後ともどうぞよろしくお願いします。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「wp_postmetaテーブルのmeta_valueカラムにはシリアライズされた値が入ることは正しい動作なのでしょうか?」には新たに返信することはできません。