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.
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.
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:
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 (#).