web-dev-qa-db-fra.com

Définir un sous-chemin personnalisé pour un blog sans utiliser de pages?

Attention: demande assez pédante à venir.

J'ai un design qui utilise des messages (c'est-à-dire le blog) et un type de message personnalisé appelé "howto". La page d'accueil du site ("/") contient un modèle qui affiche les derniers messages de blog et les derniers howtos. Lorsque l'utilisateur accède à la section blog ("/ blog"), il voit un modèle différent de celui utilisé pour naviguer dans la section howto ("/ howto").

Je sais que la méthode la plus simple consiste à créer deux pages ("Blog" et "Accueil"), puis à utiliser les listes déroulantes de Paramètres-> Options de lecture pour les définir explicitement. Je peux ensuite associer des modèles de page spécifiques à ces publications.

Mais sacrément si ce n'est pas vraiment compliqué - j'aurai deux pages vides inutiles encombrant toute liste de pages côté administrateur contenant du contenu réel. Vous penseriez qu'il y aurait un moyen d'utiliser l'indication de modèle pour éviter que cela ne soit nécessaire:

  • / howto/-> archive-howto.php
  • / blog/-> archive.php

Alors vraiment, je suppose que la question est vraiment la suivante:

Comment définir un chemin personnalisé pour les publications sans créer une nouvelle page?

5
aendrew

Je n’ai pas le temps d’expliquer cela en détail (je reviendrai à mon retour), mais entre-temps, cela devrait fonctionner pour vous,

Answer updated with explanation as promised.
WP Rewrite rules are like voodoo, I'm sure there's more than one way to go about this, but here's mine.

Problème:

Juste pour clarifier votre question aux autres personnes susceptibles de trébucher sur ce sujet, ce que vous voulez faire est de créer une page sans créer physiquement une page vide-espace-réservé dans le tableau de bord d'administration situé sous: Page -> Add New.

En gros, vous voulez créer une fausse page et faire en sorte que cette page utilise le modèle que vous spécifiez.

Solution:

Nous avons d'abord configuré nos règles de réécriture,

add_action('init', 'fake_page_rewrite');

function fake_page_rewrite(){

    global $wp_rewrite;

    //set up our query variable %fake_page% which equates to index.php?fake_page= 
    add_rewrite_tag( '%fake_page%', '([^&]+)'); 

    //add rewrite rule that matches /blog/page/2, /blog/page/3, /blog/page/4, etc..
    add_rewrite_rule('^blog/page/?([0-9])?','index.php?fake_page=blog&paged=$matches[1]','top');  

    //add rewrite rule that matches /blog
    add_rewrite_rule('^blog/?','index.php?fake_page=blog','top');

    //add endpoint, in this case 'blog' to satisfy our rewrite rule /blog, /blog/page/ etc..
    add_rewrite_endpoint( 'blog', EP_PERMALINK | EP_PAGES );

    //flush rules to get this to work properly
    $wp_rewrite->flush_rules();

}

Dans le add_rewrite_tag, nous spécifions notre variable de requête sous la forme de% fake_page%, ce qui vous permet de spécifier ce que vous voulez ou ce qui vous convient le mieux. Mon exemple fake_page n’est que symbolique pour illustrer les mécanismes de cette réponse.

Le fonctionnement de la variable de requête dans cette instance consiste à faire correspondre une demande pour,

http://www.example.com/blog

... qui est ensuite mappé en interne à,

http://www.example.com/index.php?fake_page=blog

Ce dernier est ce que vous verriez lors de l’exécution de la structure permalink par défaut.

De la même manière, demande,

http://www.example.com/blog/page/2
http://www.example.com/blog/page/3
http://www.example.com/blog/page/4
etc...

... Est-ce que chaque carte correspond à leurs équivalents,

http://www.example.com/index.php?fake_page=blog&paged=2
http://www.example.com/index.php?fake_page=blog&paged=3
http://www.example.com/index.php?fake_page=blog&paged=4
etc...

Dans l'exemple ci-dessus, vous remarquerez que nous avons la règle de réécriture qui correspond en premier à la pagination /blog/page/{page_number}, au-dessus de notre deuxième règle qui correspond à la base de notre fausse page de /blog.

Cela est nécessaire pour que la règle de base ne renvoie pas de correspondance lors de la première occurrence de notre point de terminaison, définie par blog, avant de pouvoir évaluer le reste de l'URL demandée afin de garantir que l'utilisateur n'a pas demandé résultat paginé. Fondamentalement, inversez ces règles et cela ne fonctionne pas.

Comme mentionné précédemment, les règles de réécriture sont comme du vaudou pour moi, donc il existe probablement un autre moyen de suivre l'ordre dans lequel vous spécifiez vos règles, ce qui est probablement lié à l'utilisation de la fonction add_permastruct. Si quelqu'un a une alternative, alors sonnez!

La fonction suivante qui accroche sur template_redirect vérifie l'existence de notre fake_page dans les variables de requête. S'il correspond/existe dans le tableau, nous demandons ensuite l'inclusion de notre fichier de modèle souhaité pour gérer la présentation des données.

add_action('template_redirect', 'fake_page_redirect');

    function fake_page_redirect(){

        global $wp;

        //retrieve the query vars and store as variable $template 
        $template = $wp->query_vars;

        //pass the $template variable into the conditional statement and
        //check if the key 'fake_page' is one of the query_vars held in the $template array
        //and that 'blog' is equal to the value of the key which is set
        if ( array_key_exists( 'fake_page', $template ) && 'blog' == $template['fake_page'] ) {

            //if the key 'fake_page' exists and 'blog' matches the value of that key
            //then return the template specified below to handle presentation
            include( get_template_directory().'/your-template-name-here.php' );

            exit;

        }
    }

PS. I have tested this and it works under my conditions, though I'm not sure if any other quirks may popup with rewrite rules and end point masks the deeper you go, therefore you should thoroughly test all pagination and permalinks and make sure that they resolve to their intended paths correctly . If not, we can address those issues as they arise.

8
userabuser

Faire deux pages d'archives.

archive.php pour vos articles de blog et archive-howto.php pour vos howtos.

http://codex.wordpress.org/images/1/18/Template_Hierarchy.png

Faire de fausses pages et jouer avec les réécritures est excessif et quelque peu dangereux.

À moins bien sûr que j'ai complètement manqué le point.

0
Joseph Carrington