Je souhaite remplacer la requête principale par ma propre requête personnalisée. Le truc, c'est que je ne veux pas passer par le tracas de la pagination manuelle. Je sais qu'il existe un filtre posts_results
mais je ne sais pas comment l'utiliser exactement, je n'ai pas pu trouver un tas d'informations à ce sujet. Il semble que pre_get_posts
modifie uniquement la requête au lieu de la remplacer entièrement. J'ai essayé de vider ma requête dans $posts
mais j'ai ensuite perdu la pagination. Y a-t-il un moyen de contourner ceci?
J'utilise $posts = wpdb->get_results($query);
pour remplacer la requête principale par la mienne.
$query
est mon code SQL personnalisé. J'ajoute l'extrait ci-dessus juste sous get_header()
. J'essaie de modifier la requête principale sur ma page de taxonomie personnalisée: taxonomy-mytax.php
.
La situation
Actuellement, mon client a des fabricants (taxonomie) et des produits (taxonomie), puis un produit réel (type de publication personnalisée). Ils ont demandé à afficher les publications de produit (sur la page de catégorie de produit - taxonomy-producttax.php
) dans l'ordre du fabricant le plus favorable (taxonomie). J'ai donc ajouté un champ supplémentaire dans la taxonomie du fabricant, dans lequel ils peuvent définir un nombre qui déclare une commande. Ce numéro est enregistré dans $wpdb->terms.term_group
. Maintenant, sur la page Catégorie de produit, j'essaie de remplacer entièrement la requête principale par une toute nouvelle requête qui obtiendra tous les produits et les mettra en ordre par un term_group
du fabricant. Le produit et les fabricants (les deux taxonomies) ont une commande, et les deux sont placés dans $wpdb->terms.term_gruop
, ce qui était gênant. J'ai créé une requête personnalisée qui fonctionne et affiche les messages dans l'ordre term_group
du fabricant. Je dois juste remplacer la requête principale sur taxonomy-producttax.php
par ma requête SQL personnalisée, mais je ne voulais pas entrer dans la pagination manuelle, je voulais utiliser tout ce que Wordpress a construit pour m'aider.
Vous ne pouvez pas remplacer la requête principale par la sortie de $wpdb
. La requête principale est un objet WP_Query
. $wpdb
renvoie un tableau ou un objet simple, mais pas un objet WP_Query
.
Même si vous pouviez insérer du SQL brut dans une requête (quelque chose à l'arrière de ma tête me fait penser que vous le pouvez, mais que je ne peux pas le jurer), cela n'est pas conseillé. Essayez var_dump($wp_query);
et vous verrez qu'il se passe beaucoup de choses en plus d'une requête SQL. Pour que l'objet fonctionne (y compris la pagination que vous souhaitez), tous les autres éléments doivent être définis correctement.
Vous devez utiliser pre_get_posts
et peut-être d'autres filtres de requête tels que posts_where
pour modifier l'objet WP_Query
et non pour le remplacer. Sans connaître les détails demandés par @Milo et @ChipBennett, mais vous hésitez à fournir, il ne sera pas possible de vous donner beaucoup plus de réponses.
C'est une page d'archive de taxonomie. Ce que fait ma requête, c’est d’ordonner les publications en fonction de la catégorie choisie par les utilisateurs ... Il me faudrait donc modifier la sélection, la jointure, l’endroit où, la commande.
Sans voir votre code actuel, il est difficile de donner une réponse plus précise. Cependant, outre le crochet pre_get_posts
action, WordPress fournit plusieurs filtres pour manipuler la requête encore plus tôt:
Il n'y a probablement aucune raison pour que vous ne puissiez pas manipuler la requête principale pour répondre à vos besoins:
J'ai donc ajouté un champ supplémentaire dans la taxonomie du fabricant, dans lequel ils peuvent définir un nombre qui déclare une commande. Ce numéro est enregistré dans
$wpdb->terms.term_group
. Maintenant, sur la page Catégorie de produit, j'essaie de remplacer entièrement la requête principale par une toute nouvelle requête qui obtiendra tous les produits et les mettra en ordre par unterm_group
du fabricant. Le produit et les fabricants (les deux taxonomies) ont une commande, et les deux sont placés dans$wpdb->terms.term_gruop
, ce qui était gênant. J'ai créé une requête personnalisée qui fonctionne et affiche les messages dans l'ordreterm_group
du fabricant.