web-dev-qa-db-fra.com

rediriger les pages sans contenu, au lieu d'erreur 404, en utilisant max_num_posts?

J'ai un site qui a changé sa structure de pagination, ce qui a provoqué une quantité énorme d'erreurs 404 (plus de messages sont affichés par page qu'auparavant, il y a donc beaucoup de pages indexées dans les moteurs de recherche qui ont maintenant 404 pages) .

Ce que je veux faire, c'est créer une fonction qui vérifiera si un numéro de page est supérieur à la valeur max_num_pages, et si c'est le cas, interrompre le comportement par défaut de wordpress qui doit servir une page 404, et au lieu de le rediriger vers la page d'accueil. page, ou mieux encore, la page de balise initiale choisie (nous ne sommes intéressés que par les pages de balises dans la structure globale).

Ce que je ne sais pas, c’est comment - ou plus précisément quand utiliser cette fonction. J'imagine que WordPress a déjà une fonction qui vérifie cette information, ce qui déclenche à son tour le 404, alors peut-être dois-je la configurer en tant que filtre pour une fonction enfichable existante?

La fonction jusqu'à présent est

redirect_tags(){ 
if (is_main_query() && !is_singular() && is_paged()) 
{global $wp_query;
$paged = intval(get_query_var('paged'));
$max_page = $wp_query->max_num_pages;
if($max_page < $paged){
echo 'page is greater than max';}
 }}
2
andy

Si le reste de votre fonction fonctionne, vous devez simplement ajouter un appel à wp_safe_redirect et à accrocher le tout dans WordPress. . Je pense que le premier crochet qui aura un $wp_query rempli est wp. Alors changez la dernière partie de votre fonction ...

if($max_page < $paged){
    wp_safe_redirect(get_bloginof('url'),'301');
}

Et puis ajoutez ce qui suit après (extérieur) à la fonction.

add_action('wp','redirect_tags');

Je pense que cela devrait le faire. Vous pouvez configurer des boucles de redirection infinies alors soyez prudent.

Edit: Le problème est la vérification is_paged() en haut de votre fonction. Si vous essayez d'accéder à une page de pagination qui n'existe pas, is_paged() renvoie false et aucun des autres éléments de votre fonction ne s'exécute. Supprimez cette vérification et accrochez-vous à template_redirect. J'ai testé cela et ça marche. En d'autres termes...

function redirect_tags() {
  if (is_main_query() && !is_singular() ) {
    global $wp_query;
    $paged = intval(get_query_var('paged'));
    $max_page = $wp_query->max_num_pages;
    if ( ($max_page < $paged) ) {
      wp_safe_redirect(get_bloginfo('url'),'301');
    }
  }
}
add_filter('template_redirect','redirect_tags');
3
s_ha_dum