Tipos de publicación personalizados y template_redirect
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?

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.

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.

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.

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.

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

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

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

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