web-dev-qa-db-fra.com

Modifier la boucle WordPress principale avec un filtre parse_query

J'essaie de modifier la boucle WordPress principale sur mes pages de catégorie, comme ceci:

add_filter('parse_query', 'my_modified_query');

function my_modified_query( $q ) {
       if (!is_admin() && is_category()) {
              $q->set( 'orderby', 'meta_value' );
              $q->set( 'meta_key', 'my_key' );
       }

       return $q;
}

mais cela ne semble pas fonctionner.

Cependant, modifier quelque chose comme:

 $q->set( 'order','title' );
 $q->set( 'orderby', 'DESC');

marche parfaitement. Tout simplement pas

$q->set( 'orderby', 'meta_value' );
$q->set( 'meta_key', 'my_key' );

aucune idée pourquoi c'est?

4
Sarah Neuber

En fin de compte, toutes les méta-requêtes sont exécutées via _get_meta_sql.

L'instruction coditive suivante s'exécute pour toutes les méta-requêtes.

if ( empty( $meta_key ) && empty( $meta_value ) )
    continue;

Il existe un ticket pour cela qui décrit ce que nous devrions pouvoir faire.
http://core.trac.wordpress.org/ticket/16735

Ce que vous pouvez faire, cependant, est délibérément de transmettre à votre requête un meta_value que vos publications n’auront probablement jamais et d’utiliser la comparaison != (pas égale), techniquement, cela devrait vous permettre d’obtenir les bonnes publications, par exemple.

$q->set( 'meta_key', 'my_key' );
$q->set( 'meta_value', 'WPSE_RULES!' );
$q->set( 'meta_compare', '!=' );
$q->set( 'orderby', 'meta_value' );

Il y a une autre chose cependant, vous avez eu ces mauvaises conditions auparavant ..

$q->set( 'order','title' );
$q->set( 'orderby', 'DESC');
  • order définit la direction dans laquelle ordonner les résultats. Les valeurs valides sont asc ou desc (majuscules ou minuscules).

  • orderby définit l'ordre de classement des résultats, par exemple. date, titre, méta valeur, etc.

Je n'ai pas mentionné qu'il existe en fait une nouvelle méthode pour interroger les publications basées sur la méta maintenant, en utilisant le paramètre meta_query, mais vu que cela ne résoudra pas le problème que j'ai mentionné ci-dessus et que les méta-paramètres plus anciens sont toujours (finalement) get converti en un meta_query de toute façon, je vais simplement offrir un lien vers quelques exemples.

http://scribu.net/wordpress/advanced-metadata-queries.html

J'espère que tout aide .. :)

6
t31os

vous avez probablement eu la solution car elle est passée presque un an depuis que vous avez posté. J'ai eu le même problème il y a quelques heures jusqu'à ce que je sache que j'utilisais des chiffres - j'ai donc utilisé meta_value_num insted of meta_value.

1
Razvan Dvl

Servus Sarah. Je suppose que cela concerne un de vos thèmes d’envato-shop? Avez-vous déjà essayé d’imprimer la requête comme ceci (avant le renvoi): echo '<pre>'; print_r($q); echo '</pre>';.

Je suppose que vous ajoutez ceci dans un themes functions.php?

$q->set( 'oderby', 'DESC' ); fonctionne, mais $q->set( 'oderby', 'meta_value' ); pas? Essayez d’utiliser deux paramètres orderby de base, séparés par des espaces, pour vérifier si le comportement par défaut fonctionne partout. Si oui, vous pourriez vous retrouver avec une faute d'orthographe. Est-ce que d'autres valeurs que "my_key" fonctionnent pour "meta_key"? Sinon, il vous manque peut-être un paramètre 'meta_value'. Pas sûr sur celui-ci, mais jetez un oeil à celui-ci: http://codex.wordpress.org/Function_Reference/WP_Query#Parameters ou mieux encore, un regard direct sur la fonction dans le fichier core.

0
kaiser