web-dev-qa-db-fra.com

query_posts trie dans plusieurs directions

J'essaie d'améliorer mon tri des messages en utilisant plusieurs critères, mais je veux des commandes spécifiques pour des valeurs différentes. Par exemple, j'ai une méta_key appelée "en vedette" que je veux déplacer tout message en haut. Pour faire correspondre "en vedette", il convient de trier par titre.

Le problème est que je ne peux définir qu'une clé "order" dans la fonction query_posts.

$args=array(
                                        'post_type'         => 'portfolio-item',
                                        'post_status'       => 'publish',
                                        'caller_get_posts'  => 1,
                                        'paged'             => $paged,
                                        'meta_key'          => 'featured',
                                        'orderby'           => 'meta_value title',
                                        'order'             => 'desc asc',
                                    );

C’est le tableau de paramètres que j’aimerais utiliser (notez les valeurs d’ordre multiples. Malheureusement, cela ne semble pas correspondre à la forme. Des suggestions?

2
MechEngineer

Commandé par

Les fonctions de requête, telles que get_posts(), query_posts(), appellent un new WP_Query à l'intérieur: elles ne sont que des wrappers.

La chose la plus importante est ce qui se passe dans le class WP_Query. Spécifiquement à l'intérieur de WP_Query -> get_posts(). Lorsque vous ajoutez un argument orderby, les événements suivants se produisent:

  1. WP vérifie s'il est défini. Si ce n'est pas le cas, il utilise le $wpdb->posts.post_date et y ajoute la valeur de la commande.
  2. Si vous le définissez sur 'none', l'ordre no est appliqué.
  3. Dans tous les autres cas, la commande sera utilisée.

Mais ... il existe des valeurs "ordre autorisé":

$allowed_keys = array('name', 'author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'Rand', 'comment_count');

Pour les paires méta clé/valeur, il existe un cas spécial : si la clé méta n'est pas vide, la valeur meta_key est ajoutée aux clés autorisées, ainsi que meta_value et meta_value_num.

La fonction qui explose la chaîne orderby en un tableau et effectue une boucle. Tout ce qui correspond est ajouté à un nouveau tableau, qui est ensuite implosé (séparé par une virgule) après la boucle et ajouté à la chaîne de requête SQL. Si le tableau résultant était vide, alors, encore une fois, le "$wpdb->posts.post_date" suivi de la order sera pris. Si cela est également vide, vous obtiendrez le même résultat qu'avec none.

Donc, si vous ajoutez quelque chose comme une clé méta et une méta-valeur, vous devriez obtenir les éléments suivants ajoutés à votre requête:

"$wpdb->postmeta.meta_value,$wpdb->postmeta.meta_value,$wpdb->posts.post_title"

Type de poste

Votre type de message arg est ajouté à la clause WHERE comme ceci:

 AND $wpdb->posts.post_type = 'portfolio-item'

Ce que je pense est faux ici:

  1. Vous ne pouvez pas ajouter asc desc en tant qu'instruction order. L'ordre doit être soit ASC ou DESC (majuscules/minuscules peu importe). Cela ne fonctionnera pas et va probablement casser.
  2. Je suis à peu près sûr que 'portfolio-item' n'est pas le nom du type de message réel. Je suppose que c'est juste portfolio. Assurez-vous d'appeler quel que soit le type de message nommé à l'intérieur

    var_dump( array_keys( (array) $GLOBALS['wp_post_types'] ) );
    
  3. caller_get_posts est un argument pré-3.1. Vous devriez déjà avoir une note au début/au début de votre code, car la _deprecated_argument() suivante est appelée avant toute chaîne de requête est même construite:

    "caller_get_posts" is deprecated. Use "ignore_sticky_posts" instead.
    
1
kaiser