web-dev-qa-db-fra.com

Wordpress Orderby Valeur numérique ne fonctionne pas

J'essaie d'obtenir tous les produits du type de publication wpsc-product, puis de les afficher par un méta-champ personnalisé appelé release_date_year. Cependant, il ne semble pas que mes publications soient classées par cette méta-valeur personnalisée.

J'ai lu d'innombrables articles de blogues, de publications sur l'assistance sur les forums Wordpress et de nombreuses questions et réponses ici sur Wordpress Answers. Cependant, je n'ai pas pu trouver de solution à mes problèmes.

Voici le code que j'utilise pour obtenir les produits, puis les commander par un méta-champ personnalisé. Ignorez l'argument each_connected, comme c'est le cas pour le plugin Messages aux messages de Scribu. Une note rapide: j'ai également essayé de supprimer la partie each_connected pour voir si le problème était résolu, mais comme je le suspectais, cela ne changeait rien.

Il semble que le code ci-dessous permette aux produits de fonctionner correctement. Ce n'est pas le problème. Le problème semble être qu'ils sont classés en fonction de la date de publication et non de la valeur du champ méta personnalisé, qui est une valeur numérique.

    $products = new WP_Query(array(
        'post_type'         => 'wpsc-product',
        'nopaging'          => true,
        'meta_key' => 'release_date_year',
        'each_connected' => array(
            'post_type' => 'artists',
            'nopaging'  => true,
        ),
        'suppress_filters' => false,
        'orderby' => 'meta_value_num',
        'order' => 'asc',
    ));

J'ai ensuite regardé quelles requêtes étaient exécutées et voici le résultat:

SELECT   wp_posts.* FROM wp_posts  INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1  AND wp_posts.post_type = 'wpsc-product' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND wp_postmeta.meta_key = 'release_date_year' GROUP BY wp_posts.ID ORDER BY wp_posts.menu_order, wp_posts.post_date DESC           

Maintenant, est-ce juste moi ou est-ce que la partie 'ORDER BY' de ma requête doit contenir wp_postmeta.meta_key? Parce qu’il me semble que c’est ordonné par l’ordre du menu, puis la date de publication décroissante. L'autre chose étrange, c'est que je vois aussi des messages ordonnés en ordre décroissant au lieu en ordre croissant.

Comme je l'ai dit, j'ai également essayé d'utiliser meta_query dans ma requête WP_Query car j'utilisais Wordpress 3.1 à l'aide du code suivant, qui commandait toujours les publications de post_date:

$products = new WP_Query(array(
    'post_type'         => 'wpsc-product',
    'nopaging'          => true,
    'meta_key' => 'release_date_year',
    'meta_query' => array(array(
        'key'  => 'release_date_year',
        'type' => 'NUMERIC'
    )),
    'each_connected' => array(
        'post_type' => 'artists',
        'nopaging'  => true,
    ),
    'suppress_filters' => false,
    'orderby' => 'meta_value',
    'order' => 'desc',
));

Ai-je mal formaté mon instruction WP_Query ou y a-t-il autre chose en jeu ici? J'ai également confirmé qu'il existe des données dans la table wp_postmeta et qu'il existe des valeurs pour chaque produit.


Mise à jour et solution

Après avoir déconné, j'ai trouvé le coupable. Un plugin appelé 'Post Types Order' qui modifiait mes requêtes Wordpress et faisait donc que l'argument suppress_filters était complètement ignoré, entre autres comme orderby.

Voir ma réponse ci-dessous.

1
Dwayne Charrington

Le plugin ' Post Types Order ' était le coupable. Comme Scribu l’a souligné plus haut, le plug-in filtre la requête Raw SQL, ce qu’il ne devrait pas faire. En conséquence, l’argument ' suppress_filters ' n’arrêtait pas la modification de la requête et l’argument ' orderby ' était complètement ignoré.

Quant à savoir comment arrêter ce comportement, je ne suis pas sûr. J'ai résolu mon problème en désactivant le plug-in, car il n'était même pas utilisé. Toutefois, vous pouvez définir l'ordre de vos menus de type publication personnalisés dans votre code register_post_types à l'aide de l'argument ' menu_position ' qui détermine l'emplacement du menu.

La documentation permettant de commander vos types d’affichage dans le menu administrateur de Wordpress peut être trouvée ici dans la documentation officielle de Wordpress.

La leçon apprise ici est que vous devez toujours supposer qu'un plugin a cassé quelque chose, surtout si vous utilisez du code de la documentation officielle qui fonctionne.

2
Dwayne Charrington

Il semble que votre paramètre 'orderby' soit complètement ignoré.

Essayez de régler 'suppress_filters' => true pour vous assurer qu'il n'y a aucune interférence.

1
scribu