J'ai 2 types de messages personnalisés "Boutiques" et "Restaurants".
Chacun de ces champs est associé à des champs personnalisés.
Par exemple, un champ dans Shops est "Shop ID" et un dans Restaurants est "Restaurant ID".
Je souhaite interroger les deux types de publication personnalisés et si l'ID de la boutique est 20, je souhaite afficher tous les restaurants portant l'ID 20.
J'ai joué avec ce code:
<?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; ?>
Remarque J'utilise également les champs personnalisés avancés.
Il y a une certaine contradiction entre votre question et le code que vous avez fourni, donc je ne sais pas exactement lequel des deux scénarios que vous envisagez.
Scénario 1 - Vous souhaitez afficher tous les magasins avec une valeur spécifique pour shop-id
et tous les restaurants avec la même valeur spécifique pour restaurant-id
. Supposons que la valeur soit 20. Vous pouvez le faire avec une seule boucle WP_Query()
qui recherche les deux types de publication où l'un des champs personnalisés a la valeur spécifiée. Cela suppose que les magasins n'auront jamais de valeur pour restaurant-id
et vice-versa.
$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 );
Scénario 2 - Vous souhaitez afficher tous les magasins, chaque magasin suivi de tous les restaurants ayant la même valeur pour restaurant-id
que la valeur du shop-id
de la boutique actuelle.
$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();
...
}
}
}
}
Je ne connais pas de moyen de faire cela en utilisant WP_Query, mais vous pouvez écrire du SQL personnalisé pour y parvenir:
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));
Tous les résultats sont renvoyés lorsque le type de message est un magasin ou un restaurant et que l'identifiant de magasin ou l'identifiant de restaurant correspond à l'identifiant fourni.
Cela fonctionne ci-dessous, mais je veux seulement qu'il compare les valeurs et renvoie les "magasins". Pour le moment, il renvoie les magasins et les restaurants où la valeur est de 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 );