Rimuovere le pagine genitore dai permalink

23 mar 2015, 15:25:39
Visualizzazioni: 14.4K
Voti: 8

Domande simili sono state poste in precedenza, ma nessuna risposta si adatta bene.

Ho: site.com/pagina-genitore/pagina-figlia e vorrei avere: site.com/pagina-figlia

Quindi voglio avere esclusivamente permalink con profondità 1, senza utilizzare il menu personalizzato ma comunque "gerarchizzando" le mie pagine nella vista admin di tutte le pagine e con genitore/ordine negli attributi della pagina.

La soluzione deve anche funzionare automaticamente, quindi non modificare i permalink su ogni pagina con il plugin "Custom Permalinks".

Questo è ciò di cui ho bisogno, e sono sicuro che sia possibile con poche righe di codice nel functions.php, che ho trovato altrove ma solo per i post per rimuovere la categoria, ma non funziona per le pagine per rimuovere il genitore.

Questo è il codice, che forse può essere modificato per funzionare con le pagine?

add_filter( 'post_link', 'remove_parent_cats_from_link', 10, 3 );
function remove_parent_cats_from_link( $permalink, $post, $leavename ) {
    $cats = get_the_category( $post->ID );
    if ( $cats ) {
        // Assicuriamoci di usare la stessa categoria iniziale del generatore di permalink
        usort( $cats, '_usort_terms_by_ID' ); // ordina per ID
        $category = $cats[0]->slug;
        if ( $parent = $cats[0]->parent ) {
            // Se ci sono categorie genitore, raccoglile e sostituiscile nel link
            $parentcats = get_category_parents( $parent, false, '/', true );
            // str_replace() non è la soluzione migliore se puoi avere duplicati:
            // example.com/lussemburgo/lussemburgo/ verrà ridotto a example.com/
            // Ma se non ti aspetti questo, dovrebbe funzionare
            $permalink = str_replace( $parentcats, '', $permalink );
        }
    }
    return $permalink;
}
0
Tutte le risposte alla domanda 2
1

una rapida ricerca mostra un altro argomento su stackexchange riguardo questo, e utilizzava questo codice per ripulire il permalink dei genitori/antenati:

function wpse_101072_flatten_hierarchies( $post_link, $post ) {
    if ( 'page' != $post->post_type )
        return $post_link;

    $uri = '';
    foreach ( $post->ancestors as $parent ) {
        $uri = get_post( $parent )->post_name . "/" . $uri;
    }

    return str_replace( $uri, '', $post_link );
}
add_filter( 'post_type_link', 'wpse_101072_flatten_hierarchies', 10, 2 );

Puoi trovare quella discussione qui: Rimuovere lo slug genitore dall'URL su un custom post type

23 mar 2015 15:59:42
Commenti

Fa cose divertenti :) Quelli che hanno un genitore vengono ancora mostrati con i genitori, ma quelli senza genitore portano a un 404 :D Inoltre si parla di custom post types, e alla fine Sebastian fa la stessa domanda che ho fatto io, su come farlo funzionare per le pagine, che è rimasta senza risposta. Quindi spero ancora che troverà una soluzione.

Sofian Sofian
23 mar 2015 16:52:22
0

tl;dr = Installa il plugin gratuito "Permalinks Customizer". Imposta "PostTypes Settings" per le Pagine a '%postname%' e poi modifica le pagine per adattare i rispettivi Permalink di conseguenza. Ho testato questo scenario con pagine gerarchiche e non gerarchiche, e funziona senza alcuna difficoltà.


La risposta più lunga
Lo scenario dell'OP si basa su una pagina generica e, a mio avviso, questo presenta una sfida significativa, possibilmente impossibile, poiché la soluzione deve applicarsi in modo anonimo. Cioè, non c'è un "trigger" o "handle" prevedibile che può essere utilizzato per creare una riscrittura che creerà una richiesta valida. Un tipo di post personalizzato potrebbe funzionare (o no), ma l'OP ha escluso questa opzione. L'approccio proposto dall'OP comporta anche il rischio di pagine duplicate. Considerando tutto ciò, si potrebbe suggerire che l'approccio proposto dall'OP non sia né utile né saggio - ma lascerò che l'OP giudichi da solo.

L'OP ha perfettamente ragione; la risposta proposta da Nicu non funziona perché questa riga ha l'effetto di costruire l'uri dalla genitorialità originale.

$uri = get_post( $parent )->post_name . "/" . $uri;

Ho lavorato (senza successo) a un filtro che soddisfacesse i requisiti dell'OP. Lo offro qui nel caso possa essere utile a qualcun altro. Per riferimento, tutti i miei test sono stati eseguiti con Permalink impostati su "Nome articolo", e ogni volta che ho modificato un filtro, ho aggiornato la pagina dei Permalink. Ho creato quattro pagine. Ancestry (genitore), Parents (genitore = 'Ancestry'), Children (genitore = 'Parents'), e Transportation (nessun genitore).

Ho scoperto che creare l'uri è la parte facile, o almeno sembra facile. Questa alternativa (in functions.php) funziona:

function wpse_182006_pages_permalink( $link, $post_id) {

    // ottieni il post_type e valuta
    $posttype = get_post_field( 'post_type', $post_id, 'display' );
    if ($posttype !== 'page'){
        return link;
    }

    // costruisci l'uri dallo slug
    $slugname = get_post_field( 'post_name', $post_id, 'display' );
    $slugname = $slugname."/";
    $link = home_url($slugname);
    return $link;

}

add_filter( 'page_link', 'wpse_182006_pages_permalink', 10, 3 );

Sia la pagina "Ancestry" che "Transportation" si aprono normalmente.
Le pagine "Parents" e "Children" (ciascuna con una pagina 'genitore') generano errori 404.
Se guardi la Query di Richiesta (riferimento sotto), è evidente che il 404 è generato perché WordPress interpreta la "pagina" come un "articolo", e nessun articolo del genere esiste. Nota che l'ID del post non viene utilizzato nelle query fallite. Forse questa è la chiave per una riscrittura riuscita, ma era oltre le mie capacità.

Per riferimento, questi sono i dettagli della "richiesta" per "Ancestry":
Query Corrispondente = 'pagename=ancestory&page='
Regola Corrispondente = '(.?.+?)(?:/([0-9]+))?/?$'
Query Principale = SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND (wp_posts.ID = '46') AND wp_posts.post_type = 'page' ORDER BY wp_posts.post_date DESC

In confronto, questi sono i dettagli della "richiesta" per "Children":
Query Corrispondente = 'name=children&page='
Regola Corrispondente = '([^/]+)(?:/([0-9]+))?/?$'
Query Principale = SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_name = 'parents' AND wp_posts.post_type = 'post' ORDER BY wp_posts.post_date DESC


Per quel che vale, impostando il permalink in questo modo, il permalink non è modificabile. Prima:
descrizione immagine qui

Dopo:
descrizione immagine qui

4 set 2018 08:02:02