web-dev-qa-db-fra.com

Réécriture d'URL s'il s'agit d'un seul post/redirection de post - type de post

J'ai une sorte de question unique à laquelle je suis en train de réfléchir. Google nous pénalise avec le contenu en double, car vous pouvez accéder à nos articles de blog simples en allant à:

http://www.domain.com/blog/the-post-slug

aussi bien que :

http://www.domain.com/the-post-slug

L'option que nous voulons vraiment est:

http://www.domain.com/blog/the-post-slug

et si un utilisateur ou googlebot arrive à goto:

http://www.domain.com/the-post-slug 

redirige les vers:

http://www.domain.com/blog/the-post-slug

Je sais que la situation est particulière, mais nous avons de nombreux types de publication personnalisés dans notre système. Donc, notre structure ressemble à ceci.

http://www.domain.com/food/pizza
http://www.domain.com/ice-cream/strawberry
http://www.domain.com/fireworks/bottle-rockets

Idéalement, ce que je voudrais faire est de trouver un type de filtre qui vérifie logiquement si le post_type est post et redirige:

http://www.domain.com/the-post-slug 

à

http://www.domain.com/blog/post-slug

J'ai essayé de modifier le register_post_type pour l'objet post, d'ajouter with_front => false et d'ajouter le blog au slug, mais cela ne fonctionne pas.

J'ai pu ajouter/blog /% postname%/à la structure de lien permanent, et j'ai réussi à obtenir une structure décente qui fonctionnait, mais je suis resté bloqué sur les taxonomies. Quand je suis allé sur une page de taxonomie, je devais aller à:

http://www.domain.com/blog/the-taxonomy/flavors

et:

http://www.domain.com/the-taxonomy/flavors 

me donnait un 404. Donc, même si je peux trouver un moyen de faire en sorte que les taxonomies fonctionnent là où je peux le faire:

http://www.domain.com/the-taxonomy/flavors

ce serait génial! Comme autre remarque, j'ai également ajouté with_front à register_taxonomy, mais cela ne faisait rien non plus. J'ai même bousculé les réécritures sur tous les changements que j'ai faits.

Je sais que c'est beaucoup, mais mon cerveau ne peut pas aller plus loin .. lol

TIA!

Avez-vous un aperçu de cela?

1
Aaron Olin

Tout d’abord, définissez votre structure de lien permanent sur /%postname%.

Après cela, ajoutez une règle de réécriture pour réécrire toutes les requêtes telles que example.com/blog/postname dans la requête appropriée:

add_action('init', 'blog_front');

function blog_front() {
  add_rewrite_rule('^blog/([^/]+)/?','index.php?name=$matches[1]','top');
}

Maintenant, vous devez empêcher l'URL en double, en envoyant une redirection 301 lorsque example.com/postname est demandé:

add_action('template_redirect', 'say_hello_to_google');

function say_hello_to_google() {
  if ( is_main_query() && is_single() && ( empty( get_post_type() ) || (get_post_type() === 'post') ) ) {
    if ( strpos( trim( add_query_arg( array() ), '/' ), 'blog' ) !== 0 ) {
      global $post;
      $url = str_replace( $post->post_name, 'blog/' . $post->post_name, get_permalink( $post ) );
      wp_safe_redirect( $url, 301 );
      exit(); 
    }
  }
}

Enfin, vous devez créer un lien permanent pour votre message avec "blog /" devant:

add_filter('the_permalink', 'post_permalink_w_blog');

function post_permalink_w_blog( $link ) {
  global $post;
  if ( $post->post_type === 'post' ) {
    $link = str_replace( $post->post_name, 'blog/' . $post->post_name, get_permalink( $post ) );
  }
  return $link; 
}

La dernière chose à faire est de vider les règles de réécriture et ... test.


Modifier

Comme @ Milo indiqué dans les commentaires, vous pouvez éviter tout cela en définissant la structure permalink sur /blog/%postname%, puis en utilisant le paramètre 'rewrite' ayant 'with_front' à false pour tous les CPT et toutes les taxonomies.

'rewrite' => array( 'with_front' => false )

Le problème est que la plupart du temps, dans un WP moyen avec beaucoup de CPT et de taxonomies, il y a des chances que certaines d'entre elles soient enregistrées via des plugins tiers ... dans ce cas, si ces plugins enregistrent le Les TPC/taxonomies n'utilisant pas 'with_front' => false c'est un problème et la solution indiquée ci-dessus est la dernière chance.

En plus, je dois dire que les catégories et les balises standard sont enregistrées avec 'with_front' = true. Par conséquent, si vous utilisez cette méthode alternative, la catégorie et les balises standard doivent être réenregistrées avec with_front param défini à false.

1
gmazzap