web-dev-qa-db-ja.com

カスタムフィールドの値が別のカスタムフィールドの値と等しい場合に投稿を表示する

"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
user636096

あなたの質問とあなたが提供したコードの間にはいくらかの矛盾があります、それで私はあなたが扱っている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();
                ...
            }
        }
    }
}
2
karpstrucking

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と一致するすべての結果を返します。

0
Dunimas

これは以下で動作しますが、値を比較して "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 );
0
user636096