Как подвязать шаблон к категории с админки?

Ссылка скопирована
PHP
1 ответ

В общем
на сайте для рубрик будет несколько шаблонов
прикрутить можно так archive-катерогия.php
но нужно как то по другому, с возможностью с админки назначить шаблон для определенной категории
т.е будет 3 разных шаблона
а вот как реализовать выбор и прикреплениен с админки его?

Дополнительно:

Через ACF добавить select с нужными параметрами, в самом шаблоне archive.php проверять и в зависимости от выбранного селекта подрубать нужный шаблон

  • Либо использовать формат поста
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Павел Админов Ответ

    Подвязать шаблон к категории «из админки» можно через term meta: у категории появляется поле выбора шаблона, а на фронте шаблон читает это значение и подключает нужную разметку. Править WordPress core для этого не нужно.

    Добавить поле на экран редактирования категории:

    add_action('category_edit_form_fields', function ($term) {
        $template = get_term_meta($term->term_id, 'category_template_type', true);
        ?>
        <tr class="form-field">
            <th scope="row"><label for="category_template_type">Шаблон</label></th>
            <td>
                <select name="category_template_type" id="category_template_type">
                    <option value="default" <?php selected($template, 'default'); ?>>Обычный</option>
                    <option value="landing" <?php selected($template, 'landing'); ?>>Лендинг</option>
                    <option value="compact" <?php selected($template, 'compact'); ?>>Компактный</option>
                </select>
            </td>
        </tr>
        <?php
    });

    add_action('category_edit_form_fields', function ($term) { $template = get_term_meta($term->term_id, 'category_template_type', true); ?> <tr class="form-field"> <th scope="row"><label for="category_template_type">Шаблон</label></th> <td> <select name="category_template_type" id="category_template_type"> <option value="default" <?php selected($template, 'default'); ?>>Обычный</option> <option value="landing" <?php selected($template, 'landing'); ?>>Лендинг</option> <option value="compact" <?php selected($template, 'compact'); ?>>Компактный</option> </select> </td> </tr> <?php });

    Сохранение:

    add_action('edited_category', function ($term_id) {
        if (isset($_POST['category_template_type'])) {
            update_term_meta($term_id, 'category_template_type', sanitize_key($_POST['category_template_type']));
        }
    });

    add_action('edited_category', function ($term_id) { if (isset($_POST['category_template_type'])) { update_term_meta($term_id, 'category_template_type', sanitize_key($_POST['category_template_type'])); } });

    А в category.php или через фильтр template_include подключайте нужный файл. Главное — оставить fallback на обычный шаблон, чтобы категория не падала, если поле пустое или шаблон удалён.

    Более правильный вариант — не подключать файлы напрямую из значения поля, а сопоставлять разрешённые варианты с конкретными файлами. Так вы не получите небезопасный include и не сломаете сайт из-за случайного значения в базе:

    add_filter('template_include', function ($template) {
        if (! is_category()) {
            return $template;
        }
     
        $term = get_queried_object();
        $type = get_term_meta($term->term_id, 'category_template_type', true);
     
        $templates = [
            'landing' => get_stylesheet_directory() . '/category-landing.php',
            'compact' => get_stylesheet_directory() . '/category-compact.php',
        ];
     
        if (isset($templates[$type]) && file_exists($templates[$type])) {
            return $templates[$type];
        }
     
        return $template;
    });

    add_filter('template_include', function ($template) { if (! is_category()) { return $template; } $term = get_queried_object(); $type = get_term_meta($term->term_id, 'category_template_type', true); $templates = [ 'landing' => get_stylesheet_directory() . '/category-landing.php', 'compact' => get_stylesheet_directory() . '/category-compact.php', ]; if (isset($templates[$type]) && file_exists($templates[$type])) { return $templates[$type]; } return $template; });

    Так в админке редактор выбирает понятный вариант, а код сам решает, какой файл подключить. Если значение пустое, категория продолжит открываться через стандартный category.php или archive.php. Это безопаснее, чем создавать десятки файлов вида category-slug.php и потом вручную помнить, какая рубрика где используется.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно