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.