web-dev-qa-db-fra.com

WP_Query et en utilisant une variable pour 'cat' => dans le tableau args = WP Punaise?

Pour les besoins de cette discussion, voici une version de ma requête dans category.php:

wp_reset_query();
$category_id = get_cat_ID(single_cat_title('', false));
$my_query = new WP_Query(array(
'posts_per_page' => SOME_DEFINED_VALUE,
'cat'  => $category_id,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
'post_type' => array('post','post_custom_1','post_custom_2','post_custom_3')
));
// print_r($my_query);

En bref, ça ne marche pas. Voici ce que j'ai remarqué.

Quand je fais le print_r ($ mon_query); Je peux voir le query_vars dans la première ligne. Ils ne correspondent pas à mes arguments de tableau. Par exemple, la valeur par défaut de posts_per_page est définie sur une autre valeur (pas la valeur CONSTANT), et la liste post_type n'inclut plus post (ce qui est should/must).

Si je supprime la ligne avec 'cat' => ou hardcode la valeur ('cat' => 3) alors tout fonctionnera comme prévu. Les query_vars restants apparaissent dans le print_r. La vie est belle :)

J'ai essayé ce qui suit mais n'ai pas réussi:

  • Faire de la var une constante, tout comme posts_per_page (qui ne pose pas de problème).
  • Concitation de la citation autour du numéro $ category_id - Le résultat est le même qu’aucune citation. Ça ne marche pas.
  • 'cat' => array ($ category_id) - J'ai fait une erreur - Il n'a pas aimé
    que c'était un tableau.

Quelqu'un a des suggestions?

Maintenant, voici ce qui a fonctionné "(lu: je pourrais utiliser mon $ category_id et cela ne m'a pas gâché le reste des arguments de la liste de tableaux WP_Query ()).

'cat'  => '"-'$category_id'"',

C'est-à-dire que je ne pourrais pas avoir cette identité de chat. Fou, non?

À moins que je ne puisse résoudre le problème correctement, je vais séparer tous mes chats non lignés par une virgule, analyser le chat actuel, puis utiliser cette chaîne pour effectuer la requête. En d'autres termes, si mes chats étaient A, B et C, au lieu de faire une requête pour A (comme on pourrait s'y attendre)

'cat' => A

Je vais interroger pour pas B, pas C.

'cat' => -B,-C

J'espère qu'il y a une solution moins simple. Cela fait trop d’heures maintenant que je suis et je suis suffisamment désespéré pour utiliser ce bidouillage et en finir avec ça. Cela dit, je suis persuadé que cela ressemble à un bug. Oui, j'utilise la version 3.5.1 (ou sommes-nous maintenant à 0,2 ou 0,3?). Mon point est, je suis sur la dernière version (et cela a été la même dans 3.2.x).

au fait, j'ai déjà vu ce problème posté ailleurs (par exemple, WP forums). La solution proposée consistait à suggérer que le tableau args ne soit pas un tableau mais une chaîne. Même si cela est possible avec WP_Query, comment pourrais-je faire la liste/tableau pour les post_types sous forme de chaîne? Enfin, si je fais quelque chose de mal, la page d’aide du Codex a besoin d’une mise à jour, hein?

Aidez-moi. :)

2
Chief Alchemist

Où/comment définissez-vous $category_id?

Référence l'entrée du Codex pour les paramètres de catégorie WP_Query() . WP_Query() s'attend à ce que les identifiants de catégorie soient passés sous la forme entiers et non sous la forme strings :

  • Si $category_id est un entier, transmettez-le à 'cat'.
  • Si $category_id est un tableau _ (de la catégorie ID), toujours sous la forme entier), transmettez-le à 'category__in'
2
Chip Bennett

Je suppose que cela a à voir avec la façon dont vous obtenez la catégorie. J'ai créé la fonction sur un blog sur lequel je travaille; $category_id est toujours 0.

Donc pour vérifier j'utilise cette ligne pour $category_id:

global $post;
$category_id = get_the_category($post->ID)[0]->term_id;

Juste un moyen rapide d'obtenir la première catégorie attribuée à un poste.

Après cela, la requête était ok et le paramètre cat sur la requête est rempli.

0
Simon

J'ai testé votre fonction et tout fonctionne bien, vous avez donc probablement une erreur avec un autre code de votre thème ou un conflit de plugins. Ou peut-être que votre boucle n'est pas correcte.

Pour référence, j'ai testé le code suivant sur category.php dans twentyeleven, le résultat était correct, sans erreur.

wp_reset_query();
define("SOME_DEFINED_VALUE", 5);

$category_id = get_cat_ID(single_cat_title('', false));

$my_query = new WP_Query(array(
'posts_per_page' => SOME_DEFINED_VALUE,
'cat'  => $category_id,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
'post_type' => array('post','post_custom_1','post_custom_2','post_custom_3')
));

var_dump($my_query);
0
Wyck

Lorsque j’ai analysé votre sujet en morceaux gérables pour les analyser, j’ai trouvé que le problème était probablement lié à la ligne "paginée" du tableau.

wp_reset_query();
$category_id = get_cat_ID(single_cat_title('', false));

$paged = ( get_query_var('paged') )? get_query_var('paged') : 1 ;

$query = array(
'posts_per_page' => 5,
'cat'  => $category_id,
'paged' => $paged ,
'post_type' => array('post','custom_1','custom_2','custom_3')
);

$loop = new WP_Query( $query);

print_r($loop);

Comme vous pouvez le constater, j'ai ajouté un crochet supplémentaire autour du premier get_query_var afin qu'il devienne un véritable opérateur ternaire. J'ai essayé ceci sur mon banc d'essai et cela a bien fonctionné.

cordialement Andy

0
Andy Killen