Cea mai bună metodă de redirecționare a categoriei către pagină și ascunderea categoriei
Am o pagină de arhivă pentru categorie la: http://mysite.com/news
Aceasta afișează o arhivă de articole din categoria 'news-article'
Aș dori să redirecționez orice cerere pentru http://mysite.com/category/news-article către http://mysite.com/news (astfel încât prima adresă să nu fie niciodată accesibilă direct).
Care este cea mai bună practică? Ar trebui să pun o redirecționare 301 în fișierul .htaccess (sau să folosesc un plugin pentru același lucru)?
Sau ar trebui să folosesc wp_safe_redirect
? Dacă da, ce hook de acțiune ar trebui să folosesc? Ca în:
add_action( 'WHICH_ACTION_HOOK??', 'adam_redirect_news' );
function adam_redirect_news () {
// Dacă este categoria news-article
if ( is_category( 'news-article' ) ) {
wp_safe_redirect( 'http://mysite.com/news' );
exit;
}
}
Nu știu din ce motiv, funcția add_filter a generat o eroare. Am folosit următorul cod:
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' );

Mulțumesc lui @Layka mai sus, am ajustat ușor codul și acum face exact ce aveam nevoie.
Poate fi orice filtru apelat în același moment - nu sunt sigur.
/**
* Redirecționează categoria 'category/news-articles' către 'Pagina de știri' (la 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;
}

Cred că template_redirect ar fi cel mai potrivit hook în acest caz. Văd situații în care soluția ta ar putea duce la un comportament ciudat al site-ului... Hook-ul term_link
cu siguranță nu ar trebui folosit pentru a declanșa redirecționări de URL.

template_redirect
este (după părerea mea) cel mai bun hook pentru gestionarea redirecționărilor. De obicei, este ultimul hook înainte ca orice să fie trimis către browser, după care nu ai putea redirecționa fără erori. Dacă folosești un hook mai devreme, s-ar putea să nu ai acces la toate informațiile necesare pentru logică (cum ar fi verificarea categoriilor). De asemenea, este mai bine să folosești acțiuni pentru redirecționare, nu filtre. Filtrele sunt destinate returnării unei valori către procesul curent. Acțiunile sunt pentru a face ceva (cum ar fi redirecționarea).

/**
* Redirecționează utilizatorii de pe paginile de categorie către pagina principală
* Funcția verifică dacă utilizatorul se află pe o pagină de categorie
* și îl redirecționează către URL-ul de bază al site-ului
*/
function template_category_template_redirect()
{
if( is_category())
{
wp_redirect( site_url() );
die;
}
}
// Adaugă acțiunea la hook-ul template_redirect
add_action( 'template_redirect','template_category_template_redirect' );

O altă posibilă metodă este să ai un șablon personalizat în Child-Theme-ul tău. Conform ierarhiei de șabloane WordPress, fișierul trebuie să se numească category-news-article.php.
În acest fișier poți face o redirecționare cu wp_safe_redirect. de exemplu:
<?php
wp_safe_redirect('/news', 301, '');
Cu această abordare, doar categoria news-article va fi redirecționată. Toate celelalte categorii continuă să funcționeze ca înainte. Această metodă poate fi utilă dacă dorești să redirecționezi fiecare categorie către o adresă URL diferită. Funcționează și cu tipurile personalizate de postări, dacă denumești șablonul conform ierarhiei WordPress (vezi linkul de mai sus).
