Astuce lier automatiquement les poignées Twitter avec un filtre de contenu

Il y a quelques jours, je travaillais sur un blog sur mon blog personnel à propos de quelques histoires récentes. Je voulais attribuer ces histoires à la bonne source / auteur, qui dans certains cas, provenait de Twitter. J'ai commencé à relier manuellement les poignées Twitter dans l'éditeur WordPress lorsque je me suis rendu compte qu'il existait un moyen plus simple de le faire qui reviendrait en arrière et relierait toutes les poignées Twitter non liées de mon blog. Et la réponse était un simple filtre de contenu.

Remarque: Cela n’intègre pas l’API de Twitter / tweets. Si vous souhaitez apprendre à le faire, consultez le formidable tutoriel de Stephen sur la création d'un widget de tweets récents..


Notre filtre initial

Donc, pour accomplir cette tâche, nous devons utiliser deux choses: les filtres de contenu WordPress et les expressions régulières (ou Regex en abrégé). Je vais d'abord vous montrer le code et ensuite nous pourrons le parcourir:

 fonction wptuts_twitter_handles ($ content) $ pattern = '| @ ([a-zA-Z0-9 _] *) |'; $ remplacer = @ $ 1 '; $ content = preg_replace ($ pattern, $ replace, $ content); retourne $ contenu;  add_filter ("the_content", "wptuts_twitter_handles");

Très bien - la première chose à faire est de définir notre fonction, wptuts_twitter_handles () (remarquez que j'ai ajouté un préfixe pour empêcher les remplacements / erreurs). Cette fonction va être appelée dans notre add_filter () function, où nous spécifions ce que nous voulons filtrer (ou changer) et une fonction de rappel. Pour cette raison, notre fonction prend un argument, $ contenu, quel est le contenu du post actuel.

Note 2: Je ne suis pas un expert de Regex et Google m'a beaucoup aidé. Je vais créer un lien vers les messages que j'ai utilisés et expliquer les expressions aussi bien que possible.

Pour atteindre cet objectif, nous allons utiliser une fonction PHP pour le traitement des expressions régulières appelée preg_replace (), qui accepte un motif que nous recherchons, par quoi nous voulons remplacer ce motif et la chaîne que nous voulons rechercher. Il retourne la chaîne modifiée. Nous allons faire une hypothèse ici: toute chaîne alphanumérique, avec l’inclusion du trait de soulignement (_), précédée d’un symbole at (@) est un pseudo Twitter. Ce que nous voulons faire est de rechercher dans le contenu l'une de ces chaînes et de créer des hyperliens vers des profils Twitter. Le motif (tel que défini dans notre motif $ variable) que nous utilisons est ceci: | @ ([a-zA-Z0-9 _] *) |. Les tuyaux à chaque extrémité sont simplement des délimiteurs de début et de fin, indiquant à notre programme de rechercher ce qui les sépare. Le symbole '@' sera pris à la lettre puisqu'il est en dehors de la parenthèse. Dans la parenthèse se trouve la magie. La section '[a-zA-Z0-9_]'indique à notre programme de rechercher toute chaîne contenant des lettres minuscules et majuscules, des chiffres et des traits de soulignement, dans n'importe quel ordre. L'astérisque (*) indique qu'il peut se produire au moins 0 fois (il s'agit de la méthode gourmande; elle peut être remplacée par "+", ce qui correspond à 1 ou plus). Nous voulons remplacer le modèle par un lien Twitter vers le modèle, tel que défini dans notre variable $ remplacer. preg_replace () stockera chaque correspondance dans une variable numérique, que nous pourrons ensuite référencer dans la chaîne de remplacement. Comme nous ne cherchons qu’un seul motif, nous ferons référence à 1 $.

Maintenant, nous allons faire le remplacement réel, ce que nous faisons sur cette ligne: $ content = preg_replace ($ pattern, $ replace, $ content);. Cela remplacera notre contenu actuel par le contenu lié. Nous retournons $ contenu et boum! Nos poignées Twitter sont maintenant liées sans que nous ayons à le faire manuellement.


Encore une chose…

Comme l'a dit Colombo (et plus tard Steve Jobs) lorsqu'il était prêt à conclure, je n'ai qu'une dernière chose à vous dire. Bien que notre modèle actuel détecte en fait les poignées de Twitter, il détectera également les adresses électroniques, comme il le fait ici sur mon blog:


Il remplace non seulement l'adresse e-mail, mais l'adresse e-mail dans l'hyperlien, cassant tout!

Pour cette raison, nous avons besoin d'une expression régulière un peu plus sophistiquée, qui consiste à rechercher un texte avant le symbole "@" afin de nous assurer que nous ne lions pas d'adresse électronique. L'utilisateur de Twitter @shasmirj nous fournit une très belle expression pour le faire sur son blog. Remplaçons motif $ dans notre fonction avec ceci:

 $ pattern = '/ (?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)/i';

Comme vous pouvez le constater, ceci est un peu plus compliqué. L’essentiel de ce qui se passe ici est que nous voulons nous assurer que quelques éléments avant le symbole "@" (à savoir les chaînes alphanumériques) sont exclus. Avec Regex, le symbole de carotte (^) est utilisé pour l'exclusion. Ce modèle dit essentiellement qu’il faut exclure toute chaîne comportant des chiffres ou des lettres avant le «@» tout en vérifiant correctement les noms d’utilisateur Twitter. La vérification alphanumérique est importante. nous voulons toujours que le pseudo Twitter soit lié si, par exemple, nous le mettons entre parenthèses. Celui-ci est en réalité un peu meilleur que celui ci-dessus, car il vérifie que le premier symbole est strictement une lettre, ce qui est une exigence pour les descripteurs Twitter. La meilleure partie de cette implémentation est qu’elle exclura le texte lié. Ainsi, si vous avez d'anciennes publications de blog où vous liez manuellement un compte Twitter, celles-ci ne se briseront pas.!

Cela signifie que notre nouvelle fonction ressemble à ceci:

 fonction wptuts_twitter_handles ($ content) $ pattern = '/ (?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)/i'; $replace= @$1'; $content= preg_replace($pattern, $replace, $content); return $content;  add_filter( "the_content", "wptuts_twitter_handles" );

Il suffit de copier ce mauvais garçon et de le coller dans votre functions.php déposer et vous serez prêt à partir! Et, chose amusante, vous pouvez utiliser le même modèle pour détecter et lier les hashtags. Il suffit de remplacer le symbole "@" par un signe (#).