web-dev-qa-db-fra.com

Supprimer des pages hiérarchiques dans le permalien

J'ai plusieurs pages mises en place dans une hiérarchie sur mon site. Actuellement, les pages et les URL du site ressemblent à ceci.

Page name        | Current URL           | Preferred URL 
-----------------|----------------------------------------
Page AAA         | /pageAAA/             | /pageAAA/
|-- Page BBB     | /pageAAA/pageBBB/     | /pageBBB/
Page CCC         | /pageCCC/             | /pageCCC/
Page DDD         | /pageDDD/             | /pageDDD/
|-- Page EEE     | /pageDDD/pageEEE/     | /pageEEE/

Je souhaite supprimer la hiérarchie des pages de l'URL et utiliser simplement le nom de la page. Actuellement, ce n'est pas un problème pour les "POSTS" car j'ai défini le "Permalink" sur /%postname%/

Edit: La raison pour laquelle je veux faire cela est; J'importe un site existant dans WordPress. Le site existant a une hiérarchie pour les pages (menu) mais une structure d'URL plate. Je ne sais pas si cela présente un avantage supplémentaire pour le référencement, mais je souhaite que la structure de l'URL reste identique à celle de l'ancien site.

5
Steven smethurst

Je serais curieux de savoir si quelqu'un peut trouver une meilleure solution à cela. Voici ce que je suis venu avec:

function wpse_91821_flatten_page_paths( $wp ) {
    if ( false !== strpos( $wp->matched_query, 'pagename=' ) && isset( $wp->query_vars['pagename'] ) && $wp->query_vars['pagename'] && false === strpos( $wp->query_vars['pagename'], '/' ) ) {
        if ( !get_page_by_path( $wp->query_vars['pagename'] ) ) {
            $page = get_posts( array(
                'name'        => $wp->query_vars['pagename'],
                'post_type'   => 'page',
                'post_status' => 'publish',
                'numberposts' => 1
            ) );
            if ( $page && isset( $page[0] ) ) {
                $wp->query_vars['pagename'] = get_page_uri( $page[0]->ID );
                $wp->request = $wp->query_vars['pagename'];
            }
        }
    }
}
add_action( 'parse_request', 'wpse_91821_flatten_page_paths', 5 );

Ce que je fais ici, c'est intercepter parse_request et si c'est une demande de nom de page et que le nom de page ne contient pas de "/", je vérifie ensuite si je peux trouver un message portant le nom correct. Si je trouve une page, je définis la requête var, ce qui permet au reste de la chaîne de demandes de continuer normalement, car WordPress pense - la demande est la requête hiérarchique complète.

Vous souhaitez également ajouter un filtre à post_type_link pour que vos liens soient générés correctement (sinon, ils continueront d'être hiérarchiques).

1
Matthew Boynes
function wpse_91821_flatten_page_paths( $wp ) {
    if ( false !== strpos( $wp->matched_query, 'pagename=' ) && isset( $wp->query_vars['pagename'] ) && $wp->query_vars['pagename'] && false === strpos( $wp->query_vars['pagename'], '/' ) ) {
        if ( !get_page_by_path( $wp->query_vars['pagename'] ) ) {
            $page = get_posts( array(
                'name'        => $wp->query_vars['pagename'],
                'post_type'   => 'page',
                'post_status' => 'publish',
                'numberposts' => 1
            ) );
            if ( $page && isset( $page[0] ) ) {
                $wp->query_vars['pagename'] = get_page_uri( $page[0]->ID );
                $wp->request = $wp->query_vars['pagename'];
            }
        }
    }
}
add_action( 'parse_request', 'wpse_91821_flatten_page_paths', 5 );

function custom_permalinks_page_link( $permalink, $post_id ) {
    if ( empty( $post_id ) ) return $permalink;
    $post = get_post( $post_id );
    return home_url( $post->post_name . "/");
}
add_filter( 'page_link', 'custom_permalinks_page_link', 10, 2 );

function custom_rewrite() {
    add_rewrite_rule('^([^/]+)?', 'index.php?pagename= $matches[1]', 'top');
}
add_action( 'init', 'custom_rewrite' );

À partir de la version 4.7, vous devez contourner la requête parse: car use_verbose_page_rules est déclenché et l'appel get_page_by_path vérifie les parents page et leur présence dans l'url (!) - cette vérification inattendue pourrait être évitée en ajoutant un evil space as in https://github.com/weaveworks/wordepress/blob/master/plugin/wordepress/wordepress.php#L91

Ceci est bien sûr très fragile et devrait probablement être évité :)

Cette présentation contient peut-être une meilleure réponse, mais je n'ai pas été en mesure de la comprendre: https://www.slideshare.net/MikeSchinkel/hardcore-url-routing-2014?next_slideshow=1

0
ptica

Je ne changerais pas le comportement de permalien de page. Une solution beaucoup plus simple et plus sûre consiste à définir une hiérarchie de page plate (si vous voulez vraiment qu'elle soit plate).

Si vous voulez avoir une hiérarchie dans le menu, vous pouvez toujours l'avoir - vous pouvez créer un menu personnalisé et l'afficher avec la fonction wp_nav_menu.

0
Krzysiek Dróżdż