Tipuri de postări personalizate și template_redirect
Am două tipuri de postări personalizate (de exemplu post_type_1 și post_type_2) pe care aș dori să le redirecționez către șabloane independente (single-post_type_1.php și single-post_type_2.php) pentru a gestiona afișarea lor. Nu vreau să pun șabloanele de afișare în folderul temei deoarece vreau să fie autonome în folderele lor respective de plugin.
Cum pot face ca fiecare dintre ele să înregistreze un hook template_redirect fără a afecta celălalt? Sau ar trebui să folosesc o tehnică diferită?
În prezent, fac acest lucru în 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;
}
}
}
Și acest lucru în 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;
}
}
}
Odată ce înregistrez hook-ul template_redirect al plugin-ului 2, cel al plugin-ului 1 nu mai funcționează.
Am ratat ceva?
Care este cea mai bună modalitate de a face acest lucru?

Ar trebui să folosești filtrul template_include pentru asta:
add_filter('template_include', 'wpse_44239_template_include', 1, 1);
function wpse_44239_template_include($template){
global $wp_query;
//Aici poți face procesarea și să definești $template ca fiind calea completă către șablonul alternativ.
return $template;
}
template_redirect
este acțiunea apelată direct înainte de trimiterea headerelor pentru afișarea șablonului randat. Este un hook convenabil pentru redirecționări 404, etc... dar nu ar trebui folosit pentru includerea altor căi de șabloane, deoarece WordPress face asta în mod nativ cu filtrul 'template_include'.
Hook-urile template_include
și single_template
se ocupă DOAR de calea șablonului folosit pentru randarea conținutului. Acesta este locul potrivit pentru a ajusta calea unui șablon.
Actualizare din comentariul lui @ChipBennett:
single_template
a fost eliminat începând cu versiunea 3.4. Folosește {posttype}_template în schimb.

Deci, asta funcționează, dar se pare că template_redirect și single_template funcționează și ele. Problema reală pe care am identificat-o a fost că am o funcție personalizată de sortare a coloanelor din admin care se conectează la filtrul 'request' și nu am limitat modificarea variabilei $vars doar pentru cazurile în care tipul de postare era de un anumit tip. Dar, mă bucur să știu despre hook-ul template_include. Totuși, încă nu sunt sigur care este diferența dintre template_redirect, template_include și single_template.

Deci, cum rămâne cu single_template? Acest link (http://codex.wordpress.org/Plugin_API/Filter_Reference/single_template) spune că poate fi folosit pentru a ajusta template-ul pentru un post sau pagină când este apelat template-ul single. Asta încerc să fac. În orice caz, folosind fie filtrul template_include, fie single_template funcționează și par să realizeze același lucru.

single_template funcționează la fel, cu excepția faptului că este apelat condiționat. Acest lucru ajută la izolarea modificărilor de cale în loc să folosești un filtru prea general pe întreg site-ul.

Super, mulțumesc pentru ajutor. Deci, se pare că single_template este mai specific (domeniu de aplicare mai restrâns) decât template_include?

Asigurați-vă că marcați răspunsul ca fiind corect, astfel încât și alții să știe ce a rezolvat problema. :)

Greșeala mea, credeam că am făcut deja asta. Tocmai l-am marcat ca răspuns corect. :)

Pentru informare, single_template
a fost eliminat începând cu versiunea 3.4. Folosiți {posttype}_template
în loc.
