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

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

<code class="html">site.com/book/bible/</code> 

Для каждого URL я создал соответствующий файл шаблона в папке своей темы: 

<pre><code class="html">site.com/book/bible/ - single-book.php
site.com/book/ - archive-book.php
site.com/ - home.php, front-page.php, index.php</code></pre> 

Сейчас мой вопрос заключается в следующем: если при создании кастомного типа записи я указываю параметры <br/> <code class="html">'rewrite' =&gt; array('slug' =&gt; 'catalog/book')</code>, как теперь должен называться файл шаблона для URL site.com/catalog/? 

<pre><code class="html">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</code></pre> 

Я нашел два возможных решения: 
1. Создать страницу с URL site.com/catalog/. Однако этот вариант не устраивает, потому что такая страница будет отображаться в общем списке страниц с контентом. 
2. В файле index.php проверять переменную $_SERVER на наличие конкретного URL /catalog/ и выводить нужный контент. Но это кажется не самым элегантным решением. 

Существует ли в WordPress способ задать файл-шаблон для любого URL без необходимости использовать подход с index.php?
  • 26 сентября 2024 г. 9:23
Ответы на вопрос 2
Да, в WordPress можно создать шаблон для URL, который не требует создания отдельной страницы или редактирования файла `index.php`. Для этого вы можете использовать файл шаблона `archive.php` или создать специальный файл для вашего кастомного типа записи.

Вот несколько рекомендаций для вашего случая:

1. **Использование `archive-book.php`**: Поскольку `archive-book.php` будет обрабатывать все архивные страницы для вашего кастомного типа записи "book", вы можете использовать этот файл для URL `site.com/catalog/book/`. Это будет правильный подход, так как он соответствует вашему типу записи.

2. **Создание файл шаблона `taxonomy-{taxonomy}.php`**: Если вы хотите, чтобы у URL `site.com/catalog/` был конкретный контент (например, архив всех книг), вы можете создать новую таксономию и обозначить её, к примеру, как `catalog`. Затем создайте файл шаблона, например, `taxonomy-catalog.php` или `taxonomy-{ваша_таксономия}.php`. Этот файл будет обрабатывать отображение содержимого для URL `site.com/catalog/`.

3. **Использование `custom page template`**: Вы можете создать страницу с пользовательским шаблоном, не отображая её в общем списке страниц. Для этого создайте файл `page-catalog.php` в вашей теме и добавьте в него следующий код:

   ```php
   <?php
   /* Template Name: Catalog */
   get_header();
   // Ваш код для отображения контента здесь
   get_footer();
   ```

   После чего просто создайте страницу "Catalog" и выберите свой кастомный шаблон.

4. **Использование redirect**: Если вы не хотите создавать страницу, вы можете использовать плагин редиректов для перенаправления запросов с `site.com/catalog/` на свою страницу с книгами или архив, созданным с помощью одного из вышеупомянутых шаблонов.

Таким образом, для URL `site.com/catalog/` вы можете использовать один из предложенных подходов, и это будет более элегантно, чем редактирование `index.php` или создание страниц с контентом, которые могут отображаться в общем списке.
Неужели в Вордпрессе нет возможности задать файл-шаблон любому урлу и я должен использовать вариант с 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, без необходимости создавать страницу.
Похожие вопросы