У меня есть кастомный тип записи "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' => array('slug' => '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?
Да, в 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, без необходимости создавать страницу.