@php_monkey
php monkey?

Как правильно выбрать файл шаблона в зависимости от урла?

Например, у меня есть кастомный тип записи book.
В общем случае урл конкретной записи будет выглядеть так:

site.com/book/bible/

Для каждого урла будет свой конкретный файл шаблона в папке моей темы:
site.com/book/bible/ - single-book.php
site.com/book/ - archive-book.php
site.com/ - home.php, front-page.php, index.php

Теперь вопрос: если при создании кастомного типа записи передать параметры
'rewrite' => array('slug' => 'catalog/book')
то я не понимаю, как правильно должен называться файл шаблона для урла site.com/catalog/ ?
site.com/catalog/book/bible/ - single-book.php
site.com/catalog/book/ - archive-book.php
site.com/catalog/ - тут непонятно! 
site.com/ - home.php, front-page.php, index.php


Опытным путем я нашел 2 варианта:
- можно создать страницу с урлом site.com/catalog/. Этот вариант не нравится мне тем, что техническая страница будет в списке других страниц с контентом.
- можно в файле index.php проверять $_SERVER на наличие конкретного урла /catalog/ и выводить нужный контент. Этот вариант кажется костыльным.

Неужели в Вордпрессе нет возможности задать файл-шаблон любому урлу и я должен использовать вариант с index.php?
  • Вопрос задан
  • 44 просмотра
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега WordPress
Python, JS, WordPress, SEO, Bots, Adversting
Неужели в Вордпрессе нет возможности задать файл-шаблон любому урлу и я должен использовать вариант с index.php?

Есть возможность, можно использовать функцию add_rewrite_rule() вместе с хуком template_include:
function test_rewrite_rule(): void {
    add_rewrite_rule('^catalog/?$', 'index.php?catalog_page=1', 'top');
}

add_action('init', 'test_rewrite_rule');

function test_query_var($vars) {
    $vars[] = 'catalog_page';
    return $vars;
}

add_filter('query_vars', 'test_query_var');

function test_include_catalog($template) {
    if (get_query_var('catalog_page')) {
        $new_template = locate_template(['catalog.php']);
        if ('' != $new_template) {
            return $new_template;
        }
    }
    return $template;
}

add_filter('template_include', 'test_include_catalog');

Затем, создаем шаблон catalog.php в теме, и когда пользователь перейдет по site.com/catalog/, wp будет использовать catalog.php, без необходимости создавать страницу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
artzolin
@artzolin Куратор тега WordPress
php, WordPress разработка сайтов artzolin.ru
Лучше всего добавить аргумент has_archive

'has_archive' => 'books'
'rewrite' => array( 'slug' => 'book' )


Он отвечает за архив кастомного типа поста, по умолчанию в нем будут выводиться все посты book

Отображается по ссылке site.com/books/

Для него действуют ряд специфичных функций, например is_post_type_archive()

В иерархии шаблонов он будет иметь вид archive-{post_type}.php
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы