web-dev-qa-db-fra.com

nouveau WP_Query pour obtenir la valeur méta de prix max ne fonctionne pas

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?

1
Joel M

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'objet WP_Query, tels que pre_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'objet WP_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!

1
Sumit