Можно ли переопределить результат get_template_part ()?

11

Я работаю над дочерней темой, я настоятельно предпочитаю не переопределять основные файлы шаблонов, чтобы сохранить простоту дочерней темы, а также минимизировать объем кода и обслуживания с течением времени.

В цикле шаблон index.php в родительской теме использует: get_template_part( 'content' );

который привнесет в content.php , я смотрю, чтобы он вел себя более похожим get_template_part( 'content', get_post_format() );или похожим, чтобы добавить различные шаблоны, такие как content-aside.php и т. д., без создания index.php в дочерней теме для перезаписи родитель для изменения одной строки.

get_template_part() состоит из:

function get_template_part( $slug, $name = null ) {

    do_action( "get_template_part_{$slug}", $slug, $name );
    $templates = array();
    $name = (string) $name;
    if ( '' !== $name )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";
    locate_template($templates, true, false);
}

Итак, в моем случае доступно действие get_template_part_content

Я могу подключиться к действию с чем-то вроде:

add_action( 'get_template_part_content', 'child_post_styles', 10, 2 );

function child_post_styles ( $slug, $name ) {
    if( false == $name ){
        $name = get_post_format();
        $templates = array();
        if ( '' !== $name )
            $templates[] = "{$slug}-{$name}.php";

        $templates[] = "{$slug}.php";
        locate_template($templates, true, false);
    }
}

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

У меня проблемы с поиском способа сделать это без дублирования или без завершения рендеринга страницы сразу после обработки части шаблона, выполнив что-то глупое, например, breakилиexit

TomHarrigan
источник
Проверьте это сообщение
Pieter Goosen
3
Добро пожаловать в жалкую жизнь без шаблонного наследования. :)
Первый

Ответы:

3

Там нет крючка, чтобы сделать это. Скопируйте index.php в дочернюю тему и внесите изменения в одну строку. Кроме того, скажите автору родительской темы, что они должны сделать то же самое изменение в своей теме для гибкости.

эфирное масло
источник
Теперь это неверно, смотрите ответ @ t-toudua здесь
Иван Кастелланос
Его ответ не является решением, потому что часть шаблона все еще загружается и включает. Хук действия не может переопределить это.
Отто
Правда, но вы можете использовать ob_startвнутри него и ob_endв некотором более позднем хуке, чтобы он выполнялся, но никогда не отражался, что обычно достаточно хорошо. Или вы можете использовать exit () для принудительного завершения PHP (после того, как вы вручную добавите все, что еще отсутствует: нижний колонтитул и т. Д.)
Ivan Castellanos
И это все еще не решение. Подавление вывода - это не то же самое, что переопределение.
Отто
Выход не подавляет вывод; это фактически останавливает выполнение в этой точке.
Иван Кастелланос
6

Я думаю, что это не совсем так, как вы хотите достичь. Действительно раздражает отсутствие там фильтра для изменения имен файлов шаблонов :(

У меня есть обходной путь, хотя. Позвольте использовать content.phpдля сравнения.

// content.php file 
$format = get_post_format();
if( '' != $format ){
    get_template_part( 'content-'. $format );
}
else{
    get_template_part( 'content-default' );
}

Я не использовал второй аргумент get_template_partфункции, скорее, я передал суффикс для первого аргумента, чтобы избежать бесконечных обращений к content.phpфайлу, если 'content-'. $formatфайла нет .

Shazzad
источник
Я думаю, что это хороший способ сделать это. Не уверен, почему это не принято :)
Ань Чан
Репутация имеет значение, может быть :)
Shazzad
Извините @Shazzad, я дал ваш ответ, хотя и очень умный :) Если бы я мог принять два, я бы.
TomHarrigan
3

Ну, есть РЕШЕНИЕ :

add_action('init', function(){ remove_all_actions('get_template_part_content'); });
add_action('get_template_part_content', 'yourFunc', 99, 2 );
function yourFunc ( $slug, $name ) {

    .........any codes here.............
    if ($name == 'header'){
       //but this will be executed before loading template... At this moment, Wordpress doesnt support any hooks for before/after LOAD_TEMPLATE...
    }
}

но подумайте внимательно, в какой хук вы должны вставить это действие ... чтобы вручную определить местоположение, использовать, т.е. locate_template('content-header.php', false);

T.Todua
источник
0

Если вы хотите извлечь файл с именем content-aside.php, вы вызываете функцию следующим образом:

get_template_part( 'content', 'aside' );

Второй параметр - это имя файла после дефиса. Если ваш файл находится в подкаталоге (templates / content-aside.php):

get_template_part( 'templates/content', 'aside' );

Это то, что вы хотите сделать?

Джастин Р
источник
Спасибо, я это понимаю. Я смотрю не нужно создавать index.php в дочерней теме, чтобы перезаписать родительские темы index.php для изменения одной строки. Это добавляет больше обслуживания к детской теме. Надеюсь достичь через крючок, если это возможно.
TomHarrigan