web-dev-qa-db-ja.com

WPクエリ投稿メタ値

メタ値traineesを適用した投稿を取得しようとしています。

$args = array(
    'posts_per_page'   => -1,
    'orderby'          => 'post_date',
    'order'            => 'DESC',
    'post_status'      => 'publish',
    'meta_query' => array(
        array(
            'key'     => 'enterprise_on_page',
            'value'   => array( 'trainees' ),
            'compare' => 'IN',
        ),
    ),
);

$enterprise_posts = get_posts( $args );


キーを持つメタフィールドにenterprise_on_page以前はupdate_post_meta( $post_id, 'enterprise_on_page', array('trainees', 'staff') );のようにarray()を保存しました。

var_dump(get_post_meta($post->ID))を呼び出すと、次のような出力が得られます。

'enterprise_on_page' => 
    array (size=1)
      0 => string 'a:2:{i:0;s:8:"trainees";i:1;s:7:"staff";}' 


メタ値traineesを持つ投稿のみが表示されるようにクエリを変更する方法を教えてください。今までに私は投稿を得ていません。

3
pbaldauf

@Howdy_McGeeに感謝します。 直列化されたメタクエリ の世話をするヒントをくれました。このコードで私は望ましい結果を得ます。

$args = array(
    'posts_per_page'   => -1,
    'orderby'          => 'post_date',
    'order'            => 'DESC',
    'post_status'      => 'publish',
    'meta_query' => array(
        array(
            'key'     => 'enterprise_on_page',
            'value'   => serialize(strval('trainees')),
            'compare' => 'LIKE',
        ),
    ),
);

$enterprise_posts = get_posts( $args );
5
pbaldauf

正確に 直列化された配列の値を比較することはできないと思います 、配列をupdate_post_metaに渡すときはいつでも起こります。

get_post_meta( $post->ID, 'enterprise_on_page', 1 )

これらの値に基づいてクエリを指定する必要がある場合は、別々に保存するのが最善です。

詳細については、この質問を参照してください。

直列化配列としてのメタ値を持つmeta_query

2
Howdy_McGee

あなたのデータは現在構造化されているので、あなたはそれをするためにSQLを使うことはできません(少なくとも、うまく行かないように) 2つの選択肢があります。

  1. すべての投稿を取得し、正しい投稿メタを探すためにそれらをメモリ内でループします。
  2. メタ値を別々に保管してください。

両者の間で、私は後者を忠告します。 WordPressでは、単一の投稿に対して同じ投稿メタの複数の行を格納できるため、シリアル化して1つのキーに格納する必要なくデータの配列を取得できます。これを行うには、ここでポストメタAPIと対話する方法をわずかに変更する必要があります。このようなものはあなたが望むものです:

投稿メタを取得するときは、

get_post_meta($ID, 'enterprise_on_page', false);

更新は最も違います。単に値を追加したいだけなら、

add_post_meta($ID, 'enterprise_on_page', $value);

値を更新するには

update_post_meta($ID, 'enterprise_on_page', $new_value, $old_value);

そして値を削除するには:

delete_post_meta($ID, 'enterprise_on_page', $value_to_delete);

2
John P Bloch