"Shops"と "Restaurants"という2つのカスタム投稿タイプがあります。
これらのそれぞれに関連付けられたカスタムフィールドがあります。
たとえば、Shopsの1つのフィールドは「Shop ID」で、Restaurantsの1つのフィールドは「Restaurant ID」です。
両方のカスタム投稿タイプをクエリします。ショップIDが20の場合は、ID 20のレストランをすべて表示します。
私はこのコードでいじってきました:
<?php
$args = array(
'numberposts' => -1,
'post_type' => 'shops', 'restaurants',
'meta_query' => array(
'relation' => 'AND',
array(
'meta_key' => 'shop-id',
'meta_value' => '12345',
'compare' => '='
),
array(
'meta_key' => 'restaurant-id',
'meta_value' => '12345',
'type' => 'NUMERIC',
'compare' => '>'
)
)
);
// query
$the_query = new WP_Query( $args );
?>
<?php if( $the_query->have_posts() ): ?>
<?php while( $the_query->have_posts() ) : $the_query->the_post(); ?>
<h4>
<a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a>
</h4>
<?php endwhile; ?>
<?php endif; ?>
注:私は高度なカスタムフィールドも使用しています。
あなたの質問とあなたが提供したコードの間にはいくらかの矛盾があります、それで私はあなたが扱っている2つのシナリオのどちらが正確にわからない。
シナリオ1 - shop-id
に特定の値を持つすべての店舗と、restaurant-id
に同じ特定の値を持つすべてのレストランを表示します。値が20であるとしましょう。どちらかのカスタムフィールドが指定された値を持つ両方の投稿タイプを探す単一のWP_Query()
ループでこれを行うことができます。これは、Shopsがrestaurant-id
の値を決して持たないこと、およびその逆のことを仮定しています。
$args = array(
'posts_per_page' => -1,
'post_type' => array( 'shop', 'restaurant' ),
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'restaurant-id',
'value' => 20,
'compare' => '='
),
array(
'key' => 'shop-id',
'value' => 20,
'compare' => '='
)
)
);
$query = new WP_Query( $args );
シナリオ2 - すべてのショップを表示し、各ショップの後ろに現在のショップのrestaurant-id
の値と同じ値のshop-id
を持つすべてのレストランを表示します。
$shops = new WP_Query(
array(
'posts_per_page' => -1,
'post_type' => 'shop'
)
);
if ( $shops->have_posts() ) {
while ( $shops->have_posts() ) {
$shops->the_post();
...
$shop_id = get_post_meta( $post->ID, 'shop-id', true );
$restaurants = new WP_Query(
array(
'posts_per_page' => -1,
'post_type' => 'restaurant',
'meta_query' => array(
array(
'key' => 'restaurant-id',
'value' => $shop_id,
'compare' => '='
)
)
)
);
if ( $restaurants->have_posts() ) {
while ( $restaurants->have_posts() ) {
$restaurants->the_post();
...
}
}
}
}
WP_Queryを使用してこれを実行する方法はわかりませんが、これを実現するためのカスタムSQLを作成できます。
global $wpdb;
$id = '20';
$sql = "SELECT * FROM $wpdb->posts p
LEFT JOIN $wpdb->postmeta pm ON p.ID = pm.post_id AND pm.meta_key IN ('shop-id','restaurant-id')
WHERE p.post_type IN ('shops','restaurants')
AND (
( pm.meta_key = 'shop-id' AND pm.meta_value = %i )
OR ( pm.meta_key = 'restaurant-id' AND pm.meta_value = %i )
)";
$query = $wpdb->get_results($wpdb->prepare($sql,$id));
これは、投稿タイプがショップまたはレストランであり、shop-idまたはrestaurant-idが提供されたIDと一致するすべての結果を返します。
これは以下で動作しますが、値を比較して "shop"を返すようにしたいだけです。現時点では、値が20のショップとレストランの両方を返しています。
$args = array(
'posts_per_page' => -1,
'post_type' => array( 'shop', 'restaurant' ),
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'restaurant-id',
'value' => 20,
'compare' => '='
),
array(
'key' => 'shop-id',
'value' => 20,
'compare' => '='
)
)
);
$query = new WP_Query( $args );