Verwenden Sie den Anzeigenamen des Autors in der Permalink-Struktur für Seiten und Beiträge


8

Ich muss den Autorennamen als Unterverzeichnispräfix für alle Beiträge und Seiten des Benutzers hinzufügen.

Zum Beispiel:

example.com/johndoe/ //The author page for John Doe
example.com/johndoe/category/test-post/ //Test post by user John Doe
example.com/johndoe/test-page/ //Test page by user John Doe

Wenn ich die Permalink-Struktur in ändere, /%author%/%category%/%postname%/funktioniert dies einwandfrei, um den Beitrag eines Benutzers anzuzeigen, jedoch nicht die Seite eines Benutzers.

Ich bin mir jedoch nicht sicher, ob ich etwas tun kann .htaccessoder functions.phpob ich das pagesauf die gleiche Weise zum Laufen bringen kann.

Ich verstehe, dass dies mit Multisite erreicht werden kann, aber ich versuche, dies zu vermeiden, da der Client es nicht verwenden möchte.


Sie sagen "das funktioniert gut". Was ist also falsch?
Zufällig

Es funktioniert gut für Beiträge, aber nicht für Seiten. Ich werde die Frage bearbeiten, um dies klarer zu machen.
bigmike7801

1
Wird jeder Benutzer die gleichen "Seiten" haben? Es wäre hilfreich, wenn Sie die gewünschte Komplettlösung detaillierter beschreiben würden, aber es scheint ohne weiteres möglich zu sein, mit einer programmatischen Lösung, die Kategorien oder andere Taxonomien oder benutzerdefinierte Beitragstypen und benutzerdefinierte Taxonomien umfasst, besser abzuschneiden, als sich auf Seiten zu verlassen.
CK MacLeod

1
Hoppla, wurde von dem wiederbelebten alten Frage-Syndrom geschnüffelt. Was ich für StackExchanging auf meinem Handy bekomme. Ich gehe davon aus, dass diese Frage bis auf weiteres tot ist ...
CK MacLeod

1
Mit dem Gesagten: utilitydient zu Informationszwecken und wird selten geändert, in diesem Fall fast statische Daten, die für den "Benutzer" oder "Autor" spezifisch sind; archivalsind die Daten, die der "Benutzer" im Laufe der Zeit eingegeben hat.
Nathan Powell

Antworten:


1

Wie es aussieht, gibt es ein Plugin, um genau dies zu erreichen. Sparen Sie sich also das Rollen eines eigenen Plugins.

Das Plugin lautet: https://wordpress.org/plugins/permalinks-customizer/

Ich habe es installiert, um zu testen, ob es das tut, wonach Sie suchen. Hier ist ein Screenshot, der zeigt, was Sie tun würden:

Permalinks Customizer


0

Getestet mit Wordpress 5.0.4

Das erste Problem, das gelöst werden muss, ist der Wert post_name für Seiten, die denselben Slug verwenden würden (z. B. about-me ).

Die einfachere Lösung , die ich gefunden ist , den Autor hinzufügen nicename (Achtung: in meiner Lösung soll es keinen Bindestrich enthält) als ersten Teil des Rohlings:

About-Me-Seite Post-Name für John: John-About-Me
About-Me-Seite Post-Name für Mary: Mary-About-Me

Dies kann mithilfe des Filter- Hooks wp_insert_post_data (siehe in wp-include / post.php definierte Funktion wp_insert_post () ) beim Erstellen der Seite erreicht werden:

// about-me => <author_name>-about-me

add_filter( 'wp_insert_post_data', 'custom_wp_insert_post_data', 99, 2);

function custom_wp_insert_post_data($data, $postarr)
{
    if(($data["post_type"] == "page") && ($data["post_status"] != "auto-draft"))
    {
        $author_name = get_the_author_meta( 'user_nicename', $data["post_author"] );

        // insert
        if($postarr['hidden_post_status'] == "draft") {         
            $data["post_name"] = $author_name . "-" . $data["post_name"];               
        }
        // update
        else {
            list($author, $slug) = explode("-", basename($data["post_name"]), 2 );

            // wrong permalink -> prepend the author
            if($author != $author_name) { 
                $data["post_name"] = $author_name . "-" . $data["post_name"];
            }
        }
    }

    return $data;   
}

Der nächste Schritt besteht darin, die Regeln für das Umschreiben von wp zu ändern , um unseren Wünschen gerecht zu werden (Sie müssen auch die Einstellungen> Permalinks aktualisieren ):

add_filter('page_rewrite_rules', 'custom_page_rewrite_rules');

function custom_page_rewrite_rules($page_rewrite) 
{   
    // remove : john/about-me  => index.php?pagename=john/about-me
    unset($page_rewrite["(.?.+?)(?:/([0-9]+))?/?$"]);   

    // add: john/about-me  => index.php?pagename=john-about-me
    $page_rewrite["(.?.+?)/(.+?)/?$"] = "index.php?pagename=\$matches[1]-\$matches[2]";

    return $page_rewrite; 
}

add_filter('post_rewrite_rules',  'custom_post_rewrite_rules'); 

// posts have the /%author%/%category%/%postname% permalink structure
function custom_post_rewrite_rules($post_rewrite) 
{   
    // remove: john/about-me  => index.php?category_name=about-me&author_name=john
    unset($post_rewrite["([^/]+)/(.+?)/?$"]);

    return $post_rewrite; 
}

Der letzte Schritt besteht darin, den zurückgegebenen Wert zu ändern, wenn der Code nach einem Seitenpermalink fragt (z. B. in Menüs).
Dazu müssen wir den page_link- Filter-Hook verwenden (der sich in der in wp-includes / link-template.php definierten Funktion get_page_link () befindet ).

// http://www.example.com/john-about-me => http://www.example.com/john/about-me
add_filter('page_link', 'custom_page_link', 99, 3);

function custom_page_link( $link, $ID, $sample ) 
{
    list($author, $slug) = explode("-", basename($link), 2 );

    return ( site_url() . "/" . $author . "/" . $slug  );   
}

..aber es wird nicht funktionieren , wenn Sie nicht setzt auf falsche der use_verbose_page_rules Eigenschaft $ wp_rewrite globaler Instanz; Dadurch wird parse_request () gestoppt , um zu überprüfen, ob ein "falscher" übereinstimmender Seitenpfad vorhanden ist:

add_action('init', 'disable_verbose_page_rule');

function disable_verbose_page_rule()
{
    global $wp_rewrite;

    $wp_rewrite->use_verbose_page_rules = false;            
}

Das ist alles. Nun, um ehrlich zu sein, ist dies der Hauptteil, aber es wird eine andere Arbeit sein, wie das Ändern der Umschreiberegeln auch für alle Anhänge / Kommentare / Feeds / Einbettungssachen, die mit einer Seite verknüpft sind und möglicherweise etwas sind sonst hatte ich nicht genug Zeit zu entdecken.

Dies ist mein erster Beitrag; Ich hoffe, es wird jemandem helfen, wie viele andere mir geholfen haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.