Eliminarea paginilor părinte din permalink

23 mar. 2015, 15:25:39
Vizualizări: 14.4K
Voturi: 8

Întrebări similare au fost adresate anterior, dar niciun răspuns nu se potrivește perfect.

Am: site.com/pagina-parinte/pagina-copil și aș dori să am: site.com/pagina-copil

Deci vreau să am exclusiv permalink-uri cu adâncime 1, fără a folosi meniul personalizat, dar totuși să păstrez ierarhizarea paginilor în vizualizarea "Toate paginile" din admin și cu părinte/ordine în atributele paginii.

Soluția trebuie să funcționeze automat, deci nu schimbarea manuală a permalink-urilor pe fiecare pagină cu plugin-ul "Custom Permalinks".

Am nevoie exact de asta și sunt sigur că e posibil cu câteva linii de cod în functions.php, pe care le-am găsit în alte locuri dar doar pentru articole (pentru a elimina categoria), dar care nu funcționează pentru pagini pentru a elimina părintele.

Iată un astfel de cod, care poate fi modificat să funcționeze pentru pagini?

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 ) {
        // Asigură-te că folosim aceeași categorie de început ca generatorul de permalink-uri
        usort( $cats, '_usort_terms_by_ID' ); // sortează după ID
        $category = $cats[0]->slug;
        if ( $parent = $cats[0]->parent ) {
            // Dacă există categorii părinte, colectează-le și înlocuiește-le în link
            $parentcats = get_category_parents( $parent, false, '/', true );
            // str_replace() nu este cea mai bună soluție dacă poți avea duplicate:
            // exemplu.com/luxemburg/luxemburg/ va fi redus la exemplu.com/
            // Dar dacă nu te aștepți la asta, ar trebui să funcționeze
            $permalink = str_replace( $parentcats, '', $permalink );
        }
    }
    return $permalink;
}
0
Toate răspunsurile la întrebare 2
1

o căutare rapidă arată un alt subiect pe StackExchange despre acest lucru, care a folosit acest cod pentru a curăța permalink-ul părinților/strămoșilor:

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 );

Puteți găsi acea discuție aici: Eliminarea slug-ului părinte din URL pentru tipul de postare personalizat

23 mar. 2015 15:59:42
Comentarii

Acest lucru face lucruri amuzante :) Cele care au un părinte încă apar cu părinții, dar cele fără părinte duc la 404 :D Și de asemenea, se vorbește despre tipuri personalizate de postări, iar Sebastian la final pune aceeași întrebare ca mine, cum să faci să funcționeze pentru pagini, care a rămas fără răspuns. Așa că încă sper că va găsi un răspuns.

Sofian Sofian
23 mar. 2015 16:52:22
0

tl;dr = Instalează plugin-ul gratuit "Permalinks Customizer". Setează "PostTypes Settings" pentru Pagini la '%postname%' și apoi editează paginile pentru a modifica Permalink-urile respective. Am testat acest lucru cu un scenariu de pagini ierarhice și ne-ierarhice și funcționează fără nicio dificultate.


Răspunsul mai detaliat
Scenariul OP se bazează pe o pagină generică și, în opinia mea, acesta prezintă o provocare semnificativă, posibil imposibilă, deoarece soluția trebuie să se aplice anonim. Adică, nu există un "declanșator" sau "mâner" predictibil care poate fi folosit pentru a crea o rescriere care să genereze o cerere validă. Un tip de postare personalizat ar putea funcționa (sau nu), dar OP a exclus această opțiune. Abordarea propusă de OP poartă și riscul paginilor duplicate. Ținând cont de toate acestea, s-ar putea sugera că abordarea propusă de OP nu este nici utilă, nici înțeleaptă - dar voi lăsa acest lucru pentru ca OP să judece singur.

OP are dreptate; răspunsul propus de Nicu nu funcționează deoarece această linie are efectul de a construi URI-ul din părintele original.

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

Am lucrat (fără succes) la un filtru care să îndeplinească cerințele OP. Îl ofer aici în caz că ar putea fi util pentru altcineva. Pentru referință, toate testele mele au fost făcute cu Permalink-uri setate la "Post Name", și de fiecare dată când am ajustat un filtru, am reîmprospătat pagina de Permalink-uri. Am creat patru pagini: Ancestry (Strămoși), Parents (Părinți) (părinte = 'Ancestry'), Children (Copii) (părinte = 'Parents') și Transportation (Transport) (fără părinte).

Am descoperit că crearea URI-ului este partea ușoară, sau cel puțin pare ușoară. Această alternativă (în functions.php) funcționează:

function wpse_182006_pages_permalink( $link, $post_id) {

    // obține post_type și evaluează
    $posttype = get_post_field( 'post_type', $post_id, 'display' );
    if ($posttype !== 'page'){
        return link;
    }

    // construiește URI-ul din 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 );

Atât pagina "Ancestry" cât și "Transportation" se deschid normal.
Paginile "Parents" și "Children" (fiecare cu o pagină 'părinte') duc la erori 404.
Dacă te uiți la Request Query (vezi mai jos), este evident că eroarea 404 este generată deoarece WordPress interpretează "page" ca "post", și nu există un astfel de post. Reține că ID-ul postării nu este folosit în interogările eșuate. Poate aceasta este cheia pentru o rescriere reușită, dar a fost dincolo de abilitățile mele.

Pentru referință, acestea sunt detaliile "request" pentru "Ancestry":
Matched Query = 'pagename=ancestory&page='
Matched Rule = '(.?.+?)(?:/([0-9]+))?/?$'
Main query = 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

Prin comparație, acestea sunt detaliile "request" pentru "Children":
Matched Query = 'name=children&page='
Matched Rule = '([^/]+)(?:/([0-9]+))?/?$'
Main query = 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


FWIW, prin setarea permalink-ului în acest fel, permalink-ul nu este editabil. Înainte:
imaginea de descriere

După:
imaginea de descriere

4 sept. 2018 08:02:02