Tipos de publicación personalizados y template_redirect

2 mar 2012, 18:32:12
Vistas: 25.8K
Votos: 12

Tengo dos tipos de publicación personalizados (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 del tema, ya que quiero que estén autocontenidas en sus respectivas carpetas de plugins.

¿Cómo puedo hacer que cada uno registre un gancho template_redirect sin afectar al otro? ¿O debería usar una técnica diferente?

Actualmente, estoy haciendo esto en el Plugin 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 Plugin 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 registro el gancho template_redirect del plugin 2, el del plugin 1 deja de funcionar.

¿Me estoy perdiendo algo?

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

0
Todas las respuestas a la pregunta 1
12
16

Deberías 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;
    //Realiza tu procesamiento aquí y define $template como la ruta completa a tu plantilla alternativa.
    return $template;
}

template_redirect es la acción que se llama directamente antes de enviar los encabezados para la salida de la plantilla renderizada. Es un gancho conveniente para hacer redirecciones 404, etc... pero no debería usarse para incluir otras rutas de plantillas ya que WordPress hace esto inherentemente con el filtro 'template_include'.

Los ganchos template_include y single_template tratan SOLO con la ruta de la plantilla usada para renderizar el contenido. Este es el lugar apropiado para ajustar una ruta de plantilla.

Actualización del comentario de @ChipBennett:

single_template ha sido eliminado a partir de la versión 3.4. Usa {posttype}_template en su lugar.

2 mar 2012 18:58:18
Comentarios

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 personalizada de ordenación de columnas de administración que se engancha al filtro 'request' y no estaba limitando la modificación de la variable $vars solo cuando el tipo de publicación era de un tipo específico. Pero, me alegra saber sobre el gancho template_include. Todavía no estoy seguro de cuál es la diferencia entre template_redirect, template_include y single_template.

anderly anderly
2 mar 2012 19:24:25

@anderly Actualicé mi respuesta. Espero que esto ayude.

Brian Fegter Brian Fegter
2 mar 2012 19:36:34

Entonces, ¿qué hay acerca de single_template? Este enlace (http://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 individual. Esto es lo que estoy intentando hacer. En cualquier caso, usar cualquiera de los filtros template_include o single_template funciona y parece lograr lo mismo.

anderly anderly
2 mar 2012 19:39:24

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 general en todo el sitio.

Brian Fegter Brian Fegter
2 mar 2012 19:42:14

Genial, gracias por tu ayuda. Entonces, parece que single_template es más específico (alcance reducido) que template_include?

anderly anderly
2 mar 2012 19:53:17

Eso es correcto. :)

Brian Fegter Brian Fegter
2 mar 2012 20:22:59

¿Esto respondió tu pregunta?

Brian Fegter Brian Fegter
2 mar 2012 21:27:11

muy genial... no conocía template_include

helgatheviking helgatheviking
2 mar 2012 22:39:22

Sí, lo respondiste (+1). ¡Gracias de nuevo!

anderly anderly
3 mar 2012 06:42:30

Asegúrate de marcar la respuesta como correcta para que otros sepan qué resolvió tu problema. :)

Brian Fegter Brian Fegter
3 mar 2012 06:43:23

Mi error, pensé que ya lo había hecho. Acabo de marcarla como la respuesta. :)

anderly anderly
3 mar 2012 21:55:42

Para tu información, single_template ha sido eliminado a partir de la versión 3.4. Usa {posttype}_template en su lugar.

Chip Bennett Chip Bennett
2 ene 2013 20:43:01
Mostrar los 7 comentarios restantes