WordPress SEO, la pagination, et ses hooks : Rapidité contre Flexibilité

WordPress SEO, la pagination, et ses hooks : Rapidité contre Flexibilité

Je viens vous dire quelques mots à propos du très connu plugin WordPress SEO. Je ne vais pas parler SEO, désolé. Merci à bientôt.

Vous êtes restés ?

Ha vous êtes encore là , alors vous êtes développeur ou au moins intéressé par ce que je vais raconter. Attention je vais rà¢ler un peu … si si parfois il le faut. Je ne présente pas ce plugin, vous savez déjà à quoi il sert, nous savons le paramétrer, l’utiliser, et nous l’aimons, moi aussi.

Sauf que …

En développeur, j’ai dà» récemment intervenir sur le hook wp_title pour modifier le titre de la page dans sa balise <title> selon un certain cas. Il s’agit de modifier la pagination, la balise title et le H1 de la page seulement si le plugin « Better Post Pagination » est activé (Ne cherchez pas ce plugin, il n’est pas disponible, sauf dans ma dropbox :p).

Ce plugin ajoute ceci :

Meta Boxes
Meta Boxes de Better Post Pagination

Ensuite, si vous visitez un article dans lequel vous avez renseigné ces informations, alors le plugin va modifier la balise title en prenant la Xème ligne du premier textarea.

Puis va modifier aussi le H1 (modif conditionnelle sur single.php du thème) pour le cacher puis le remplacer par un span visible ayant CSSement la même tête afin de bluffer le visiteur (gniak gniak).

Vous me suivez ? Non, relisez …

Démo : http://www.phonandroid.com/test-htc-one-smartphone-android.html/3

Inspectez le titre H1 « TEST DU HTC ONE » et vous verrez qu’il s’agit bien d’un span et que le véritable H1 est caché mais contient à la place la 3ème ligne de notre 2ème meta box ! Même chose pour la balise titre et la box 1.

C’est quoi le rapport avec WordPress SEO ?

J’y viens, ce site phonandroid utilise le plugin WordPress SEO et dans le paramètrage du plugin on peut modifier le formatage du titre de la page, excellent !

Le plugin hook sur wp_title, je ne regarde même pas tellement c’est logique. Par contre, surprise, en sortie, le plugin sort un wpseo_title ! Il a modifié le nom du hook ! Pourquoi ?? Réponse :

Moui ça se tient, un peu bancal mais ça se tient. Si je veux vraiment le titre sans son formatage (pourquoi ??), alors je déhook, mais je ne modifie pas le nom d’un hook … bref, première surprise, passons …

Quoi un autre problème ?

Oui, après avoir réussi à hooker le titre, je devais donc maintenant modifier le contenu de l’option title-post selon mon cas d’article ayant cette boite renseignée ou pas.

Il ne faut pas oublier de gérer cette rétrocompatibilité pour les articles pour lesquels nous n’avons pas encore modifié cette meta box.

Aussi, le site désirait ne plus afficher le nombre de page dans son title, vous savez, le « Page 2 sur 5 », mais seulement si on a rempli la box.

Première pensée, je vais hooker option_title-post (qui correspond au hook « option_{$option} » ) et ainsi, selon mon cas, je modifie la valeur retournée en ajoutant de nouveau %%page%% puisque nous l’avons supprimé par défaut.

BAM rien n’est modifié, je passe bien dans le hook, j’ai vérifié avec un bon gros wp_die des familles, mais pourtant la valeur n’est pas modifiée. Je teste moi même avec un echo get_option( ‘title-post’ ); et là , c’est bien modifié !

Je pense alors à un problème de priorité et/ou de hooks qui sont déclenchés trop tôt. et là j’entends le plugin me dire « tu chauffes, tu chauffes » hein quoi ??

REBAM je m’aperçois que WordPress SEO n’utilise pas de hook pour déclarer sa globale $wpseo_front alors qu’il devrait le faire au moins sur plugins_loaded , c’est le premier hook déclenché après le chargement des plugins, la bonne pratique de WordPress veut que tout soit au moins hooké la dessus, bref, c’est pas fait …

Donc je ne peux pas déhooker (oui voilà le problème de ne pas hooker !) … et pire, WordPress SEO va charger dès cet instant ses options dans une variable de sa classe mise en globale ! HAAAA

Voilà donc pourquoi le hook option_ ne fonctionne pas, il n’est pas appelé quand je le pensais ! Le plugin aurait dà» faire un get_option() au moment où il a besoin de lire les options, mais non. J’ai alors encore demandé à Yoast pourquoi il a fait comme ça, réponse :

Je cite « This is actually faster« . Je me demande (et je ferais le test, promis) de combien on est gagnant à aller charger ses options dans une variable d’une classe globale, contre aller lire un tableau global de WordPress, je rapelle qu’un get_option() d’une option de plugin chargé normalement ne fait pas de requête, jamais ! Le gain serait-il vraiment super infime ? Fort possible …

Je lui ai dont répondu que la limite entre rapidité et flexibilité avait été dépassée. Une des puissances de WordPress est justement cette flexibilité grà¢ce aux hooks qui nous permettent d’intervenir un peu quand on veut. Là , il a cassé ça, vraiment dommage …

Amaury semble être d’accord :

Une solution ?

Oui ! J’ai tout de même réussi à faire ce que je voulais. Il m’a fallu aller toucher à cette globale de cette façon :

global $wpseo_front;

$wpseo_front->options['title-post'] = str_replace( '%%title%%', '%%title%% %%page%%', $wpseo_front->options['title-post'] );
WordPress SEO Hacked

Je remplace le tag %%title%% en ajoutant le tag %%page%% et voilà , c’est fait, mais quelle galère, quel temps perdu à débugger, comprendre, détourner … pfff

Conclusion

  • Toujours hooker vos actions, déclarations, au moins sur plugins_loaded , ce hook sera déclenché après le chargement de tous les plugins.
  • Ne recréez pas de nouveaux hooks si WordPress a le sien, réutilisez le !
  • Utilisez les fonctions de WordPress au lieu de recréer les vôtres ou alors réutilisez dans votre fonction les hooks de WordPress.
  • Laissez WordPress déclencher ses hooks aux bons moments, évitez donc de créer une variable globale avec vos options, on perds en flexibilité !!

Merci !

Vous aimez ? Partagez !


Réagir à cet article

220 caractères maximum