Tipos de publicaciones personalizadas y template_redirect


9

Tengo dos tipos de publicaciones personalizadas (por ejemplo, post_type_1 y post_type_2) que me gustaría redirigir a plantillas independientes (single-post_type_1.php y single-post_type_2.php) para manejar su visualización. No quiero poner las plantillas de visualización en la carpeta de temas, ya que las quiero en sus respectivas carpetas de complementos.

¿Cómo puedo hacer que cada uno de ellos registre un enlace template_redirect sin afectar al otro? ¿O debería estar usando una técnica diferente?

Actualmente, estoy haciendo esto en el complemento 1:

add_action( 'template_redirect', 'template_redirect_1' );
function template_redirect_1() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_1' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_1 . '/views/single-post_type_1.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

Y esto en el complemento 2:

add_action( 'template_redirect', 'template_redirect_2' );
function template_redirect_2() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_2' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_2 . '/views/single-post_type_2.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

Una vez que registre el gancho template_redirect del complemento 2, el complemento 1 ya no funciona.

¿Me estoy perdiendo de algo?

¿Cuál es la mejor manera de hacer esto?

Respuestas:


13

Debería usar el filtro template_include para esto:

add_filter('template_include', 'wpse_44239_template_include', 1, 1);
function wpse_44239_template_include($template){
    global $wp_query;
    //Do your processing here and define $template as the full path to your alt template.
    return $template;
}

template_redirectes la acción que se llama directamente antes de enviar encabezados para la salida de la plantilla representada. Es un gancho conveniente para hacer redireccionamientos 404, etc., pero no debe usarse para incluir otras rutas de plantillas, ya que WordPress lo hace de forma innata con el filtro 'template_include'.

template_includey los single_templateganchos abordan SOLAMENTE la ruta de la plantilla utilizada para representar el contenido. Este es el lugar adecuado para ajustar una ruta de plantilla.

Actualización del comentario de @ChipBennett:

single_templatese ha eliminado a partir de 3.4. Utilice {posttype} _template en su lugar.


Entonces, esto funciona, pero resulta que template_redirect y single_template también funcionan. El verdadero problema que determiné fue que tengo una función de clasificación de columnas de administración personalizada que se conecta al filtro de 'solicitud' y no estaba limitando la modificación de la variable $ vars solo cuando el tipo de publicación era de cierto tipo. Pero, me alegra saber sobre el gancho template_include. Sin embargo, todavía no estoy seguro de cuál es la diferencia entre template_redirect, template_include y single_template.
Anderly

@anderly actualicé mi respuesta. Espero que esto ayude.
Brian Fegter

Entonces, ¿qué pasa con single_template? Este enlace ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) dice que se puede usar para ajustar la plantilla para una publicación o página cuando se llama a la plantilla única. Esto es lo que estoy tratando de hacer. En cualquier caso, el uso de los filtros template_include o single_template funciona y parece lograr lo mismo.
Anderly

1
single_template funciona de la misma manera, excepto que se llama condicionalmente. Esto ayuda a aislar los cambios de ruta en lugar de usar un filtro de martillo en todo el sitio.
Brian Fegter

1
muy bueno ... no sabía sobre template_include
helgatheviking
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.