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

4

Attention: requête assez pédante en avance.

J'ai une conception qui utilise des publications (c'est-à-dire le blog) et un type de publication 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 de 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 menus déroulants 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 bon à savoir 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 serait possible d'utiliser un repère 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 de nouvelle page?

    
posée aendrew 10.10.2012 - 14:06

3 réponses

7

Je n'ai pas le temps d'expliquer cela en détail (je le ferai à 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 consiste à créer une page sans créer physiquement un vide. -placeholder-page dans le tableau de bord d'administration disponible sous: Page -> Add New .

Pour résumer, vous voulez créer une page fictive 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 par la suite de spécifier ce que vous voulez ou qui convient à vos besoins. Mon exemple, fake_page , n’est symbolique que pour illustrer le mécanisme 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 sur,

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

Ce dernier élément correspond à ce que vous verriez lors de l’exécution de la structure permalien 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...

... chaque carte correspondrait-elle à son équivalent,

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 de code 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 s'assurer que l'utilisateur n'a pas t a en fait demandé un 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 y a   probablement une autre façon de suivre l'ordre dans lequel vous spécifiez   vos règles qui sont éventuellement liées à l'utilisation de la fonction add_permastruct . Si   tout le monde a une alternative, alors chime in!

La fonction suivante qui s'accroche à template_redirect vérifie l'existence de notre fake_page dans les variables de la 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.

    
réponse donnée userabuser 13.10.2012 - 21:50
0

Créez deux pages d'archives.

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

enlace

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

À moins bien sûr que je n'aie rien compris.

    
réponse donnée Joseph Carrington 27.03.2013 - 21:08
-1

Peut-être cherchez-vous ceci:

<?php

define ('HOWTO_SLUG', 'my_howtos');
define ('HOWTO_REWRITE_SLUG', 'howtos');

register_post_type (HOWTO_SLUG,
    array
    (
        'labels' => array
        (
            'name' => 'Howtos'
            , 'singular_name' => 'Howto'
        )
        , 'public' => true
        , 'has_archive' => true
        , 'rewrite' => array ('slug' => HOWTO_REWRITE_SLUG)
    )
);

Ces publications apparaîtront dans l’administrateur du WP avec post_type=my_howtos , tandis que du côté public, l’URL-s apparaîtra sous la forme /howtos/ et le fichier archive-my_howtos.php du thème sera utilisé pour afficher la page.

Les HOWTO_SLUG et HOWTO_REWRITE_SLUG ne peuvent pas être identiques, sinon ils se briseront.

    
réponse donnée gregn3 10.10.2012 - 15:10

Lire d'autres questions sur les étiquettes