Чи можливо замінити результат 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



3
Ласкаво просимо в жалюгідне життя без спадкування шаблону :)
Rarst

Відповіді:


3

Для цього немає гачка. Скопіюйте index.php на дочірню тему та внесіть зміни в єдиний рядок. Також скажіть автору батьківської теми, що вони повинні внести однакові зміни в свою тему, для гнучкості.


Зараз це помилково, дивіться відповідь @ t-toudua тут
Іван Кастельянос

Його відповідь не є рішенням, оскільки частина шаблону все ще завантажується і включає. Гак дії не може це змінити.
Отто

Щоправда, але ви можете використовувати ob_startвсередині нього та ob_endна якийсь пізній гачок, так що його виконують, але ніколи не лунають, що зазвичай досить добре. Або ви можете використовувати exit (), щоб примусити припинити PHP (після того, як ви вручну додасте все, що все ще відсутнє: колонтитул тощо)
Іван Кастелланос

І це ще не є рішенням. Придушення результатів не те саме, що переважаючі речі.
Отто

Вихід не пригнічує вихід; він фактично зупиняє виконання у цій точці.
Іван Кастельянос

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файлу.


Я думаю, що це хороший спосіб зробити це. Не впевнений, чому це не прийнято :)
Anh Tran

Репутація має значення, можливо :)
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);


0

Якщо ви хочете перетягнути файл, який називається content-aside.php, ви викликаєте функцію так:

get_template_part( 'content', 'aside' );

Другий параметр - ім’я філера після дефісу. Якщо ваш файл знаходиться в підкаталозі (шаблони / content-aside.php):

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

Це те, що ти хочеш зробити?


Дякую, я це розумію. Я не хочу створювати index.php у дочірній темі, щоб замінити батьківські теми index.php для зміни однієї лінії. Це додає більшої підтримки дочірній темі. Сподіваючись досягти за допомогою гачка, якщо можливо.
TomHarrigan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.