J'ai besoin d'ajouter le nom de l'auteur en tant que préfixe de sous-répertoire pour tous les messages et pages de l'utilisateur.
Par exemple:
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
Si je change la structure du permalien en: /%author%/%category%/%postname%/
cela fonctionne très bien pour afficher la publication d'un utilisateur mais pas la page d'un utilisateur.
Cependant, je ne sais pas si je peux faire quelque chose dans .htaccess
ou functions.php
qui me permettra de faire fonctionner le pages
de la même manière.
Je comprends que cela peut être accompli avec Multisite, mais j'essaie d'éviter de l'utiliser car le client ne veut pas l'utiliser.
De par son apparence, il existe un plugin pour atteindre exactement cela, alors vous évitez de rouler le vôtre.
Le plugin est: https://wordpress.org/plugins/permalinks-customizer/
Je l'ai installé pour tester qu'il fait ce que vous cherchez. Voici une capture d'écran qui montre ce que vous feriez:
Testé avec Wordpress 5.0.4
Le premier problème à résoudre est la valeur post_name pour les pages qui partageraient le même slug (par exemple about-me ).
La solution la plus simple que j'ai trouvée est d'ajouter l'auteur nicename (attention: dans ma solution, il ne devrait pas contenir de trait d'union!) Comme première partie du slug :
page à propos de moi nom_post pour john: john-about-me
page sur moi nom_post pour mary: mary-about-me
Ceci peut être réalisé en utilisant la fonction wp_insert_post_data filtre (voir wp_insert_post () fonction définie dans wp-includes/post.php ) lors de la création de la page:
// 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;
}
La prochaine étape sera de changer le wp rewrite rules pour refléter nos désirs (vous devez également mettre à jour les paramètres > permaliens ):
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;
}
La dernière étape consistera à modifier la valeur renvoyée lorsque le code demande un permalien de page (par exemple dans les menus).
Pour ce faire, nous devons utiliser le filtre page_link (situé dans get_page_link () fonction définie dans wp-includes/link-template.php ) ..
// 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 );
}
..mais cela ne fonctionnera pas si vous ne définissez pas false la propriété se_verbose_page_rules de $ wp_rewrite global instance; cela arrêtera parse_request () pour vérifier si un "mauvais" chemin de page correspondant correspond à:
add_action('init', 'disable_verbose_page_rule');
function disable_verbose_page_rule()
{
global $wp_rewrite;
$wp_rewrite->use_verbose_page_rules = false;
}
C'est tout. Pour être honnête, c'est la partie principale, mais ce sera un autre travail à faire, comme changer les règles de réécriture également pour tous les attachements/commentaires/flux/intégration des choses liées à une page et peut-être autre chose que je n'ai pas eu le temps de découvrir.
Ceci est mon premier message posté; J'espère que cela aidera quelqu'un, comme beaucoup d'autres m'ont aidé.