2011-11-30 11 views
5

Actualmente estoy codificando un plugin de WP y tendría que anular las plantillas.WordPress template_include - cómo engancharlo correctamente

Mi gancho filtro parece que - y ejecuta:

add_filter('template_include', 'mcd_set_template',10); 

función mcd_set_template() simplemente devuelve la ruta requerida como cadena - o la plantilla de WP por defecto en caso de que no existe el archivo.

Ya estoy jugando con esto durante horas, incluso podría incluir esa plantilla alternativa (pero aparece en la parte inferior de la página).

Así que mi pregunta es cómo obligar a WP 3.2.1 a cargar otro archivo de plantilla en su lugar - ¿y qué prioridad se requiere?

Actualización: También me di cuenta cuando se utiliza var_dump ... emite casi al final del archivo - pero debería aparecer antes de la etiqueta de apertura HTML ...

De acuerdo con este boleto se debe trabajar con template_include gancho: http://core.trac.wordpress.org/ticket/11242

O es la única manera de conectar estos filtros en su lugar: http://codex.wordpress.org/Template_Hierarchy#Filter_Hierarchy ?

Respuesta

3

¿Ha intentado utilizar un add_action en su lugar? Por ejemplo, es posible que desee probar algo como lo siguiente en su plugin:

add_action('template_redirect', 'mcd_set_template'); 
//Redirect to a preferred template. 
function mcd_set_template() { 
    $template_path = TEMPLATEPATH . '/' . "templatename.php"; 
    if(file_exists($template_path)){ 
     include($template_path); 
     exit; 
    } 
} 

Aquí es una referencia útil: http://www.mihaivalentin.com/wordpress-tutorial-load-the-template-you-want-with-template_redirect/

+0

Lo sentimos, llamar a exit() o die() definitivamente no es una opción, porque mata el script una consulta antes de lo que debería ... Necesita filtrar template_loader.php @ line 42 –

+2

Tenga en cuenta la palabra * correctamente * en el título: lo que hace el código que ha pegado es bastante cojo. ¿Por qué? Debido a que hook template_redirect ocurre antes de que el cargador de plantillas decida qué plantilla cargar ... –

+0

He visto en BuddyPress bug-tracker que su sugerencia fue utilizada anteriormente, pero con una prioridad de 999, en lugar de la predeterminada 10. –

14

Usted podría utilizar template_redirect como se muestra arriba, pero eso requerirá de salida, y se pisotea todo lo demás que WordPress normalmente haría para encontrar la plantilla actual. Es posible que desee dejar que eso suceda y luego aplicar la lógica a la plantilla actual.

El uso de algunos 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; 
} 

Por último, 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ífica, se evitaría jugar con toda la jerarquía plantilla si no quiere - y le permite hacer más de WordPress parte 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); 
} 

Puede, Por supuesto, cree esa matriz de plantillas jerárquicas cada vez que use locate_template(). Con este método, es fácil ver con qué facilidad podría crear todo tipo de jerarquías muy detalladas y específicas, ya sea como parte o separada de la jerarquía de plantillas nativa.

+1

' add_filter ('single_template', 'filter_callback') 'funciona muy bien para los tipos de publicaciones personalizadas. Por cierto, a partir del WP 3.4, WP comprueba automáticamente si hay plantillas que parecen '' customPostType-single-slug.php'', por lo que no se necesita código adicional para cambiar plantillas para un tipo de publicación personalizada – yitwail

+0

¿Cómo usaría este código para incluir una plantilla de página para una página específica, a través de un complemento? –

+0

@GregL: para orientar una página específica, no necesita este material personalizado. Obtienes ese derecho de la caja con WordPresses [Jerarquía de plantilla] (http://codex.wordpress.org/Template_Hierarchy#Page_display) o haciendo que tu plantilla sea seleccionable como, lo que se denomina de manera confusamente similar, "[Plantillas de página] (http : //codex.wordpress.org/Page_Templates) " – eddiemoya

Cuestiones relacionadas