Een paar dagen geleden werkte ik aan een blogpost op mijn persoonlijke blog over enkele recente verhalen. Ik wilde die verhalen aan de juiste bron / auteur toeschrijven, die in sommige gevallen van Twitter afkomstig was. Ik begon Twitter-handleidingen handmatig te koppelen in de WordPress-editor toen ik me realiseerde dat er een eenvoudigere manier was om dit te doen en vervolgens terug te gaan naar en link te maken tussen alle niet-gekoppelde Twitter-handles op mijn blog. En het antwoord was een eenvoudig inhoudsfilter.
Notitie: Dit is niet geïntegreerd met de Twitter API / inclusief tweets. Als je wilt leren hoe dat te doen, ga dan naar Stephen's geweldige tutorial over Creating a Recent Tweets Widget.
Dus om deze taak te volbrengen, moeten we twee dingen doen: WordPress-inhoudsfilters en reguliere expressies (of kortweg Regex). Eerst zal ik je de code laten zien en dan kunnen we het doornemen:
functie wptuts_twitter_handles ($ content) $ pattern = '| @ ([a-zA-Z0-9 _] *) |'; $ replace = @ $ 1 '; $ content = preg_replace ($ patroon, $ vervangen, $ inhoud); return $ inhoud; add_filter ("the_content", "wptuts_twitter_handles");
Oke - het eerste wat we doen, is onze functie definiëren, wptuts_twitter_handles ()
(merk op dat ik een voorvoegsel heb toegevoegd om overrides / errors te voorkomen). Deze functie wordt gebeld in onze add_filter ()
functie, waarbij we specificeren wat we willen filteren (of wijzigen) en een callback-functie. Om die reden neemt onze functie één argument, $ inhoud
, welke is de inhoud van het huidige bericht.
Opmerking 2: Ik ben geen Regex-expert en Google heeft me veel geholpen. Ik zal linken naar berichten die ik heb gebruikt en de uitdrukkingen zo goed mogelijk uitleggen.
Om dit doel te bereiken, gaan we een PHP-functie gebruiken voor het verwerken van reguliere expressies die worden aangeroepen preg_replace ()
, die een patroon accepteert waarnaar we op zoek zijn, waar we dat patroon mee willen vervangen, en de reeks die we willen doorzoeken. Het geeft de gewijzigde string terug. We gaan hier een aanname doen: elke alfanumerieke reeks, inclusief het onderstrepingsteken (_), voorafgegaan door een at-symbool (@), is een Twitter-handle. Wat we willen doen, is onze inhoud doorzoeken op een van deze reeksen en deze hyperlinks naar Twitter-profielen laten maken. Het patroon (zoals gedefinieerd in onze $ patroon
variabele) die we gebruiken is dit: | @ ([A-zA-Z0-9 _] *) |
. De pijpen aan beide uiteinden zijn eenvoudig begin en einde scheidingstekens, vertellend ons programma om te zoeken naar wat er tussenin zit. Het '@'-symbool wordt letterlijk genomen omdat het buiten de haakjes valt. Binnen de haakjes is waar de magie gebeurt. Het deel '[A-zA-Z0-9_]
'vertelt ons programma dat elke string met kleine letters en hoofdletters, cijfers en underscores in elke volgorde moet worden gezocht. Het sterretje (*) zegt dat het 0 of meer keer kan voorkomen (dit is de hebzuchtige methode, deze kan worden vervangen door '+', wat 1 of meer is). We willen het patroon vervangen door een Twitter-link naar het patroon, zoals gedefinieerd in onze variabele $ vervangen
. preg_replace ()
zal elke match opslaan in een numerieke variabele, die we dan kunnen verwijzen in de vervangende string. Omdat we slechts op zoek zijn naar één patroon, zullen we ernaar verwijzen $ 1
.
Nu doen we de daadwerkelijke vervanging, wat we op deze regel doen: $ content = preg_replace ($ patroon, $ vervangen, $ inhoud);
. Dit zal onze huidige inhoud vervangen door de gelinkte inhoud. We komen terug $ inhoud
en boem! Onze Twitter-handles zijn nu gekoppeld zonder dat we dit handmatig hoeven te doen.
Zoals Colombo (en later Steve Jobs) beroemd zei toen hij klaar was om af te ronden, heb ik nog een ding om je te vertellen. Hoewel ons huidige patroon Twitter-handles detecteert, detecteert het ook e-mailadressen, zoals hier op mijn blog:
Daarom hebben we een reguliere expressie nodig die iets geavanceerder is, op zoek naar bepaalde tekst vóór het '@' -symbool om ervoor te zorgen dat we geen e-mailadres koppelen. Twitter-gebruiker @shasmirj geeft ons een heel leuke uitdrukking om dat op zijn blog te doen. Laten we vervangen $ patroon
in onze functie hiermee:
$ pattern = '/ (?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)/i';
Zoals u kunt zien, is dit een beetje ingewikkelder. De kern van wat hier gebeurt, is dat we ervoor willen zorgen dat een paar dingen vóór het '@'-symbool (namelijk alfanumerieke reeksen) worden uitgesloten. Met Regex wordt het wortelsymbool (^) gebruikt voor uitsluiting. Wat dit patroon in feite zegt, is elke reeks met cijfers of letters vóór de '@' uit te sluiten, terwijl nog steeds correct wordt gecontroleerd op Twitter-gebruikersnamen. De alfanumerieke controle is belangrijk; we willen nog steeds dat de Twitter-koppeling wordt gekoppeld als we deze bijvoorbeeld tussen haakjes plaatsen. Deze is eigenlijk een beetje beter dan die hierboven, omdat het controleert of het eerste symbool strikt een letter is, wat een vereiste is voor Twitter-handles. Het beste van deze implementatie is dat gekoppelde tekst wordt uitgesloten, dus als je oudere blogposts hebt waar je handmatig een Twitter-handle linkt, zullen die niet breken!
Dat betekent dat onze nieuwe functie er zo uitziet:
functie 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" );
Kopieer deze slechte jongen en plak het in jouw functions.php bestand en je zult goed zijn om te gaan! En als een leuk feit, kunt u hetzelfde patroon gebruiken om hashtags te detecteren en koppelen. Vervang gewoon het '@'-symbool door een cijferbord (#).