web-dev-qa-db-ja.com

配列からのmeta_queryキー値

私はいくつかのACFフィールドを持つ 'ゲーム'というカスタム投稿タイプを持っています。フィールドの1つは、「レビュー」というカテゴリからの投稿を受け付ける投稿オブジェクト(review_link)です。もう1つのフィールドは、 'posts'のpost_tag分類法を探している分類法フィールド(gametagsと呼ばれる)です。

これが私が達成しようとしていることです。

  1. カテゴリReviews内の投稿(post_type = post)を読んでいるときはいつでも、サイドバーに情報を追加できるようにするために、Post objectフィールドにこの特定の投稿があるGame(post_type = game)から。

  2. 任意のカテゴリから投稿(post_type = post)を読んでいるときはいつでも、その投稿タグを取得し、Games(post_type = game)ACFフィールド、特に分類学フィールドを調べて、一致するタグを見つけることができます。そしてゲームの情報を表示します。

ケース1のための私のコードは以下です、そして、それは素晴らしい働きをします:

$reviewID = $post->ID;
if(in_category('reviews') ) {

    $reviewArgs = array(
      'post_type'    => 'game',
      'meta_query' => array(
         array(
           'key' => 'review_link',
           'value' => ''.$reviewID.'',
           'compare' => 'LIKE'
         )
       )
    );

}

ケース2では、次のことを試しました。

$tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => array(
         array(
             'key' => 'gametags',
             'value' => $tag_ids,
             'compare' => 'IN'
         )
    ) 
);

投稿例の$ tag_idsは、818,436,435,43,46,77で​​す。上記のコードの$ tag_idsを435に置き換えると一致します。しかし、私がそれを配列のように追加しようとするなら、それは違います。私はまた、配列のシリアル化、配列のループなどを試してみました。どれもうまくいきません。私はメタクエリの配列を作ることができましたが、事は各ポストのタグの数がランダムであるということです。私はまた配列を文字列に変換して 'IN'の代わりに 'LIKE'を使用して何もしないことを試みました。

実際に上記のコードは警告を投げます:warning:trim()はパラメータ1が文字列であることを期待しています、配列は594行目の/.../public_html/wp-includes/class-wp-meta-query.phpに与えられています

私はケース2を機能させるためにほとんどすべてを試みましたができませんでした。メタ値が配列の場合、meta_queryが期待どおりに機能していないことがわかりましたが、Codexではそれを配列にすることができると規定されています。上記のコードはすべてsidebar.phpにあります。

どんなヒントも評価されるでしょう

前もって感謝します

3
Pantso

一方の配列を他方の配列と直接比較できるかどうかはわかりませんが、フィールド内の各IDを個別にチェックするmeta_query配列を設定するためのループを作成できます。

$tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );

$meta_query = array('relation' => 'OR');

foreach ($tags_ids as $tag_id) {
    $meta_query[] = array(
        'key' => 'gametags',
        'value' => $tag_id,
        'compare' => 'IN'
    );
}

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => $meta_query
);

注:投稿にタグが設定されていないと、エラーが発生する可能性があるため、その場合は代替処理を追加することをお勧めします。

編集:後で正確な一致をテストするためにこれを試してください...

$review_query = new WP_Query( $reviewArgs ); 
while( $review_query->have_posts() ) { 
    $review_query->the_post(); 
    global $post; $checkmatch = false;
    $gametags = get_post_meta($post->ID,'gametags');
    if (!is_array($gametags)) {$gametags = explode(',',$gametags);}
    foreach ($tags_ids as $tag_id) {
        if (in_array($tag_id,$gametags)) {$checkmatch = true;}
    }
    if ($checkmatch) {
         // echo output
    }
}
1
majick

$tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );は配列を返すので、次のように使うことができるはずです。

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => array(
         array(
             'key' => 'gametags',
             'value' => $tag_ids,
             'compare' => 'IN'
         )
    ) 
);

ポストタイプのゲームのためのmetakeysゲームタグはありますか?またWP_Queryを使っていますか?それともget_posts()?

0
bagpipper