wp_postmetaテーブルのmeta_valueカラムにはシリアライズされた値が入ることは正しい動作なのでしょうか?
-
いつもお世話になっております。
下記の質問についてご存知の方がいらっしゃいましたらご教示を願います【質問の主旨】
wp_postmetaテーブルのmeta_valueカラムにはシリアライズされた値が入っています。
この現象はWordPressの動作として正しいのでしょうか?(データベースのスクリーンショット)【質問の補足】
1.
上記の【質問の主旨】はすでに質問している「消えたカスタムフィールドを再度表示させるための方法を教えてください」の関連質問です。single.phpでget_post_meta関数やupdate_post_meta関数を使っているにも関わらず、管理画面でカスタムフィールドが表示されずに困っていました。2.
先の質問では「どんな作業をしているときにカスタムフィールドが表示されなくなったのか分からない」と書きました。ですが、プラグインのWP Super Cacheの停止・削除・再インストール・有効化の動作を繰り返しているときに、カスタムフィールドが表示されなくなったように思い出しました。
—
以上、ご確認のほどよろしくお願い申し上げます。
ヘルプの必要なページ: [リンクを見るにはログイン]
-
こんにちは
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 のエラーを確認してみてはと思います。
あとは単純にスタイルで消しているとか・・・?@munyagu さん。
いつもコメントありがとうございます。
いただいたコメントについて下記のとおりご回答を申し上げます。—
>配列やオブジェクトを入れたらシリアライズされます
Codexをよく読んでいませんでした。get_post_metaの項目を読み直すと確かに配列やオブジェクトが入るとシリアライズされることが書かれていることが分かりました。
ただCodexにしたがって第三引数を
true
にしても、meta_valueのカラムにはシリアライズ値が入ります(GitHub)。これはなぜでしょうか?—
たびたびの質問となり恐れ入りますが再度ご回答をいただければ幸いです。以上、よろしくお願い申し上げます。
@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年、 9ヶ月前にmunyaguが編集しました。
@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テーブルの削除方法」について質問をすると、本来の質問の主旨からズレるような気がしますので、一旦質問を打ち切ります。ありがとうございました。
今後ともどうぞよろしくお願いします。
- トピック「wp_postmetaテーブルのmeta_valueカラムにはシリアライズされた値が入ることは正しい動作なのでしょうか?」には新たに返信することはできません。