Rask Tips Koble automatisk Twitter-håndtak med et innholdsfilter

For noen dager siden jobbet jeg med et blogginnlegg på min personlige blogg om noen nyere historier. Jeg ønsket å tildele disse historiene til riktig kilde / forfatter, som i noen tilfeller var fra Twitter. Jeg begynte å manuelt knytte Twitter-håndtak i WordPress-redaktøren når jeg skjønte at det var en enklere måte å gjøre dette på, som deretter ville gå tilbake og knytte noen sammenknyttede Twitter-håndtak på bloggen min. Og svaret var et enkelt innholdsfilter.

Merk: Dette integrerer ikke med Twitter API / inkludert tweets. Hvis du vil lære hvordan du gjør det, kan du gå videre til Stephens gode opplæring om å lage en nylig tweets widget.


Vårt første filter

Så for å oppnå denne oppgaven må vi benytte seg av to ting: WordPress-innholdsfiltre og Regular Expressions (eller Regex for kort). Først skal jeg vise koden og så kan vi gå gjennom det:

 funksjon wptuts_twitter_handles ($ content) $ pattern = '| @ ([a-zA-Z0-9 _] *) |'; $ erstatte = @ $ 1 '; $ content = preg_replace ($ mønster, $ erstatte, $ innhold); returnere $ content;  add_filter ("the_content", "wptuts_twitter_handles");

Ok, det første vi gjør er å definere vår funksjon, wptuts_twitter_handles () (Legg merke til at jeg har lagt til et prefiks for å forhindre overrides / feil). Denne funksjonen kommer til å bli kalt i vår add_filter () funksjon, der vi spesifiserer hva vi vil filtrere (eller endre) og en tilbakeringingsfunksjon. Av den grunn tar vår funksjon ett argument, $ innhold, som er innholdet i gjeldende innlegg.

Notat 2: Jeg er ikke en Regex-ekspert, og Google hjalp meg mye. Jeg vil koble til innlegg som jeg brukte og forklare uttrykkene så godt jeg kan.

For å nå dette målet, skal vi bruke en PHP-funksjon for behandling av vanlige uttrykk som kalles preg_replace (), som aksepterer et mønster vi leter etter, hva vi vil erstatte det mønsteret med, og strengen vi vil søke. Den returnerer den endrede strengen. Vi kommer til å ta en antagelse her: En hvilken som helst alfanumerisk streng, med inkludering av understrekingen (_), foran et symbol på symbolet (@) er et Twitter-håndtak. Det vi ønsker å gjøre er å se gjennom innholdet vårt for noen av disse strengene og gjøre dem til hyperkoblinger til Twitter-profiler. Mønsteret (som definert i vår $ mønster variabel) vi bruker er dette: | @ ([A-zA-Z0-9 _] *) |. Rørene i begge ender begynner ganske enkelt og slutter avgrensere, og forteller at programmet vårt skal se etter hva som er mellom dem. Symbolet '@' vil bli tatt bokstavelig siden det ligger utenfor parentesen. Inne i parentes er hvor magien skjer. Seksjonen '[A-zA-Z0-9_]'forteller at programmet vårt ser etter en streng med små og store bokstaver, siffer og understreker, i hvilken som helst rekkefølge. Asterisken (*) sier at det kan forekomme 0 eller flere ganger (dette er den grådige metoden, den kan erstattes av '+', som er 1 eller flere). Vi ønsker å erstatte mønsteret med en Twitter-kobling til mønsteret, som definert i vår variabel $ erstatte. preg_replace () vil lagre hver kamp i en numerisk variabel, som vi kan referere til i erstatningsstrengen. Siden vi bare ser etter et mønster, refererer vi med $ 1.

Nå skal vi gjøre den faktiske erstatningen, som vi gjør på denne linjen: $ content = preg_replace ($ mønster, $ erstatte, $ innhold);. Dette vil erstatte vårt nåværende innhold med det koblede innholdet. Vi returnerer $ innhold og boom! Våre Twitter-håndtak er nå koblet uten at vi må gjøre det manuelt.


En ting til…

Som Colombo (og senere Steve Jobs) famously sa da han var klar til å pakke opp, har jeg bare en ting til å fortelle deg. Selv om vårt nåværende mønster faktisk oppdager Twitter-håndterer, vil det også oppdage e-postadresser, slik det gjør her på bloggen min:


Den erstatter ikke bare e-postadressen, men e-postadressen i hyperkoblingen, bryter alt!

På grunn av dette trenger vi et vanlig uttrykk som er litt mer sofistikert, og ser etter bestemt tekst før '@' -symbolet for å sikre at vi ikke kobler en e-postadresse. Twitter bruker @ shasmirj gir oss et veldig godt uttrykk for å gjøre det på bloggen hans. La oss erstatte $ mønster i vår funksjon med dette:

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

Som du kan se, er dette litt mer komplisert. Kjennetegnet av det som skjer her er at vi vil sørge for at noen ting før '@' symbolet (nemlig alfanumeriske strenger) er utelukket. Med Regex brukes gulrot-symbolet (^) for utelukkelse. Hva dette mønsteret i hovedsak sier, er å ekskludere en streng som har tall eller bokstaver før '@' mens du fortsatt sjekker for Twitter brukernavn. Alfanumerisk kontroll er viktig; vi vil fortsatt at Twitter-håndtaket skal knyttes hvis vi for eksempel legger det i parentes. Denne er faktisk litt bedre enn den ovenfor, da den sjekker for å sørge for at det første symbolet er strengt et brev, som er et krav for Twitter-håndtak. Den beste delen av denne implementeringen er at den vil utelukke koblet tekst, så hvis du har eldre blogginnlegg der du manuelt knytter et Twitter-håndtak, vil de ikke bryte!

Det betyr at vår nye funksjon ser slik ut:

 funksjon 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" );

Bare kopier denne dårlige gutten og lim den inn i din functions.php fil og du vil være god å gå! Og som et morsomt faktum kan du bruke det samme mønsteret til å oppdage og knytte hashtags. Bare erstatt symbolet '@' med et tallskilt (#).