¿Configurar una ruta secundaria personalizada para el blog sin usar páginas?

4

Advertencia: solicitud bastante pedante por delante.

Tengo un diseño que hace uso de publicaciones (es decir, el blog) y un tipo de publicación personalizada llamada "howto". La página principal del sitio ("/") tiene una plantilla que muestra las últimas publicaciones del blog y las últimas instrucciones. Cuando el usuario navega a la sección de blog ("/ blog"), ve una plantilla diferente a la de cuando navega a la sección de instrucciones ("/ howto").

Sé que la forma obvia de hacerlo es crear dos páginas ("Blog" y "Inicio"), luego usar los menús desplegables en Configuración - > Opciones de lectura para configurarlas de manera explícita. Entonces puedo asociar plantillas de página específicas a esas publicaciones.

Pero, si eso no es realmente complicado, tendré dos páginas vacías inútiles que saturan cualquier lista de páginas del lado del administrador con contenido real en ellas. Usted pensaría que habría alguna forma de utilizar sugerencias de plantillas para evitar que esto sea necesario:

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

Realmente, supongo que la pregunta realmente es la siguiente:

¿Cómo se establece una ruta personalizada para las publicaciones sin crear una página nueva?

    
pregunta aendrew 10.10.2012 - 14:06

3 respuestas

7

No tengo tiempo para explicarlo en detalle (lo haré al regresar) pero mientras tanto debería trabajar para usted,

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.

Problema:

Solo para aclarar su pregunta a otros que puedan tropezar con este hilo, lo que quiere hacer es crear una página sin tener que crear físicamente un vacío -placeholder-page dentro del panel de administración que se encuentra en: Page -> Add New .

Básicamente, deseas crear una Página falsa y hacer que esa página use cualquier plantilla que especifiques.

Solución:

Primero configuramos nuestras reglas de reescritura,

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();

}

Dentro de add_rewrite_tag especificamos nuestra variable de consulta en forma de% fake_page%, que por cierto puede especificar lo que desee o sea apropiado para sus necesidades. Mi ejemplo fake_page es solo simbólico para ilustrar la mecánica de esta respuesta.

La forma en que funciona la variable de consulta en esta instancia es haciendo coincidir una solicitud para,

http://www.example.com/blog

... que luego se asigna internamente a,

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

El último es lo que verías cuando ejecutes la estructura de enlace permanente predeterminada.

En una solicitud similar para,

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

... cada uno se asignaría a sus equivalentes,

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...

En el fragmento de ejemplo anterior, notará que tenemos la regla de reescritura que primero coincide con la paginación /blog/page/{page_number} , por encima de nuestra segunda regla que coincide con la base de nuestra página falsa de /blog .

Esto es necesario para que la regla base no devuelva una coincidencia en la primera aparición de nuestro punto final, que se define como blog antes de tener la oportunidad de evaluar el resto de la URL solicitada para garantizar que el usuario no la haya De hecho, t pidió un resultado paginado. Básicamente, revertir esas reglas y no funciona.

  

Como se mencionó anteriormente, las reglas de reescritura son como vudú para mí, así que hay   Probablemente otra manera de ir sobre el orden en que especifica   sus reglas que posiblemente estén relacionadas con el uso de la función add_permastruct . Si   ¡Cualquiera tiene una alternativa, y luego entra!

La siguiente función que se enlaza con template_redirect comprueba la existencia de nuestro fake_page dentro de las variables de consulta, si su coincidencia / existe dentro de la matriz, solicitamos la inclusión de nuestro archivo de plantilla deseado para manejar la presentación de los datos. .

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.

    
respondido por el userabuser 13.10.2012 - 21:50
0

Haz dos páginas de archivo.

archive.php para tus publicaciones de blog, y archive-howto.php para tus guías.

enlace

Hacer páginas falsas y divagarlas con las reescrituras es excesivo y algo peligroso.

A menos que, por supuesto, me haya equivocado por completo.

    
respondido por el Joseph Carrington 27.03.2013 - 21:08
-1

Quizás estés buscando esto:

<?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)
    )
);

Estas publicaciones aparecerán en el administrador de WP con post_type=my_howtos , mientras que en el lado público las URL aparecerán como /howtos/ , y el archivo archive-my_howtos.php en el tema se usará para mostrar la página.

El HOWTO_SLUG y HOWTO_REWRITE_SLUG no pueden ser iguales, o se romperá.

    
respondido por el gregn3 10.10.2012 - 15:10

Lea otras preguntas en las etiquetas