Dans l’exemple nous avons besoin que la totalité de nos articles possède le schéma suivant :
- URL du site
- news
- nom du post
Mais qu’une fois la structure changée, toutes les URLs ne soient pas en 404.
Hook template_redirect
L’objectif du hook est de détecter quand une URL répond en 404, si c’est le cas on cherche le slug du post et si cela correspond à un poste en base de données on le redirige avec notre préfixe.
Cela fonctionne avec tout les préfixes !
function add_prefix() { global $wp; if(is_404()){ $url = home_url( $wp->request ); $segments = explode('/', parse_url($url, PHP_URL_PATH)); $last_segment = end($segments); $post_slug = get_page_by_path($last_segment, OBJECT, 'post'); if ($post_slug) { $post_id = $post_slug->ID; wp_redirect(( get_permalink($post_slug->ID) ), 301 ); } else { //on sait jamais } } } add_filter( 'template_redirect', 'add_prefix' );
Attention aux contenus et aux taxonomies perso
Quand on ajoute un préfixe personnalisé, cela va aussi s’ajouter sur les CPTs, ce qui n’est pas forcément souhaité.
Pour cela il faut simplement ajouter dans la déclaration du CPT l’argument with_front en false :
'rewrite' => array('slug' => 'url_cpt', 'with_front' => false),