Вопрос или проблема
Я пытаюсь получить имя шаблона текущей страницы так же, как это показано в Редакторе Блоков. В редакторе я могу получить его, используя:
wp.data.select('core/edit-site').getEditedPostId();
Например, это возвращает:
Blog Home template: "twentytwentyfour//home"
Single Posts template: "twentytwentyfour//single"
Pages template: "twentytwentyfour//page"
Однако при попытке получить имя шаблона через PHP я не нашел надежного способа.
Я пробовал несколько подходов, но global $template
всегда возвращает:
/opt/web/public/wp-includes/template-canvas.php
Независимо от того, какой хук я использую.
Есть ли способ получить фактическое имя шаблона в PHP, аналогично тому, как это делается в Редакторе Блоков?
Я также заметил, что имя шаблона появляется в классе, например, так:
page-template page-template-page-noticias page page-id-704 logged-in admin-bar wp-custom-logo wp-embed-responsive noptin customize-support
Мне нужен способ получить этот page-template-page-noticias
с помощью PHP.
Существует ли функция для этого?
Ответ или решение
Для решения вашей задачи по извлечению имени шаблона страницы на стороне PHP, аналогично тому, как это происходит в редакторе блоков WordPress, нужно учитывать несколько аспектов архитектуры WordPress. В редакторе блоков используется JavaScript API WordPress, который предоставляет много информации непосредственно из данных сайдбара, таких как идентификатор и структура шаблона. Однако, на стороне PHP мы должны прибегнуть к стандартным серверным методам, чтобы получить желаемую информацию.
Теория
WordPress использует сложную систему шаблонов для рендеринга страниц, которая включает в себя такие понятия, как темы и файлы шаблонов (например, single.php, page.php и пр.). Когда вы работаете с темой WordPress, движок выбирает наилучший подходящий файл в зависимости от типа контента и контекста. Самыми часто используемыми функциями для поиска и идентификации этих шаблонов на стороне PHP являются get_page_template()
и get_page_template_slug()
.
Проблема, с которой вы сталкиваетесь, связана с тем, что глобальная переменная $template
предоставляет путь к базовому шаблону WordPress после того, как транзитивные шаблоны тем (например, index.php
) были использованы. Ваша задача немного сложнее, так как вы ищете непосредственное имя или слог, связанный с шаблоном страницы.
Пример
Рассмотрим в качестве решения использования комбинации функций WordPress и немного аналитики, чтобы приблизиться к необходимому нам идентификатору или имени шаблона. Например, можно воспользоваться следующим PHP кодом:
function get_custom_template_name() {
$post = get_post();
$template_slug = get_page_template_slug($post->ID);
$template_name = '';
if ($template_slug) {
$templates = wp_get_theme()->get_page_templates();
if (isset($templates[$template_slug])) {
$template_name = $templates[$template_slug];
}
}
// Альтернативно, вы можете использовать фильтрацию по классу
if (empty($template_name)) {
$classes = get_body_class();
foreach ($classes as $class) {
if (strpos($class, 'page-template-') !== false) {
$template_name = str_replace('page-template-', '', $class);
$template_name = str_replace(['-', '.php'], [' ', ''], $template_name);
break;
}
}
}
return $template_name;
}
Применение
-
Идентификация шаблона: Сначала мы получаем текущий пост с помощью
get_post()
, затем используемget_page_template_slug()
для поиска связанного слога шаблона если таковой есть. -
Поиск через тему: Если слога нет, проверяем класс страницы с помощью функций
get_body_class()
иstrpos()
на содержание идентификаторов видаpage-template-my_template_name
. -
Форматирование и очистка: После идентификации мы очищаем полученные данные, убирая префиксы и суффиксы, чтобы итоговый выход был в удобочитаемом виде.
Это решение позволит вам получить имя шаблона страницы, известного в рамках PHP, аналогично тому, как это отслеживается редактором блоков на стороне JavaScript.
Заключение
Адаптация логик фронтенда для работы на серверной стороне часто требует применения гибридного подхода, объединяющего несколько функций и техник. Ваш конкретный случай выявляет необходимость тщательной работы с системой шаблонов WordPress и грамотным использованием возможностей API. Следует помнить, что, хотя возможности PHP ограничены по сравнению с современными редакторами на JavaScript, правильный подход позволяет достичь удовлетворительных результатов и на стороне сервера.