web-dev-qa-db-fra.com

2 orderby dans wp_query avec 2 champs personnalisés

Je triyng pour afficher les hôtels (taxonomie que j'ai créée) par deux "orderby" avec wp_query mais je ne suis pas un succès.

Résultats ressemble aime:

Hotel 1 :       2 persons          5 stars
Hotel 2 :       2 persons          4 stars
Hotel 3 :       2 persons          3 stars
Hotel 4 :       3 persons          5 stars
Hotel 5 :       5 persons          5 stars
Hotel 6:        10 persons         2 stars
Hotel 7:        10 persons         1 star

Le premier ordre est défini sur le nombre de personnes (le plus grand en premier) et le deuxième ordre sur le nombre d'étoiles (donc, si plusieurs hôtels ont le même nombre de personnes, l'hôtel avec les plus grandes étoiles la note serait en premier).

En dessous de mon code. J'ai essayé d'ajouter un tableau dans un tableau avec meta_query mais cela ne fonctionne pas.

$args=
            array(
                                    'post_type' => 'hotel',
                                    'Services' => $Services,
                                    'Town' => $Town, 
                                    'meta_key' => 'Number_persons',
                                    'orderby' => 'meta_value_num',
                                    'order' => 'ASC',   
                                    'meta_query' => array(
                                                           array(
                                                               'meta_key' => 'Rating',
                                                               'orderby' => 'meta_value',
                                                               'order' => 'DESC',   
                                                           )
                                                       )
                 );


$the_query = new WP_Query( $args );

Merci beaucoup :)

1
user2410522

Si vous regardez le Codex pour WP_Query vous remarquerez que orderby N'EST PAS UN PARAMÈTRE VALIDE POUR UN meta_query, NI order, NI MÊME meta_key .

Mais même si cela était réglé, je ne pense pas que vous puissiez faire ce que vous essayez de faire avec WP_Query. Un meta_query est un élément de la clause WHERE, ce qui en fait une sorte de recherche et je ne pense pas que ce soit ce que vous souhaitiez. Si toutes vos publications ont ces clés définies, alors EXISTS pourrait vous permettre une partie du chemin, mais cela exclurait tout ce qui ne contient pas l'une de ces clés. Quelque chose comme ça:

'meta_query' => array(
    array(
        'key' => 'Rating',
        'compare' => 'EXISTS'
    ),
    array(
        'key' => 'Number_persons',
        'compare' => 'EXISTS'
    )
)

Mais commander est toujours un problème et je ne vois pas d'autre moyen de le contourner qu'un filtre sur posts_orderby.

function double_meta_posts_orderby($orderby) {
  global $wpdb;
  return " {$wpdb->postmeta}.meta_value, mt1.meta_value";
}

Et mettre tous ensemble.

$args = array(
'post_type' => 'hotel',
    'Services' => $Services,
    'Town' => $Town, 
    'meta_query' => array(
  array(
        'key' => 'Number_persons',
        'compare' => 'EXISTS'
      ),
      array(
        'key' => 'Rating',
        'compare' => 'EXISTS'
      ),    
)
);
add_filter('posts_orderby','double_meta_posts_orderby');
$query = new WP_Query( $args );
remove_filter('posts_orderby','double_meta_posts_orderby');

Encore une fois, cela ne fonctionnera que si tous vos messages ont ces méta_keys. Vous pouvez utiliser le posts_joins pour rejoindre vous-même la table méta ou simplement supprimer la clause WHERE avec ...

function kill_where($where) {
  return '';
}
add_filter('posts_where','kill_where');

Notez que vous ajoutez les filtres et que vous les supprimez immédiatement après l'exécution de la requête. Si vous voulez éviter le besoin de cela, jetez un coup d'œil à cette réponse pour une autre option, ou faites en sorte que les filtres se suppriment d'eux-mêmes ...

function double_meta_posts_orderby($orderby) {
  remove_filter('posts_orderby','double_meta_posts_orderby');
  global $wpdb;
  return " {$wpdb->postmeta}.meta_value, mt1.meta_value";
}
5
s_ha_dum