Часть шаблона внутри шорткода, неожиданный результат

Aug 16 2020

Я пытаюсь вызвать часть шаблона с помощью шорткода. Я читал все о том, как это сделать снова и снова на этом сайте, но, попробовав несколько вещей, все еще не могу вызвать простую строку времени эха php. Имя файла - test-one.php. Вот что я пробовал:

function test_2( $attr ) {
    ob_start();
    get_template_part( 'test', 'one' );
    return ob_get_clean();
}

add_shortcode('test2', 'test_2');

function test_2( $attr ) {
    ob_start();
    get_template_part( 'test-one' );
    return ob_get_clean();
}
add_shortcode('test2', 'test_2');

function test_2( $attr ) {
    ob_start();
    get_template_part( 'wp-content/themes/theme-name/template-parts/test-one' );
    return ob_get_clean();
}

add_shortcode('test2', 'test_2');

Код части шаблона:

<?php

echo "Current as of <br>  ".date("m-d-Y h:i:sa");

Похоже, это должно работать, не так ли? Где я ошибаюсь?

Ответы

2 Howdy_McGee Aug 17 2020 at 00:25

get_template_part()Функция не берет на себя имя каталога, вы должны явно поставить его. Это также относительно каталога активной темы. Итак, во многих ваших примерах шаблон искался в корне вашей активной темы. Правильный формат:

get_template_part( 'template-parts/test-one' );

Если хотите, можете переименовать папку в incили includes- это произвольно. Вам просто нужно отразить это изменение в вызове функции.


Кстати, WordPress позволяет передавать второй параметр и будет искать файлы, соединенные тире. Например, это тоже будет работать:

get_template_part( 'template-parts/test', 'one' );

Преимущество этого в том, что это позволяет вам иметь несколько «типов» конкретной детали. У вас может быть content-post.phpфайл для вывода содержимого вашего сообщения и файл для вывода содержимого content-page.phpвашей страницы. Затем в своей теме вы можете вызвать свой шаблон:

get_template_part( 'template-parts/content', $post->post_type );

Просто позволяет сделать его немного более динамичным.


Еще одно примечание. Каждый раз, когда у вас возникают проблемы с такими функциями, вы всегда можете использовать:

add_action( 'init', function() {
    $template = locate_template( $template_string_here ); printf( '<pre>%s</pre>', print_r( $template, 1 ) );
    die( 'end' );
} );

Это выведет путь к шаблону, по которому WordPress пытается получить доступ к шаблону.