Si vous avez un WordPress MU, vous vous êtes sûrement rendu compte de l’apparition d’un niveau « /blog » dans l’url de vos articles du site principal.
Voici comment modifier ou supprimer ce niveau.
NOTA : par abus de langage je parle de « WordPress MU », mais il s’agit de la fonction réseau introduite par WordPress 3.
[update] 21-02-2013
Bon, sans déconner, il y a plus de deux ans, je racontais pas mal de conneries quand même (ça m’arrive encore parfois, rassurez-vous). Le conseil du jour : pas de flush_rules()
à l’init, à chaque fois c’est un lourd enregistrement en base de donnée, ça coute cher. Solution alternative : j’ai découvert cet article chez l’ami WPChannel. Je n’ai pas personnellement testé son astuce mais cela semble fonctionner (du moins elle marchait encore en avril 2012 ^^), et c’est beaucoup plus économe en ressources :)
Pour la petite histoire
Depuis quelques jours je m’essaye à WordPress MU sur un site de test. Le système est assez sympa et diffère légèrement d’un WordPress classique. Mais, quelle ne fût pas ma surprise en voyant un 404 apparaitre sur mes articles (WTF!?). Petit tour direct dans l’onglet Permaliens, je remarque le « /blog » apparu devant les champs texte (WTF!?x2) et je met à jour. Retour en front-end, rafraichissement, plus de 404 o/. Mais là, ce « blog » apparait dans l’url (WTF!?x3).
Après un petit tour dans un fichier core de WP, il s’avère que ce « /blog » est « hard codé » et imposé au blog principal si l’on a choisi de faire son réseau avec des « niveaux » dans l’url au lieu d’utiliser des sous-domaines (Quoi?! o_O ). Quelques recherches sur le net plus tard, je ne suis pas le seul à vouloir me débarrasser de cet indésirable, et tout ce que j’ai à me mettre sous la dent est un vieux rapport de « bug » dont la solution consiste à modifier 2 fichiers core.
Bien sûr, tout ceci ne me plait pas du tout et j’ai, à priori, mieux à proposer avec un hack.
Modifier ou supprimer l’étage indésirable
Pour cela nous allons utiliser la classe WP_Rewrite de WordPress pour réécrire la structure de permalien après son enregistrement dans les réglages.
Méthode : créer un hook à l’initialisation qui va :
- vérifier que l’on est bien sur le blog principal d’un multisite,
- récupérer la structure de permalien enregistrée,
- rechercher la chaine « /blog/ »,
- si la chaine est trouvée au début du permalien, elle est remplacée par ce que l’on veut,
- réinjecter la nouvelle structure,
- mettre à jour le tout (enfin, un coup de flush quoi).
A mettre dans le fichier functions.php de votre thème :
0102030405060708091011
function get_rid_of_blog_rewrite_rule() {
global $wp_rewrite;
$permalink_structure = $wp_rewrite->permalink_structure;
if (strpos($permalink_structure, '/blog/') === 0) {
$wp_rewrite->set_permalink_structure( str_replace('/blog/', '/', $permalink_structure) );
$wp_rewrite->flush_rules();
}
}
global $current_blog;
if ( is_multisite() && isset($current_blog) && $current_blog->blog_id == 1 )
add_action('init', 'get_rid_of_blog_rewrite_rule');
Avec la condition if ( is_multisite() && isset($current_blog) && $current_blog->blog_id == 1 )
on vérifie que nous sommes bien sur le blog principal d’un multisite, afin de ne pas impacter les autres blogs.
Ensuite c’est la variable globale $wp_rewrite qui nous donne accès à la classe WP_Rewrite de WordPress.
$wp_rewrite->permalink_structure
permet de récupérer la structure de permalien sous forme de chaine (« /blog/%postname%-%post_id%/ » par exemple).
Avec strpos($permalink_structure, '/blog/') === 0
nous vérifions si la chaine « /blog/ » se trouve au début de la structure. Deux choses importantes : les deux « / » autour de « blog », c’est pour éviter de créer une erreur avec par exemple « /blogosphere/le-nouveau-blog-de-toto », qui deviendrait « /osphere/le-nouveau–de-toto ». Le second point est le « === » qui est très important, car si « /blog/ » n’est pas trouvé, strpos renverra false, qui est équivalent à 0 (mais pas strictement égal à 0), et donc la suite sera lancée inutilement.
$wp_rewrite->set_permalink_structure( )
permet d’enregistrer la nouvelle structure.
Remarque : avec str_replace('/blog/', '/', $permalink_structure)
on va carrément supprimer le niveau « /blog ». Si vous préférez seulement le remplacer par « /news », alors nous aurons str_replace('/blog/', '/news/', $permalink_structure)
.
Dernier point, et pas des moindres : $wp_rewrite->flush_rules();
sans quoi la structure ne sera pas mise à jour.
See ya!
NOTA : si vous faites cette opération sur un blog existant, n’oubliez pas le paquet de redirections 301 qui va avec.
Commentaires
Commentaire de Blog seo.
Bien joué, justement je me serai heurté au problème, au moins maintenant je sais comment faire ;)
Commentaire de webguy.
Bonjour
pourquoi te demander cela à toi plutôt qu’un autre? Bah… ce sont les mystères du Net!
Amateur dans l’utilisation de WP, j’ai mélangé un site professionnel qui apparait comme le blog principal de mon WP réseau et… un site de nature moins… profane!
Bref, désirant proposer un forum tout en en réservant l’accès aux membres inscrits, j’ai installé Ajax Login, Member access etc… mais… je dois autoriser l’inscription globalement au réseau et non à chaque blog de celui-ci.
Du coup en cliquant sur inscription dans le forum je suis redirigé vers une page de mon blog principal dont l’entête révèle mon site pro.
Rien de grave en soi sauf que je suis frustré de ne pouvoir trouver une solution élégante à ce problème.
Si tu as une idée…
J’espère avoir été clair. De toute façons je laisse le blog tel quel dans les prochaines heures. Merci d’avance pour ta réponse.
Bien cordialement
Guy
Commentaire de Greg.
Bonjour.
Je pense en effet à une méthode, et plutôt que de tenter de l’expliquer, autant « faire un dessin ».
A utiliser dans le header de ta page de connexion :
123456
La variable $f va récupérer la valeur de « fbl » dans l’url via $_GET et ainsi créer une classe pour la balise body de ta page. $f sera un entier entre 0 et… autant de blogs que tu as, donc on aura les classes « blog3 », « blog1″, blog5 », etc.
Attention aux hacks visant à insérer du code à cet endroit de ta page, le (int) et esc_attr() me paraissent être le minimum pour nettoyer les valeurs indésirables. Pour plus de sécurité encore, on pourrait utiliser switch ou if et attribuer des valeur fixes à la classe. Cela me semble inutile cependant.
Ensuite il faut prévoir dans ton style css des règles spéciales qui vont changer le fond de ta bannière par exemple, selon cette classe.
1
Ensuite il faut ajouter ce « fbl » à tous les liens menant vers ta page de connexion.
12345678
$blog_id est le numéro attribué à chaque blog par WordPress (1 pour le blog principal il me semble).
Avec cette fonction on va filtrer l’url des liens menant à ta page de login, en y ajoutant le paramètre « fbl » dont la valeur sera le numéro du blog où il se trouve.
Voilà, je n’ai pas du tout testé, je te délivre ça brut de décoffrage donc j’espère que je n’ai pas fait d’erreur et que cela va fonctionner.
A+
[edit] = je me rend compte qu’il ne sera pas évident de rajouter la première partie du code dans le head de la page de connexion, il y a sûrement un meilleur moyen en utilisant plutôt un
add_action('pre_get_posts', ... )
et en ajoutant la classe du body viaadd_filter( 'body_class', ... )
. Ce serait à étudier plus finement, mais en 5 minutes là… Je commenterais à nouveau dès que j’ai mieux ;)Commentaire de tititoto.
Salut,
Merci pour cette astuce, malgré un effet de bord chez moi. Je classe mes posts par categorie. ton script a donc (si j’ai bien compris) réecrit mes url dans la base de donnée. Les urls d’accès au post marche bien. Mais j’utilse le code suivant pour récuperer les posts d’une categorie particuliere:
1234
le lien a bien été modifié sans le ‘/blog/’ mais provoque une erreur 404, si je rajoute à la main /blog/ dans l’url j’y ai bien accès.
J’ai donc en attendant de trouver plus élégant fait un moche
1
Commentaire de Mick.
J’ai le mempe problème.
Il n’y a pas une solution plus efficace ?
Commentaire de argone.
J’ai le même problème que ci-dessus, mais je ne peux toucher à ma CSS vu que je suis sous WP.com
y a-t’il un moyen de changer le nom de son blog « principal » ?
Commentaire de Greg.
Bonjour argone.
Aucune idée malheureusement, je n’ai jamais utilisé WP.com
A+
Commentaire de Avner.
Salut,
J’aime beaucoup ton astuce… Il me manquait un seul aspect pour que ce soit parfait, le multilingue mais bon c’est une autre histoire…Autant dans ce cas trouver un mot clé qui aille autant en anglais qu’en français par exemple.
Commentaire de Greg.
Salut, et merci.
Comme précisé en début d’article, l’astuce est à éviter, il vaut mieux aller voir celle de WPChannel.
A+