it-swarm.com.de

Beiträge anzeigen, wenn ein benutzerdefinierter Feldwert einem anderen benutzerdefinierten Feldwert entspricht

Ich habe 2 benutzerdefinierte Beitragstypen "Shops" und "Restaurants".

Jedem dieser Felder sind benutzerdefinierte Felder zugeordnet.

Beispielsweise lautet ein Feld in Geschäften "Geschäfts-ID" und eines in Restaurants "Restaurant-ID".

Ich möchte beide benutzerdefinierten Beitragstypen abfragen und bei einer Shop-ID von 20 alle Restaurants mit der ID 20 anzeigen.

Ich habe mit diesem Code gespielt:

            <?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; ?>

Hinweis: Ich verwende auch erweiterte benutzerdefinierte Felder.

2
user636096

Zwischen Ihrer Frage und dem von Ihnen angegebenen Code besteht ein gewisser Widerspruch. Ich bin mir also nicht ganz sicher, mit welchem ​​der beiden Szenarien Sie es zu tun haben.

Szenario 1 - Sie möchten alle Geschäfte mit einem bestimmten Wert für shop-id und alle Restaurants mit demselben Wert für restaurant-id anzeigen. Angenommen, der Wert ist 20. Sie können dies mit einer einzelnen WP_Query()-Schleife tun, die nach beiden Beitragstypen sucht, bei denen eines der benutzerdefinierten Felder den angegebenen Wert hat. Dies setzt voraus, dass Shops niemals einen Wert für restaurant-id haben und umgekehrt.

$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 );

Szenario 2 - Sie möchten alle Shops anzeigen, gefolgt von allen Restaurants, die denselben Wert für restaurant-id wie den Wert des shop-id des aktuellen Shops haben.

$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

Ich kenne keine Möglichkeit, dies mit WP_Query zu tun, aber Sie können benutzerdefiniertes SQL schreiben, um dies zu erreichen:

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));

Dies gibt alle Ergebnisse zurück, bei denen es sich bei dem Beitragstyp um ein Geschäft oder ein Restaurant handelt und bei denen die Shop-ID oder die Restaurant-ID mit der angegebenen ID übereinstimmt.

0
Dunimas

Dies funktioniert unten, aber ich möchte nur, dass es die Werte vergleicht und "Läden" zurückgibt. Im Moment werden sowohl Läden als auch Restaurants mit einem Wert von 20 zurückgegeben!

            $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