För några dagar sedan arbetade jag på ett blogginlägg på min personliga blogg om några senaste historier. Jag ville tillskriva dessa historier till rätt källa / författare, som i vissa fall var från Twitter. Jag började manuellt länka Twitter-handtag i WordPress-redigeraren när jag insåg att det var ett enklare sätt att göra detta som då skulle gå tillbaka och länka alla olänkta Twitter-handtag på min blogg. Och svaret var ett enkelt innehållsfilter.
Notera: Detta integreras inte med Twitter API / inklusive tweets. Om du vill lära dig hur du gör det, gå vidare till Stephens stora handledning om att skapa en ny tweets widget.
För att uppnå denna uppgift behöver vi därför använda två saker: WordPress-innehållsfilter och regelbundna uttryck (eller Regex för korta). Först ska jag visa koden och då kan vi gå igenom det:
funktion wptuts_twitter_handles ($ content) $ pattern = '| @ ([a-zA-Z0-9 _] *) |'; $ ersätt = @ $ 1 '; $ content = preg_replace ($ mönster, $ ersätt, $ innehåll); returnera $ content; add_filter ("the_content", "wptuts_twitter_handles");
Okej - det första vi gör är att definiera vår funktion, wptuts_twitter_handles ()
(märker jag lagt till ett prefix för att förhindra överskridanden / fel). Den här funktionen kommer att ringas in i vårt add_filter ()
funktion där vi anger vad vi vill filtrera (eller ändra) och en återuppringningsfunktion. Därför tar vår funktion ett argument, $ innehåll
, vilket är innehållet i det aktuella inlägget.
Anteckning 2: Jag är inte en Regex-expert och Google har hjälpt mig mycket. Jag kommer att länka till inlägg som jag använde och förklara uttrycket så väl som möjligt.
För att uppnå detta mål ska vi använda en PHP-funktion för att behandla regelbundna uttryck som heter preg_replace ()
, som accepterar ett mönster vi letar efter, vad vi vill ersätta det mönstret med, och strängen vi vill söka. Den returnerar den modifierade strängen. Vi kommer att göra ett antagande här: en alfanumerisk sträng, med införandet av underskriften (_), föregås av en at-symbol (@) ett Twitter-handtag. Vad vi vill göra är att titta igenom vårt innehåll för någon av dessa strängar och göra dem hyperlänkar till Twitter-profiler. Mönstret (enligt definitionen i vår $ mönster
variabel) vi använder är detta: | @ ([A-zA-Z0-9 _] *) |
. Rören i varje ände börjar helt enkelt och slutar avgränsare och berättar för vårt program att leta efter vad som finns mellan dem. Symbolen '@' kommer att tas bokstavligen eftersom den ligger utanför parentesen. Inne i parentesen är där magiken händer. Sektionen '[A-zA-Z0-9_]
'berättar för vårt program att leta efter en sträng med små och stora bokstäver, siffror och understreck, i vilken ordning som helst. Asterisken (*) säger att det kan inträffa 0 eller flera gånger (det här är den giriga metoden, den kan ersättas med "+", som är 1 eller mer). Vi vill ersätta mönstret med en Twitter-länk till mönstret, enligt definitionen i vår variabel $ ersätta
. preg_replace ()
lagrar varje match i en numerisk variabel, som vi sedan kan hänvisa till i ersättningssträngen. Eftersom vi bara söker efter ett mönster ska vi referera till $ 1
.
Nu ska vi göra den faktiska ersättningen, som vi gör på den här raden: $ content = preg_replace ($ mönster, $ ersätt, $ innehåll);
. Detta kommer att ersätta vårt nuvarande innehåll med det länkade innehållet. Vi återvänder $ innehåll
och boom! Våra Twitter-handtag är nu länkade utan att vi måste göra det manuellt.
Som Colombo (och senare Steve Jobs) berömd sa när han var redo att sätta upp, har jag bara en sak att berätta. Även om vårt nuvarande mönster faktiskt upptäcker Twitter-hanteringar, kommer det också att upptäcka e-postadresser, som det gör här på min blogg:
På grund av detta behöver vi ett regelbundet uttryck som är lite mer sofistikerat och letar efter viss text före symbolen "@" för att se till att vi inte länkar till en e-postadress. Twitter-användare @ shasmirj ger oss ett riktigt fint uttryck för att göra det på hans blogg. Låt oss ersätta $ mönster
i vår funktion med detta:
$ pattern = '/ (?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)/i';
Som du kan se är det lite mer komplicerat. Vad som händer här är att vi vill se till att några saker före symbolen "@" (nämligen alfanumeriska strängar) är uteslutna. Med Regex används gulrotsymbolen (^) för uteslutning. Vad det här mönstret i huvudsak säger är att utesluta en sträng som har siffror eller bokstäver före "@" medan du fortfarande kontrollerar användarnamn på Twitter. Den alfanumeriska kontrollen är viktig; vi vill fortfarande att Twitter-handtaget ska länkas om vi till exempel lägger den i parentes. Den här är faktiskt lite bättre än den ovanstående, eftersom den kontrollerar att den första symbolen är strikt ett brev, vilket är ett krav på Twitter-handtag. Det bästa med denna implementering är att det kommer att utesluta länkad text, så om du har äldre blogginlägg där du manuellt kopplar ett Twitter-handtag, kommer de inte att bryta!
Det betyder att vår nya funktion ser ut så här:
funktion 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" );
Kopiera bara den här dåliga pojken och klistra in den i din functions.php fil och du kommer vara bra att gå! Och som ett roligt faktum kan du använda samma mönster för att upptäcka och länka hashtags. Byt bara '@' -symbolen med ett taltecken (#).