Miglior Modo per Reindirizzare una Categoria a una Pagina e Nascondere la Categoria
Ho una pagina archivio categoria su: http://mysite.com/news
Mostra un archivio di elementi dalla categoria 'news-article'
Vorrei reindirizzare qualsiasi richiesta da http://mysite.com/category/news-article a http://mysite.com/news (in modo che il primo non sia mai direttamente accessibile).
Esiste una best practice? Dovrei inserire un Reindirizzamento 301 nel mio file .htaccess (o usare un plugin per fare lo stesso)?
Oppure dovrei usare wp_safe_redirect
? Se sì, quale action hook dovrei usare? Come in:
add_action( 'WHICH_ACTION_HOOK??', 'adam_redirect_news' );
function adam_redirect_news () {
// Se siamo nella categoria 'news-article'
if ( is_category( 'news-article' ) ) {
// Reindirizza alla pagina news
wp_safe_redirect( 'http://mysite.com/news' );
exit;
}
}

Non so per qualche motivo, l'add_filter ha causato un errore. Ho usato il seguente:
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' );

Grazie a @Layka sopra, ho modificato leggermente il codice e questo fa esattamente quello di cui avevo bisogno.
Potrebbe essere qualsiasi filtro chiamato nello stesso momento - non sono sicuro.
/**
* Reindirizza la categoria 'category/news-articles' alla 'Pagina News' ( su 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;
}

Penso che template_redirect sia il miglior hook in questo caso. Vedo situazioni in cui la tua soluzione potrebbe portare a un comportamento strano del sito... L'hook term_link
non dovrebbe assolutamente essere usato per attivare reindirizzamenti URL.

template_redirect
è (IMO) il miglior hook per gestire un reindirizzamento. Di solito è l'ultimo hook prima che qualsiasi cosa venga inviata al browser, dopo il quale non potresti reindirizzare senza errore. Se agganci prima, potresti non avere accesso a tutte le informazioni necessarie per la logica (come il controllo delle categorie). Inoltre, è meglio attenersi alle azioni per il reindirizzamento, non ai filtri. I filtri sono pensati per restituire un valore al processo corrente. Le azioni sono per fare qualcosa (come un reindirizzamento).

// Funzione per reindirizzare le richieste alle pagine di categoria alla home page
function template_category_template_redirect()
{
// Verifica se la pagina corrente è una pagina di categoria
if( is_category())
{
// Effettua il reindirizzamento alla home page del sito
wp_redirect( site_url() );
// Termina l'esecuzione dello script
die;
}
}
// Aggiunge l'azione al hook 'template_redirect' di WordPress
add_action( 'template_redirect','template_category_template_redirect' );

Un altro modo possibile è avere un template personalizzato nel tuo Child-Theme. Secondo la gerarchia dei template di WordPress il file deve essere chiamato category-news-article.php.
In questo file potresti fare un reindirizzamento con wp_safe_redirect. Ad esempio:
<?php
wp_safe_redirect('/news', 301, '');
Con questo approccio solo la categoria news-article verrà reindirizzata. Tutte le altre categorie continueranno a funzionare come prima. Questo potrebbe tornare utile se vuoi puntare ogni categoria a un URL diverso. Funziona anche con i custom post type se hai nominato il template secondo la gerarchia di WordPress (vedi link sopra).
