Qualche giorno fa stavo lavorando a un post sul mio blog personale su alcune storie recenti. Volevo attribuire quelle storie alla fonte / all'autrice corretta, che in alcuni casi proveniva da Twitter. Ho iniziato a collegare manualmente gli handle di Twitter nell'editor di WordPress quando ho capito che c'era un modo più semplice per fare ciò che sarebbe poi tornato indietro e collegare qualsiasi handle Twitter non collegato sul mio blog. E la risposta era un semplice filtro dei contenuti.
Nota: Questo non si integra con l'API di Twitter / inclusi i tweet. Se vuoi imparare come farlo, vai al fantastico tutorial di Stephen su Creazione di un widget Tweets recenti.
Quindi, per svolgere questo compito, dobbiamo fare uso di due cose: i filtri dei contenuti di WordPress e le espressioni regolari (o Regex in breve). Per prima cosa ti mostrerò il codice e poi potremo esaminarlo:
function wptuts_twitter_handles ($ content) $ pattern = '| @ ([a-zA-Z0-9 _] *) |'; $ replace = @ $ 1 '; $ content = preg_replace ($ pattern, $ replace, $ content); restituire $ content; add_filter ("the_content", "wptuts_twitter_handles");
Bene - la prima cosa che facciamo è definire la nostra funzione, wptuts_twitter_handles ()
(nota che ho aggiunto un prefisso per prevenire sostituzioni / errori). Questa funzione verrà chiamata nella nostra add_filter ()
funzione, dove specifichiamo cosa vogliamo filtrare (o modificare) e una funzione di callback. Per questo motivo la nostra funzione accetta un argomento, $ content
, qual è il contenuto del post corrente.
Nota 2: Non sono un esperto di Regex e Google mi ha aiutato molto. Collegherò ai post che ho usato e spiegherò le espressioni nel miglior modo possibile.
Per raggiungere questo obiettivo, useremo una funzione PHP per elaborare le espressioni regolari chiamate preg_replace ()
, che accetta un modello che stiamo cercando, con cui vogliamo sostituire quel modello e la stringa che vogliamo cercare. Restituisce la stringa modificata. Qui faremo un'assunzione: qualsiasi stringa alfanumerica, con l'inclusione del carattere di sottolineatura (_), preceduta da un simbolo at (@) è un handle di Twitter. Quello che vogliamo fare è guardare attraverso i nostri contenuti per ognuna di queste stringhe e renderli collegamenti ipertestuali ai profili Twitter. Il modello (come definito nel nostro $ pattern
variabile) che usiamo è questo: | @ ([A-zA-Z0-9 _] *) |
. I tubi su entrambe le estremità stanno semplicemente iniziando e finendo i delimitatori, dicendo al nostro programma di cercare cosa c'è tra di loro. Il simbolo '@' verrà preso alla lettera poiché è al di fuori della parentesi. All'interno della parentesi è dove avviene la magia. La sezione '[A-zA-Z0-9_]
'dice al nostro programma di cercare qualsiasi stringa con lettere minuscole e maiuscole, cifre e trattini bassi, in qualsiasi ordine. L'asterisco (*) dice che può verificarsi 0 o più volte (questo è il metodo goloso, potrebbe essere sostituito da '+', che è 1 o più). Vogliamo sostituire il pattern con un link Twitter al pattern, come definito nella nostra variabile $ sostituire
. preg_replace ()
memorizzerà ogni corrispondenza in una variabile numerica, che possiamo quindi fare riferimento nella stringa di sostituzione. Poiché stiamo cercando un solo modello, faremo riferimento a $ 1
.
Ora faremo la sostituzione effettiva, che facciamo su questa linea: $ content = preg_replace ($ pattern, $ replace, $ content);
. Questo sostituirà il nostro contenuto attuale con il contenuto linkato. Torniamo $ content
e boom! Le nostre maniglie di Twitter sono ora collegate senza che noi dobbiamo farlo manualmente.
Come Colombo ha affermato (e in seguito Steve Jobs), quando era pronto per concludere, ho solo un'altra cosa da dirvi. Mentre il nostro schema attuale rileva in realtà gli handle di Twitter, rileverà anche gli indirizzi email, come fa qui sul mio blog:
Per questo motivo, avremo bisogno di un'espressione regolare che sia un po 'più sofisticata, cercando un determinato testo prima del simbolo' @ 'per assicurarci che non stiamo collegando un indirizzo email. L'utente di Twitter @shasmirj ci offre una bella espressione per farlo sul suo blog. Sostituiamo $ pattern
nella nostra funzione con questo:
$ modello = '/ (?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)/i';
Come puoi vedere, questo è un po 'più complicato. L'essenza di ciò che sta succedendo qui è che vogliamo essere sicuri di alcune cose prima che il simbolo '@' (cioè le stringhe alfanumeriche) siano esclusi. Con Regex, il simbolo carota (^) viene utilizzato per l'esclusione. Ciò che questo schema in sostanza dice è di escludere qualsiasi stringa che abbia numeri o lettere prima del '@' mentre controlla ancora correttamente i nomi utente di Twitter. Il controllo alfanumerico è importante; vogliamo comunque che l'handle di Twitter sia collegato se, per esempio, lo mettiamo tra parentesi. Questo è in realtà un po 'meglio di quello sopra, in quanto controlla che il primo simbolo sia strettamente una lettera, che è un requisito per gli handle di Twitter. La parte migliore di questa implementazione è che escluderà il testo collegato, quindi se hai post precedenti del blog in cui colleghi manualmente un handle di Twitter, quelli non si interromperanno!
Ciò significa che la nostra nuova funzione ha questo aspetto:
function 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" );
Copia questo cattivo ragazzo e incollalo nel tuo functions.php file e sarai a posto! E come un fatto divertente, è possibile utilizzare lo stesso modello per rilevare e collegare hashtag. Basta sostituire il simbolo '@' con un segno di cancelletto (#).