
Aujourd'hui je vous parle de WordPress !
Je viens juste de terminer une mini refonte d’un de mes sites perso, pas tant au niveau ambiance générale qu'au niveau détails. Il s'agit non seulement d'améliorations graphiques dans les contenus, mais aussi d'améliorations techniques.
J'ai viré pleins de plugins, j'ai écrit certaines fonctionnalités à la main, et pour le gros du truc, j'ai chipé à droite à gauche des snippets WordPress qui me manquaient.
Quand je suis confrontée à un problème technique, j'ai parfois l'impression que personne ne semble avoir eu ce problème avant moi ! Ce qui est rageant, mais qui me donne la niaque pour essayer de comprendre le problème et de le résoudre par moi-même. Bon, en général, je finis toujours par trouver une solution. Le gros avantage de WordPress, c'est sa communauté !
Voici donc quelques snippets rares de WordPress dont j'ai eu besoin et que j'ai eu du mal à trouver ou à fabriquer. J'espère que ça vous dépannera.
Supprimer PHPSESSID des URLs WordPress
Il peut arriver que certains plugins ajoutent à une URL le paramètre ?PHPSESSID=xxx
. C'est une pratique qui est assez marginale, et qui a pour principal défaut de créer des duplicate content dans les moteurs de recherche.
En effet, un moteur de recherce considèrera les deux URLs suivantes comme deux URLs différentes (or, en fait, c'est faux : c'est la même page qui est diffusée sous deux URLs différentes).
http://www.example.com/cinema/
http://www.example.com/cinema/?PHPSESSID=0be967382a8d9b66c837a2f1837c1f76
Assez embêtant ! Nous ne souhaitons pas être pénalisé par les moteurs de recherche, car nous ne souhaitons pas publier deux URLs différentes pour le même contenu. La véritable URL, l'URL « canonique » de cette page, c'est bien :
http://www.example.com/cinema/
Donc, la question est de savoir comment rediriger
http://www.example.com/cinema/?PHPSESSID=0be967382a8d9b66c837a2f1837c1f76
vers
http://www.example.com/cinema/
?
Yoast fournit une solution intéressante, mais outre le fait que nous n'avons pas tous accès au fichier vhost de notre hébergement, cette solution ne fonctionne pas telle quelle dans WordPress. Si vous le copiez dans le fichier header.php, vous aurez une erreur du genre Les headers de WordPress ont déjà été envoyés
(+ une belle erreur PHP qui flinguera votre site). Pas glop.
L'idée est donc d'exécuter ce script au chargement de WordPress, avant même que les headers ne soient envoyés. Pour cela on va utiliser le filtre add_action('init')
.
D'autre part, on va également filtrer le symbole ?
, grâce à une expression régulière. En effet, le code de Yoast tel quel supprime bien la chaîne PHPSESSID=… mais pas le point d'interrogation juste avant. Or, nous ne voulons pas non plus d'URL du genre :
http://www.example.com/cinema/?
Voici la solution à laquelle j'ai abouti, sur la base du code de Yoast, mais adapté pour WordPress. Pour l'utiliser, copiez/collez ce code le fichier functions.php
de votre thème :
// Supprimer les paramètres PHPSESSID des URLs et les rediriger vers l'URL canonique function remove_phpsessid(){ if (isset($_GET['PHPSESSID'])) { $requesturi = preg_replace('/&PHPSESSID=[^&]+/',"",$_SERVER['REQUEST_URI']); $requesturi = preg_replace('/[?]+/',"",$requesturi); $requesturi = preg_replace('/PHPSESSID=[^&]+/',"",$requesturi); header("HTTP/1.1 301 Moved Permanently"); header("Location: http://".$_SERVER['HTTP_HOST'].$requesturi); exit; } } if (!is_admin()) : add_action ('init', 'remove_phpsessid'); endif;
Vous pouvez tester : essayez d'accéder à l'URL avec le PHPSESSID, vous verrez, vous serez automatiquement redirigé vers l'URL sans PHPSESSID \m/
N.B. : la mention if (!is_admin())
permet de n'appliquer ce filtre que sur les pages qui n'appartiennent pas au tableau de bord de WordPress. En effet, certains plugins ou pages peuvent avoir besoin, dans l'admin seulement, de PHPSESSID. Nous n'y touchons donc pas, et nous réservons notre filtre aux pages publiques du site.
Edit du 6 août 2012 : comme l'a signalé Geoffrey, ce problème de PHPSESSID est lié à OVH. On peut, encore plus simplement, corriger le problème en ajoutant une ligne à son fichier .htaccess :
SetEnv SESSION_USE_TRANS_SID 0
Cette méthode a le mérite de s'adapter facilement à d'autres CMS que WordPress ! \m/
Mettre votre site WordPress en maintenance sans passer par .htaccess
Il existe plusieurs méthodes pour mettre un site WordPress en maintenance. Il y a le célèbre plugin Maintenance Mode, bien pratique si vous ne comprenez rien en PHP. Si vous avez des talents de web designer et d'intégrateur, vous pourrez même modifier vous même la page affichée pendant la maintenance. Il est même possible d'indiquer les URLs à laisser accessibles pendant la maintenance… Bref, c'est une solution clés en main sérieuse.
Il est aussi possible de passer par un code .htaccess. Bon, c'est sûrement là où je manque de compétences, car après avoir essayé plusieurs codes (dont celui donné par Perishable Press, *ma* source d'habitude irréprochable), je me suis rendue compte que, même si la page d'accueil de mon site était bel et bien inaccessible, si j'essayais d'accéder à une autre URL que la homepage, hé bien, celle-ci était bien accessible et passait outre la maintenance… Sauf que les CSS étaient bien inaccessibles, du coup ça donnait des pages sans styles. Bref, le fail complet.
Comme cela m'a un peu agacée, j'ai cherché à passer par du PHP afin de contourner ce problème, et d'arrêter de me creuser la tête à chaque maintenance de mon site !
Voici ce à quoi j'ai fini par aboutir. Attention : il faut que vous remplaciez plusieurs éléments !
- Remplacer la variable
$myIP
par votre adresse IP réelle (ainsi, vous et vous seul pourrez continuer à accéder à votre site pendant la maintenance) ; - Remplacer la variable
$correcturl
par l'URL de votre page de maintenance.
Ce code doit être placé dans le fichier functions.php de votre thème.
// Maintenance function my_maintenance(){ $actualurl= 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $correcturl = 'http://my.url.com/maintenance/'; $actualIP = $_SERVER['REMOTE_ADDR']; $myIP = '11.222.333.444'; // utilisez http://www.whatsmyip.org/ pour définir votre IP à vous if ($correcturl != $actualurl && $actualIP != $myIP) { header("HTTP/1.1 503 Service Unavailable"); header("Location: " . $correcturl); exit(); } } add_action ('init', 'my_maintenance');
En gros : si l'IP qui essaie d'accéder à mon site n'est pas mon IP, alors renvoie une erreur 503 et redirige l'utilisateur vers l'URL de maintenance.
Bien sûr, lorsque votre site ne sera plus en maintenance, il suffira de commenter la dernière ligne :
//add_action ('init', 'my_maintenance');
Lorsque vous aurez à nouveau besoin de mettre votre site WordPress en maintenance, il suffira de supprimer le commentaire :
add_action ('init', 'my_maintenance');
Simple et efficace.
Supprimer une ou plusieurs catégories de *toutes* les pages d'archives de WordPress
J'admets que c'est un cas un peu tiré par les cheveux, mais qui peut arriver : vous souhaiter filtrer une ou plusieurs catégories WordPress de *toutes* vos pages d'archives. Les billets de ces catégories-là ne doivent pas remonter dans les boucles par défaut de WordPress, par exemple parce que vous les appellerez vous-même dans des boucles secondaires.
C'est ce que j'ai fait sur les rubriques de mon autre site : d'un côté, on a la boucle normale de chaque rubrique (principalement des chroniques), et de l'autre, j'affiche, dans une deuxième boucle, uniquement les news rattachées à cette rubrique précise.
Ce code est une reprise de la méthode de Kathy Darling.
Attention : indiquer le ou les IDs des catégories à exclure de toutes les boucles dans la variables $excluded_id
!
/* Supprimer certaines catégories des boucles principales sur les archives de catégories http://themeshaper.com/forums/topic/filtering-one-category-from-index-loop#post-24705 */ add_action('pre_get_posts', 'kia_exclude_category' ); function kia_exclude_category(){ global $wp_query; $excluded_id = '-42,-535,-1300,-22,-37'; // IDs des catégories à exclure $wp_query->query_vars['cat'] = $excluded_id; }
Quel est l'avantage de cette version par rapport à l'utilisation de query_posts (par exemple query_posts( 'cat=-1,-2,-3' );
) ?
Tout simplement le fait que la méthode via add_action('pre_get_posts') ne casse pas la pagination des archives WordPress. Quand on utilise query_posts, toute la boucle est déjà chargée, et les filtres servent à supprimer de l'affichage certains posts (dans l'exemple query_posts( 'cat=-1,-2,-3' );
, on supprime les posts contenus dans les catégories 1, 2 et 3). Mais cela n'affecte pas la pagination ! Aussi, vous aurez toujours des pages en trop dans votre pagination, ce qui mène à des pages vides, puisque les posts censés s'y afficher ont été supprimés de la boucle.
C'est non seulement bête pour la navigation sur votre site (vos lecteurs risquent de se trouver fort désappointés de tomber sur plusieurs pages vides à la suite), mais c'est aussi une perte d'énergie pour l'optimisation de votre site pour le SEO.
Avec la méthode kia_exclude_category()
, tout est effectué au moment où la boucle est chargée et la pagination calculée. Ainsi, c'est propre et plus efficace puisque la pagination sera correcte. Ouf !
Voilà, j'espère que ces trois snippets WordPress vous seront aussi utiles qu'à moi ! Si cet article vous plaît, j'aurai une deuxième fournée de snippets perdus à partager avec vous :-)
29 mars 2012
Hello!
Merci pour cet article très instructif. Je suis une quiche en WordPress et il y a toutes les chances que j'aie un jour besoin de suivre tes conseils! Merci d'avoir partagé le fruit de tes recherches :)
29 mars 2012
Salut Kalys ! Merci pour ton commentaire, je suis ravie si mes expériences te sont utiles. N'hésite pas à me donner ton feedback, s'il y a des bugs ou même juste si ça fonctionne ^^
Je pense continuer à publier des articles sur les usages un peu inhabituels de WordPress ! Ça prendra vraiment forme avec la nouvelle version de mon blog, qui est imminente.
29 mars 2012
C'est vraiment une bonne idée, d'autant que la doc de qualité et en français n'est pas si courante :)
Je ne vais pas tester ça tout de suite, mais comme j'ai l'intention de créer un site sur wordpress d'ici peu (plus histoire de me faire la main que dans un but professionnel), je te tiendrai au courant!
29 mars 2012
Super, d'avance merci !
14 avril 2012
Yes, ça marche! Ca m'a évité une demi journée de travail, merci beaucoup pour ton code. A+ GU.