Actualmente estoy codificando un complemento de WP y necesitaría anular las plantillas.
Mi enlace de filtro se ve así, y se ejecuta:
add_filter('template_include', 'mcd_set_template',10);
la función mcd_set_template() simplemente devuelve la ruta requerida como una cadena, o la plantilla de WP predeterminada en caso de que el archivo no exista.
Ya llevo horas jugando con esto, incluso podría incluir esa plantilla alternativa (pero aparece en la parte inferior de la página).
Entonces mi pregunta es, ¿cómo forzar a WP 3.2.1 a cargar otro archivo de plantilla? en cambio – y que prioridad se requiere??
Actualización: También noté que cuando usaba var_dump… sale casi al final del archivo, pero debería aparecer antes de la etiqueta HTML de apertura…
De acuerdo con este ticket, debería funcionar con template_include hook: http://core.trac.wordpress.org/ticket/11242
O es la única forma de enganchar estos filtros en su lugar:
http://codex.wordpress.org/Template_Hierarchy#Filter_Hierarchy
?
Puede usar template_redirect como se muestra arriba, pero eso requiere salir, y pisotea todo lo demás que normalmente haría WordPress para encontrar la plantilla actual. Es posible que desee dejar que eso suceda y luego aplicar la lógica a la plantilla actual.
Usando algo de lo que está arriba…
add_action('template_include', 'mcd_set_template');
function mcd_set_template() {
return locate_template('templatename.php');
}
Eso es bastante simple, también puede pasar una matriz a locate_template() para definir una jerarquía. Si tuviera que usar ‘template_redirect como se muestra arriba, aún debería usar locate_template, y así es como.
add_action('template_redirect', 'mcd_set_template');
function mcd_set_template() {
/**
* Order of templates in this array reflect their hierarchy.
* You'll want to have fallbacks like index.php in case yours is not found.
*/
$templates = array('templatename.php', 'othertemplate.php', 'index.php');
/**
* The first param will be prefixed to '_template' to create a filter
* The second will be passed to locate_template and loaded.
*/
include( get_query_template('mcd', $templates) );
exit;
}
Finalmente, la mejor manera sería filtrar tipos específicos en lugar de toda la jerarquía. Por ejemplo, podría filtrar ‘category_template’ o ‘page_template’. Eso sería más específico, evitaría meterse con toda la jerarquía de plantillas si no lo desea, y le permite a WordPress hacer más del trabajo pesado.
Por ejemplo:
add_filter('category_template', 'filter_category_template');
function filter_category_template($template){
/* Get current category */
$category = get_queried_object();
/* Create hierarchical list of desired templates */
$templates = array (
'category.php',
'custom-category-template.php',
'category-{$category->slug}.php',
'category-{$category->term_id}.php',
'index.php'
);
return locate_template($templates);
}
Por supuesto, puede crear esa matriz de plantillas jerárquicas en cualquier momento que use localizar_template(). Con este método, es fácil ver con qué facilidad puede crear todo tipo de jerarquías muy detalladas y específicas, ya sea como parte de la jerarquía de plantilla nativa o separadas de ella.
¿Has intentado usar un add_action en su lugar? Por ejemplo, es posible que desee probar algo como lo siguiente en su complemento:
add_action('template_redirect', 'mcd_set_template');
//Redirect to a preferred template.
function mcd_set_template() {
$template_path = TEMPLATEPATH . "https://stackoverflow.com/" . "templatename.php";
if(file_exists($template_path)){
include($template_path);
exit;
}
}
Aquí hay una referencia útil: http://www.mihaivalentin.com/wordpress-tutorial-load-the-template-you-want-with-template_redirect/