WordPress template_include - как правильно подключить - PullRequest
4 голосов
/ 30 ноября 2011

В настоящее время я пишу плагин WP и должен переопределить шаблоны.

Мой фильтр-хук выглядит так - и он выполняет:

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

Функция mcd_set_template () просто возвращает требуемый путь в виде строки - или шаблон WP по умолчанию, если файл не существует.

Я играю с этим уже часами, даже могу включить этот альтернативный шаблон (но он появляется внизу страницы).

Итак, мой вопрос: как заставить WP 3.2.1 просто загрузить другой файл шаблона вместо - и какой приоритет требуется ??

Обновление: Также я заметил, что при использовании var_dump ... он выводит почти в конце файла - но должен появляться перед открывающим тегом HTML ...

Согласно этому тикету он должен работать с хуком template_include: http://core.trac.wordpress.org/ticket/11242

Или это единственный способ подключить эти фильтры: http://codex.wordpress.org/Template_Hierarchy#Filter_Hierarchy

Ответы [ 2 ]

13 голосов
/ 16 марта 2012

Вы можете использовать template_redirect, как показано выше, но для этого требуется выход, и он попирает все остальное, что WordPress обычно делает для поиска текущего шаблона. Вы можете позволить этому случиться, а затем применить логику к текущему шаблону.

Используя кое-что из вышеперечисленного ...

add_action('template_include', 'mcd_set_template');

function mcd_set_template() {
    return locate_template('templatename.php');
}

Это довольно просто, вы также можете передать массив в locate_template () для определения иерархии. Если бы вы использовали 'template_redirect, как показано выше, вы все равно должны использовать locate_template, и вот как.

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;
}

Наконец, лучший способ - фильтровать определенные типы вместо всей иерархии. Например, вы можете отфильтровать 'category_template' или 'page_template'. Это было бы более конкретно, это позволило бы избежать путаницы со всей иерархией шаблонов, если вы этого не хотите - и это позволяет WordPress выполнять большую часть тяжелой работы

Например:

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);
}

Конечно, вы можете создать этот массив иерархических шаблонов в любое время, когда используете locate_template (). Используя этот метод, легко увидеть, как легко можно создавать всевозможные очень подробные и специфичные иерархии как в составе собственной иерархии шаблонов, так и отдельно от нее.

2 голосов
/ 30 ноября 2011

Вы пытались использовать вместо этого add_action?Например, вы можете попробовать что-то вроде следующего в вашем плагине:

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;
    }
}

Вот полезная ссылка: http://www.mihaivalentin.com/wordpress-tutorial-load-the-template-you-want-with-template_redirect/

...