Mejor manera de redirigir categoría a página y ocultar categoría
Tengo una página de archivo de categoría en: http://mysite.com/news
Muestra un archivo de elementos de la categoría 'news-article'
Me gustaría redirigir cualquier solicitud de http://mysite.com/category/news-article a http://mysite.com/news (para que la primera nunca sea directamente accesible).
¿Existe una mejor práctica? ¿Debería poner una redirección 301 en mi archivo .htaccess (o usar un plugin para hacer lo mismo)?
¿O debería usar wp_safe_redirect
? Si es así, ¿qué gancho de acción debería usar? Como en:
add_action( 'WHICH_ACTION_HOOK??', 'adam_redirect_news' );
function adam_redirect_news () {
// Si es la categoría 'news-article'
if ( is_category( 'news-article' ) ) {
wp_safe_redirect( 'http://mysite.com/news' );
exit;
}
}

No sé por qué razón, el add_filter causó un error. Usé el siguiente código:
function my_page_template_redirect()
{
if ( is_category( 'news-articles' ) ) { // Comprueba si es la categoría 'news-articles'
$url = site_url( '/news' ); // Obtiene la URL del sitio con /news
wp_safe_redirect( $url, 301 ); // Redirección 301 segura
exit(); // Termina la ejecución
}
}
add_action( 'template_redirect', 'my_page_template_redirect' ); // Añade la acción al hook template_redirect

Gracias a @Layka mencionado anteriormente, ajusté ligeramente el código y esto hace lo que necesitaba.
Podría ser cualquier filtro llamado alrededor del mismo tiempo - no estoy seguro.
/**
* Redirige la categoría 'category/news-articles' a la 'Página de noticias' (en 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;
}

Creo que template_redirect sería el mejor hook en este caso. Veo situaciones donde tu solución podría llevar a comportamientos extraños del sitio web... El hook term_link
definitivamente no debería usarse para activar redirecciones de URL.

template_redirect
es (en mi opinión) el mejor hook para manejar redirecciones. Generalmente es el último hook antes de que cualquier cosa se envíe al navegador, después del cual no podrías redirigir sin errores. Si usas un hook más temprano, podrías no tener acceso a toda la información necesaria para la lógica (como verificar categorías). Además, es mejor usar acciones para redirecciones, no filtros. Los filtros están diseñados para devolver un valor al proceso actual. Las acciones son para hacer algo (como una redirección).

function template_category_template_redirect()
{
// Redirige las páginas de categoría a la página de inicio
if( is_category())
{
wp_redirect( site_url() );
die; // Termina la ejecución
}
}
// Añade la función al hook 'template_redirect'
add_action( 'template_redirect','template_category_template_redirect' );

Otra forma posible es tener una plantilla personalizada en tu Child-Theme. De acuerdo con la jerarquía de plantillas de WordPress, el archivo debe llamarse category-news-article.php.
En este archivo podrías hacer una redirección con wp_safe_redirect. Por ejemplo:
<?php
wp_safe_redirect('/news', 301, '');
Con este enfoque solo se redirigirá la categoría news-article. Todas las demás categorías seguirán funcionando como antes. Esto puede ser útil si deseas apuntar cada categoría a una URL diferente. También funciona con tipos de contenido personalizados si nombras la plantilla según la jerarquía de WordPress (ver enlace anterior).
