Получить название шаблона страницы на фронтенде, как в редакторе блоков.

Вопрос или проблема

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

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

Применение

  1. Идентификация шаблона: Сначала мы получаем текущий пост с помощью get_post(), затем используем get_page_template_slug() для поиска связанного слога шаблона если таковой есть.

  2. Поиск через тему: Если слога нет, проверяем класс страницы с помощью функций get_body_class() и strpos() на содержание идентификаторов вида page-template-my_template_name.

  3. Форматирование и очистка: После идентификации мы очищаем полученные данные, убирая префиксы и суффиксы, чтобы итоговый выход был в удобочитаемом виде.

Это решение позволит вам получить имя шаблона страницы, известного в рамках PHP, аналогично тому, как это отслеживается редактором блоков на стороне JavaScript.

Заключение

Адаптация логик фронтенда для работы на серверной стороне часто требует применения гибридного подхода, объединяющего несколько функций и техник. Ваш конкретный случай выявляет необходимость тщательной работы с системой шаблонов WordPress и грамотным использованием возможностей API. Следует помнить, что, хотя возможности PHP ограничены по сравнению с современными редакторами на JavaScript, правильный подход позволяет достичь удовлетворительных результатов и на стороне сервера.

Оцените материал
Добавить комментарий

Капча загружается...