Consejo rápido vincular automáticamente las manijas de Twitter con un filtro de contenido

Hace unos días estaba trabajando en una publicación de blog en mi blog personal sobre algunas historias recientes. Quería atribuir esas historias a la fuente / autor correspondiente, que en algunos casos, eran de Twitter. Comencé a vincular manualmente los identificadores de Twitter en el editor de WordPress cuando me di cuenta de que había una forma más sencilla de hacerlo que luego volvería y vincularía los identificadores de Twitter no vinculados en mi blog. Y la respuesta fue un simple filtro de contenido..

Nota: Esto no se está integrando con la API de Twitter / incluyendo tweets. Si desea aprender a hacerlo, vaya al excelente tutorial de Stephen sobre cómo crear un widget de tweets reciente.


Nuestro filtro inicial

Entonces, para realizar esta tarea, necesitamos hacer uso de dos cosas: los filtros de contenido de WordPress y las expresiones regulares (o Regex para abreviar). Primero te mostraré el código y luego lo revisaremos:

 función wptuts_twitter_handles ($ content) $ pattern = '| @ ([a-zA-Z0-9 _] *) |'; $ replace = @ $ 1 '; $ contenido = preg_replace ($ patrón, $ reemplazar, $ contenido); devolver $ contenido;  add_filter ("the_content", "wptuts_twitter_handles");

Bien, lo primero que hacemos es definir nuestra función., wptuts_twitter_handles () (Observe que agregué un prefijo para evitar anulaciones / errores). Esta función va a ser llamada en nuestro Añadir filtro() función, donde especificamos lo que queremos filtrar (o cambiar) y una función de devolución de llamada. Por eso nuestra función toma un argumento., $ contenido, cual es el contenido del post actual.

Nota 2: No soy un experto en Regex y Google me ayudó mucho. Voy a enlazar a las publicaciones que utilicé y explicaré las expresiones tan bien como pueda..

Para lograr este objetivo, usaremos una función PHP para procesar expresiones regulares llamada preg_replace (), que acepta un patrón que estamos buscando, con qué queremos reemplazar ese patrón y la cadena que queremos buscar. Devuelve la cadena modificada. Vamos a hacer una suposición aquí: cualquier cadena alfanumérica, con la inclusión del subrayado (_), precedida por un símbolo at (@) es un identificador de Twitter. Lo que queremos hacer es mirar a través de nuestro contenido en busca de cualquiera de estas cadenas y hacerlas hipervínculos a los perfiles de Twitter. El patrón (como se define en nuestra $ patrón variable) que usamos es esta: | @ ([a-zA-Z0-9 _] *) |. Las canalizaciones en cada extremo son simplemente delimitadores de principio y fin, y le dicen a nuestro programa que busque lo que hay entre ellos. El símbolo '@' se tomará literalmente, ya que está fuera del paréntesis. Dentro del paréntesis es donde ocurre la magia. La sección '[a-zA-Z0-9_]'le dice a nuestro programa que busque cualquier cadena con letras minúsculas y mayúsculas, dígitos y guiones bajos, en cualquier orden. El asterisco (*) dice que puede aparecer 0 o más veces (este es el método codicioso; podría ser reemplazado por '+', que es 1 o más). Queremos reemplazar el patrón con un enlace de Twitter al patrón, como se define en nuestra variable $ reemplazar. preg_replace () almacenará cada coincidencia en una variable numérica, que luego podemos hacer referencia en la cadena de reemplazo. Como solo buscamos un patrón, haremos referencia a $ 1.

Ahora haremos el reemplazo real, que hacemos en esta línea: $ contenido = preg_replace ($ patrón, $ reemplazar, $ contenido);. Esto reemplazará nuestro contenido actual con el contenido vinculado. Regresamos $ contenido ¡y bum! Nuestros identificadores de Twitter ahora están vinculados sin que tengamos que hacerlo manualmente.


Una cosa más…

Como dijo el famoso Colombo (y luego Steve Jobs) cuando estaba listo para terminar, solo tengo una cosa más que decirte. Si bien nuestro patrón actual de hecho detecta los manejadores de Twitter, también detectará las direcciones de correo electrónico, como lo hace aquí en mi blog:


Reemplaza no solo la dirección de correo electrónico, sino también la dirección de correo electrónico dentro del hipervínculo, rompiendo todo!

Debido a esto, necesitaremos una expresión regular que sea un poco más sofisticada, buscando cierto texto antes del símbolo '@' para asegurarnos de que no estamos vinculando una dirección de correo electrónico. El usuario de Twitter @shasmirj nos brinda una expresión muy agradable para hacerlo en su blog. Vamos a reemplazar $ patrón en nuestra función con esto:

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

Como puedes ver, esto es un poco más complicado. La esencia de lo que está sucediendo aquí es que queremos asegurarnos de algunas cosas antes de que se excluya el símbolo '@' (es decir, las cadenas alfanuméricas). Con Regex, el símbolo de la zanahoria (^) se utiliza para la exclusión. Lo que esencialmente dice este patrón es excluir cualquier cadena que tenga números o letras antes de la '@' mientras se comprueba correctamente los nombres de usuario de Twitter. La verificación alfanumérica es importante; aún queremos que el identificador de Twitter esté vinculado si, por ejemplo, lo ponemos entre paréntesis. Este es en realidad un poco mejor que el anterior, ya que verifica que el primer símbolo sea estrictamente una letra, que es un requisito para los manejadores de Twitter. La mejor parte de esta implementación es que excluirá el texto vinculado, por lo que si tiene publicaciones de blog más antiguas en las que vincula manualmente un identificador de Twitter, no se romperán.!

Eso significa que nuestra nueva función se ve así:

 función 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" );

Solo copia este chico malo y pégalo en tu funciones.php archiva y te irá bien! Y, como dato curioso, puedes usar el mismo patrón para detectar y vincular hashtags. Simplemente reemplace el símbolo '@' con un signo de número (#).