Вопрос или проблема
Мне это кажется ужасно неинтуитивным…
Я просмотрел десятки примеров на разных ресурсах, но так и не понимаю, как изменить слаг типа записи с помощью этого или полностью убрать слаг для определенной категории.
На сайте есть пользовательский тип записи “news-items”, и в конечном URL должно быть просто “news”, без редиректа на статическую страницу.
sitename.com/news-items/
sitename.com/news-items/some-random-article
на
sitename.com/news/
sitename.com/news/random-article
На сайте есть категория “catalog”, внутри которой может быть (или не быть) случайное количество подкатегорий. И этот слаг “catalog” должен быть полностью убран из URL.
sitename.com/catalog/random-subcategory/
sitename.com/catalog/random-subcategory/random-item
sitename.com/catalog/random-subcategory/random-sub-subcategory/random-item
на
sitename.com/random-subcategory/
sitename.com/random-subcategory/random-item
sitename.com/random-subcategory/random-sub-subcategory/random-item
Возможно ли вообще сделать такие вещи без использования плагинов или сложных хаков?
Также, действительно ли нужно использовать flush_rewrite_rules()? Потому что в некоторых примерах, которые я смотрел, это использовалось, но во многих других – нет.
Ответ или решение
Конечно, использование функции add_rewrite_rule
в WordPress может показаться сложным, особенно когда требуется изменить или полностью убрать слаг для кастомного типа записи или категории. Давайте разберемся, как это можно сделать для вашего сайта.
Изменение слага для кастомного типа записи
Вы хотите, чтобы кастомный тип записи news-items
имел URL с коротким слагом news
вместо текущего "news-items"
. Для этого используем функцию add_rewrite_rule
, которая позволяет добавлять пользовательские правила перезаписи URL.
Шаги:
-
Регистрация кастомного типа записи:
При регистрации кастомного типа записиnews-items
, используйте параметрrewrite
:register_post_type('news-items', [ 'rewrite' => ['slug' => 'news'], // другие аргументы ]);
-
Добавление правил перезаписи:
В файле functions.php добавьте правило, чтобы WordPress понимал ваш новый паттерн URL:add_action('init', 'my_custom_rewrite_rules'); function my_custom_rewrite_rules() { add_rewrite_rule( '^news/([0-9]+)/?$', 'index.php?news-items=$matches[1]', 'top' ); }
-
Сброс правил перезаписи:
Да, сброс правил обязателен. Выполнитеflush_rewrite_rules()
один раз после добавления или изменения правил, чтобы обновить правила перезаписи:add_action('after_switch_theme', 'flush_rewrite_rules');
Удаление слага из URL категории
Теперь, чтобы удалить слаг catalog
из URL категории, нужно следовать аналогичному подходу:
Шаги:
-
Функция перезаписи для категории:
Добавьте правило так, чтобы обходить слагcatalog
:add_action('init', 'remove_catalog_slug'); function remove_catalog_slug() { // Удаляем 'catalog' из URL add_rewrite_rule( '^([^/]+)/(.+)$', 'index.php?category_name=$matches[1]/$matches[2]', 'top' ); }
-
Сброс правил перезаписи:
Чтобы изменения вступили в силу, не забудьте сбросить правила:add_action('init', 'flush_rewrite_rules', 11);
Заключение
Да, такие изменения возможны без использования плагинов, но следует применять их с осторожностью, чтобы избежать проблем с функциональностью сайта и SEO. Сброс правил перезаписи важен для того, чтобы убедиться, что новые паттерны вступили в силу. Общие сложности часто связаны с уникальностью шаблонов URL, поэтому обязательно тестируйте сайт после внесения изменений.
Надеюсь, эти инструкции помогут вам настроить URL так, как вы хотите. Если у вас возникнут сложности, рассмотрите вариант создания резервной копии сайта перед внесением изменений, чтобы минимизировать риски.