Donc, j'essaie d'obtenir le prix maximum de toutes les propriétés (type de publication personnalisé).
$max_price_query = new WP_query(array(
'posts_per_page' => -1,
'post_status' => 'publish',
'post_type' => 'properties',
'nopaging' => true,
'orderby' => 'meta_value_num',
'meta_key' => '_price',
'order' => 'DESC',
));
if ($max_price_query->have_posts()) {
while ($max_price_query->have_posts()) : $max_price_query->the_post();
$pid = $post->ID;
$price_max = get_post_meta($pid, '_price', true);
echo '<pre>' . $pid . '</pre>';
endwhile;
wp_reset_postdata();
}
Le premier problème est qu'ils sont commandés par ID, pas par prix. Les propriétés sont appelées Propriété 1, Propriété 2, etc., donc dans ce cas, classées par ID == classées par Titre == classées par Date.
Le deuxième problème est que, avant d'être commandés par ID, ils sont en fait commandés par une autre méta_value appelée _featured_prop (qui est 0 ou 1). Eh bien, c'est parce que j'ai aussi les éléments suivants:
function set_query_parameters($query) {
if( !is_admin() && is_main_query() && is_post_type_archive( 'properties' ) ) {
$query->set('meta_key', '_featured_prop');
return $query;
}
add_action( 'pre_get_posts', 'set_query_parameters' );
Je ne comprends pas pourquoi ce pre_get_posts semble affecter mon nouveau WP_Query puisque j'ai spécifié 'is_main_query ()' dans l'instruction if. Je pensais que cela n'affecterait pas mon secondary_query.
En faisant écho aux identifiants, je reçois essentiellement: 26, 24, 20, 27, 25, 23, 22, 21, 19. Où 26, 24 et 20 ont _featured_prop = 1.
Si cela fait une différence, le premier extrait de code est appelé dans un fichier sidebar.php appelé dans le fichier archive-properties.php. Ailleurs, dans un fichier de fonctions, j'appelle la fonction dans le deuxième extrait de code (car vous ne pouvez pas effectuer une add_action de pre_get_posts après le déclenchement de pre_get_posts, avant de charger la page d'archive).
Quelqu'un peut-il m'aider?
Comme @ Milo suggéré et également codexé documenté is_main_query Under_the_Hood
Cette fonction est un alias pour la méthode
WP_Query::is_main_query()
. Dans les rappels de filtre ou d'action qui reçoivent l'objetWP_Query
, tels quepre_get_posts
, l'appel de cette fonction est circulaire. Au lieu de cela, appelez directement la méthode de l'objet transmis. Par exemple, si votre rappel de filtre affecte l'objetWP_Query
transmis à$query
, vous appelez la méthode de la manière suivante:$query->is_main_query()
Vous devez changer si conduction à
function set_query_parameters($query) {
if( !is_admin() && $query->is_main_query() && is_post_type_archive( 'properties' ) ) {
$query->set('meta_key', '_featured_prop');
}
}
add_action( 'pre_get_posts', 'set_query_parameters' );
Il n'est pas nécessaire de renvoyer la requête. Et je me demande vraiment pourquoi vous ne recevez pas d'avis, car WordPress déclenche également _doing_it_wrong()
sur l'utilisation de is_main_query()
de cette façon!