Лучший способ перенаправления категории на страницу и скрытия категории
У меня есть страница архива категории по адресу: http://mysite.com/news
Она отображает архив записей из категории 'news-article'
Я хочу перенаправить все запросы с http://mysite.com/category/news-article на http://mysite.com/news (чтобы первый адрес был недоступен напрямую).
Какой способ является наилучшим? Стоит ли использовать 301 редирект в файле .htaccess (или использовать плагин для этого)?
Или лучше использовать wp_safe_redirect
? Если да, то какой хук действия следует использовать? Например:
add_action( 'WHICH_ACTION_HOOK??', 'adam_redirect_news' );
function adam_redirect_news () {
// Если это категория news-article
if ( is_category( 'news-article' ) ) {
wp_safe_redirect( 'http://mysite.com/news' );
exit;
}
}
По какой-то причине add_filter вызывает ошибку. Я использовал следующий код:
function my_page_template_redirect()
{
if ( is_category( 'news-articles' ) ) {
$url = site_url( '/news' );
wp_safe_redirect( $url, 301 );
exit();
}
}
add_action( 'template_redirect', 'my_page_template_redirect' );

Благодаря @Layka выше, я немного изменил код, и теперь он делает то, что мне нужно.
Возможно, это может быть любой фильтр, вызываемый примерно в то же время — не уверен.
/**
* Перенаправление категории 'category/news-articles' на страницу 'News page' (по адресу http://www.example.com/news)
*
*/
add_filter('template_redirect', 'template_redirect_filter', 10, 3);
function template_redirect_filter( $url, $term, $taxonomy ) {
if ( is_category( 'news-articles' ) ) {
$url = site_url( '/news' );
wp_safe_redirect( $url, 301 );
exit;
}
return $url;
}

Я считаю, что в данном случае template_redirect будет лучшим хуком. Я вижу ситуацию, когда ваше решение может привести к странному поведению сайта... Хук term_link
определенно не стоит использовать для запуска перенаправления URL.

template_redirect
(по моему мнению) — это лучший хук для обработки перенаправления. Обычно это последний хук перед тем, как что-либо отправляется в браузер, после которого вы уже не сможете выполнить перенаправление без ошибки. Если использовать более ранний хук, у вас может не быть доступа ко всей необходимой информации для логики (например, проверки категорий). Также лучше использовать действия (actions) для перенаправлений, а не фильтры (filters). Фильтры предназначены для возврата значения в текущий процесс. Действия — для выполнения каких-либо операций (например, перенаправления).

/**
* Перенаправляет пользователя на главную страницу при попытке просмотра рубрики
*/
function template_category_template_redirect()
{
if( is_category()) // Проверяем, является ли текущая страница рубрикой
{
wp_redirect( site_url() ); // Перенаправляем на главную страницу
die; // Прекращаем выполнение скрипта
}
}
add_action( 'template_redirect','template_category_template_redirect' ); // Подключаем функцию к хуку template_redirect

Еще один возможный способ — использовать пользовательский шаблон в вашей Дочерней теме. Согласно иерархии шаблонов WordPress, файл должен называться category-news-article.php.
В этом файле вы можете выполнить редирект с помощью wp_safe_redirect. Например:
<?php
wp_safe_redirect('/news', 301, '');
При таком подходе только категория news-article будет перенаправлена. Все остальные категории будут работать как прежде. Это может пригодиться, если вы хотите перенаправлять каждую категорию на разный URL. Это также работает с пользовательскими типами записей, если вы назвали шаблон в соответствии с иерархией WordPress (см. ссылку выше).
