WordPress template_include – cómo conectarlo correctamente

5 minutos de lectura

avatar de usuario
Martín Zeitler

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
?

avatar de usuario
eddiemoya

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.

  • add_filter('single_template', 'filter_callback') funciona muy bien para tipos de publicaciones personalizadas. Por cierto, a partir de WP 3.4, WP busca automáticamente plantillas que se parezcan a 'customPostType-single-slug.php' por lo que no se necesita código adicional para cambiar las plantillas para un tipo de publicación personalizada

    – yitwail

    29 de julio de 2012 a las 17:24

  • ¿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?

    – Greg L.

    7 febrero 2014 a las 12:21

  • @GregL: para apuntar a una página específica, no necesita estas cosas personalizadas. Obtienes eso de inmediato con WordPresses Jerarquía de plantillas o haciendo que su plantilla se pueda seleccionar como, lo que confusamente se llama de manera similar, “Plantillas de página

    – eddiemoya

    07/02/2014 a las 20:41

avatar de usuario
justin nafe

¿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/

  • Lo siento, llamar a exit() o die() definitivamente no es una opción, porque elimina el script una consulta antes de lo que debería… Necesito filtrar template_loader.php @ line 42

    – Martín Zeitler

    30 de noviembre de 2011 a las 5:02

  • Tenga en cuenta la palabra adecuadamente en el título: lo que hace el código que ha pegado es bastante tonto. ¿Por qué? Porque el enlace template_redirect ocurre antes de que el cargador de plantillas decida qué plantilla cargar…

    – Martín Zeitler

    30 de noviembre de 2011 a las 5:15

  • He visto en el rastreador de errores de BuddyPress que su sugerencia se usó allí antes, pero con una prioridad de 999, en lugar del 10 predeterminado.

    – Martín Zeitler

    30 de noviembre de 2011 a las 10:58

  • exit se usa para salir de add_action para mcd_set_template una vez que se incluye la plantilla preferida. De lo contrario, se carga la plantilla preferida y la plantilla predeterminada, que es una de las razones por las que creo que es adecuado usar template_redirect. Tienes razón en que template_redirect sucede antes del cargador de plantillas, por lo que creo que es correcto. Aquí hay un sitio que encontré útil: Enlace

    -Justin Nafe

    30 de noviembre de 2011 a las 12:13


  • Mientras tanto, descubrí cuál era el problema… también estaba relacionado con la línea de tiempo… Porque query_vars creados con add_query_var(), set_query_var(), get_query_var() aún no están disponibles en esta etapa de la solicitud (un “no documentado” rasgo”?). Ahora, desde que reestructuré todo, funciona según lo previsto, solo leyendo esos valores directamente desde una función. Si confirmo el complemento con el gancho template_redirect, lo aceptaré como la respuesta correcta, pero si puedo hacer que suceda con el gancho template_include, entonces no. Publicaré un enlace al resultado una vez que esté activo.

    – Martín Zeitler

    30 de noviembre de 2011 a las 13:46


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad