web-dev-qa-db-fra.com

Réécrire les règles et interroger la page virtuelle

Ma question vient de celui-ci . Je n'ai jamais vraiment abordé les règles de réécriture, car elles n'ont toujours aucun sens pour moi.

Ce que j'ai

J'ai réussi à construire le lien suivant

http://localhost/wordpress/custom-archive/

qui devrait, par défaut, conduire à une page 404, car custom-archive n'existe pas. C'est pareil que visiter

http://localhost/wordpress/category/

Cette partie fonctionne bien.

Maintenant, que se passe-t-il, ce lien apparaît et ne s'affiche que sur un seul message lorsque celui-ci comporte des catégories et une étiquette. Si l'article contient des catégories et/ou des balises, j'ajoute les identifiants de catégorie et de balise pertinents au lien via query_vars personnalisé. Le lien ressemble alors à ceci

http://localhost/wordpress/custom-archive/?cq=21&tq=18,19,20,144

AUTRES INFORMATIONS IMPORTANTES

  • Je peux, en utilisant template_include, à chaque fois qu’un des deux query_vars existe, utiliser un modèle personnalisé. Cela marche

  • En ayant une requête personnalisée sur ce modèle spécifique, affichez les publications correctes

MON PROBLÈME

Bien que je reçoive des messages avec une requête personnalisée (que je souhaite également éliminer), la requête principale 404. Cela peut être vu dans ma chapelure et dans l'onglet du navigateur qui affiche "Page introuvable"

CE QUE J'AI ESSAYÉ

J'ai utilisé pre_get_posts pour obtenir les valeurs de mon query_vars personnalisé pour modifier la requête principale, mais cela ne fonctionne pas car Wordpress essaie de lire la page en tant que publication ou page unique.

J'ai aussi essayé de réécrire les règles, ce qui n'aide pas non plus ma cause. Le problème ici est que je ne peux vraiment pas obtenir la bonne combinaison. Je sais que je dois en quelque sorte dire à Wordpress que cette page est une archive personnalisée et non un message ou une page, puis utiliser les valeurs de mon query_vars personnalisé dans un tax_query pour obtenir des messages appartenant aux catégories ET tags donnés dans le query_vars personnalisé

Des suggestions aux règles de réécriture correctes pour y parvenir?

MODIFIER

Je sais que je dois en quelque sorte réécrire

http://localhost/wordpress/custom-archive/?cq=XXX&tq=XXX

à quelque chose où Wordpress peut comprendre qu’il s’agit d’une page d’archive personnalisée (ou page virtuelle) pour le type de message post, et que les messages qui doivent être affichés sur la page doivent correspondre aux messages qui sont dans les catégories indiquées par cqET a des balises qui sont données par tq.

Ceci est une idée de base de ce qui fonctionne dans mon modèle personnalisé avec une requête personnalisée

$args = [
    'post_type'    => 'post',
    'tax_query'    => [
        'relation' => 'AND',
        [
            'taxonomy' => 'category',
            'terms'    => get_query_var( 'cq' ),
        ],
        [
            'taxonomy' => 'post_tag',
            'terms'    => get_query_var( 'tq' ),
        ],
    ],
];
$q = new WP_Query( $args );

J'ai besoin de traduire cela pour fonctionner pour la requête principale. Ajouter simplement ce qui précède à pre_get_posts ne fonctionne pas, la page ne contient que 404, de sorte que l'URL doit être réécrite pour que cela fonctionne.

2
Pieter Goosen

Vous pouvez créer une archive de messages en définissant simplement post_type=post dans votre règle de réécriture:

function custom_archive_rule() {
    add_rewrite_rule(
        'custom-archive/?',
        'index.php?post_type=post',
        'top'
    );
}
add_action( 'init', 'custom_archive_rule' );

WordPress l'identifiera par is_home; vous devrez donc le cibler dans pre_get_posts en fonction de l'existence de vos variables de requête supplémentaires.

function custom_arcive_tax( $query ) {
    if ( $query->is_home()
        && $query->is_main_query()
        && isset( $_GET['cq'] ) ) {
            $tax_query = array(
                array(
                    'taxonomy' => 'category',
                    'terms' => $_GET['cq'],
                )
            );
            $query->set( 'tax_query', $tax_query );
    }
}
add_action( 'pre_get_posts', 'custom_arcive_tax' );
3
Milo