前回カスタムフィールドに配列を追加することができましたという記事を書きましたが、カスタムフィールドに配列を入れた結果、meta_queryが思ったように動かなくなりました。
これはメタデータに配列を書き込んだ場合シリアライズされて保存されるからで、正しい結果を取得するためにはvalueにシリアライズ後の値を指定する必要があります。
例えば以下の例は「someKey」というカスタムフィールドが空でない記事を取得するケースです。
※空というか空のarrayを入れてしまった記事を除外する、と言ったほうが正しい。
1 2 3 4 5 6 7 8 9 10 11 12 |
$arg = array( 'numberposts' => '10', 'meta_query' => array( array( 'key' => 'someKey', 'value' => 'a:0:{}', //serialize(array())の結果を入れる。 'compare' => '!=', 'type' => 'CHAR' ) ) ); $myposts = get_posts($arg); |
ADs
実際にコードを見るとすぐに分かるのですが、add_post_metaなどのメタデータを追記する処理はadd_metadataという関数が行なっています。
1 2 3 4 5 6 |
//略 $_meta_value = $meta_value; $meta_value = maybe_serialize( $meta_value ); //←何これ? do_action( "add_{$meta_type}_meta", $object_id, $meta_key, $_meta_value ); //略 |
valueを追加する際にmaybe_serializeという関数を通していますが、これはmaybe_serializeの処理を見てみると分かる通り、配列やオブジェクトが渡された場合にシリアライズするという処理です。
1 2 3 4 5 6 7 8 9 10 11 |
function maybe_serialize( $data ) { if ( is_array( $data ) || is_object( $data ) ) return serialize( $data ); // Double serialization is required for backward compatibility. // See http://core.trac.wordpress.org/ticket/12930 if ( is_serialized( $data ) ) return serialize( $data ); return $data; } |
カスタムフィールドなどのメタデータに文字列以外が入ることも想定されているようですので、メタデータに配列を持たせることがバッドノウハウというわけではなさそうです。
ADs
コメントはまだありません。