it-swarm.com.ru

Отображать сообщения, если значение настраиваемого поля равно значению другого настраиваемого поля

У меня есть 2 пользовательских типа постов "Магазины" и "Рестораны".

У каждого из них есть настраиваемые поля, связанные с ними.

Например, одно поле в магазинах - это "Идентификатор магазина", а одно в ресторанах - "Идентификатор ресторана".

Я хочу запросить как пользовательские типы постов, так и если идентификатор магазина равен 20, я хочу отобразить все рестораны с идентификатором 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

Существует некоторое противоречие между вашим вопросом и предоставленным вами кодом, поэтому я не совсем уверен, с каким из двух сценариев вы имеете дело.

Сценарий 1. Вы хотите показать все магазины с определенным значением для shop-id и все рестораны с одинаковым конкретным значением для restaurant-id. Допустим, это значение равно 20. Вы можете сделать это с помощью одного цикла WP_Query(), который ищет оба типа записей, где любое настраиваемое поле имеет указанное значение. Это предполагает, что Магазины никогда не будут иметь значения для 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));

Это вернет все результаты, если тип записи - это магазин или ресторан, а идентификатор магазина или ресторана совпадает с предоставленным идентификатором.

0
Dunimas

Это работает ниже, но я только хочу, чтобы он сравнивал значения и возвращал "магазины", в данный момент он возвращает и магазин, и рестораны, где значение равно 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