WordPress tiene la fea buena costumbre de que si pones una URL en el contenido de una entrada o comentario aparece como texto plano, no se convierte automáticamente en un enlace, no sale «manita» al pasar el cursor por encima vamos.
Esto es así, principalmente, para evitar el spam en comentarios, pero también viene inactivo por defecto para el contenido de tus entradas y páginas. O sea, que poner una url así en el contenido: https://ayudawp.com no la convierte automáticamente en esto otro https://ayudawp.com.
Hay una función, incluída en el fichero /wp-includes/formatting.php
, denominada make_clicable
, que viene inactiva por defecto.
Por supuesto, puedes activarla modificando el archivo pero ya sabrás que eso nunca es recomendable, pues en cada actualización (y recuerda que ahora son automáticas) perderías la personalización.
Así que, si queremos que las URLs sean activas y no texto plano tenemos que hacerlo de otro modo …
Índice de contenidos
… Autoenlazar URLs con plugin …
Hay un plugin ya veterano que hace exactamente esto, que toda URL que aparezca en el contenido, por defecto, se convierta en un hiperenlace, que sea «clicable«. Lo mejor de todo es que dispone de una página de ajustes que nos permite controlar bastantes aspectos de esta funcionalidad, como si queremos que las URLs enlazadas abran siempre en nueva ventana o si también queremos que las URLs sean enlaces en los comentarios … o no.
Solo tienes que instalar Auto-hyperlink URLs, configurarlo a tu gusto y ya lo tienes.
… Autoenlazar URLs mediante función …
Por otro lado, también puedes añadir una función a tu plugin de personalizaciones para conseguir lo mismo, esta:
//Autoenlazar URLs function _make_url_clickable_cb($matches) { $ret = ''; $url = $matches[2]; if ( empty($url) ) return $matches[0]; // quita lo que sobra [.,;:] de la URL if ( in_array(substr($url, -1), array('.', ',', ';', ':')) === true ) { $ret = substr($url, -1); $url = substr($url, 0, strlen($url)-1); } return $matches[1] . "<a href=\"$url\" rel=\"nofollow\">$url</a>" . $ret; } function _make_web_ftp_clickable_cb($matches) { $ret = ''; $dest = $matches[2]; $dest = 'http://' . $dest; if ( empty($dest) ) return $matches[0]; // removed trailing [,;:] from URL if ( in_array(substr($dest, -1), array('.', ',', ';', ':')) === true ) { $ret = substr($dest, -1); $dest = substr($dest, 0, strlen($dest)-1); } return $matches[1] . "<a href=\"$dest\" rel=\"nofollow\">$dest</a>" . $ret; } function _make_email_clickable_cb($matches) { $email = $matches[2] . '@' . $matches[3]; return $matches[1] . "<a href=\"mailto:$email\">$email</a>"; } function make_clickable($ret) { $ret = ' ' . $ret; // aquí se usan arras para mayor velocidad $ret = preg_replace_callback('#([\s>])([\w]+?://[\w\\x80-\\xff\#$%&~/.\-;:=,[email protected]\[\]+]*)#is', '_make_url_clickable_cb', $ret); $ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,[email protected]\[\]+]*)#is', '_make_web_ftp_clickable_cb', $ret); $ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret); // aquí no hay array para que se ejecute al final, para limpiar enlaces accidentales $ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret); $ret = trim($ret); return $ret; }
Guardas los cambios y ya lo tienes.
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!
Gracias por el código. Tengo una duda, así cómo está el código, al picar en el enlace ¿se abriría en una nueva pestaña, o accedería a él en la misma?
No. Para que los enlaces se abran automáticamente en una nueva pestaña deberías modificar la línea 13 y agregar target=»_blank» como atributo a la etiqueta A.
Para que los enlaces FTP se abran en otra pestaña deberás hacer lo mismo en la línea 28.
Fernando, lo que no me queda claro es cuándo se ejecutaría esta función, no veo ningún add_action o add_filter. Creo que para que esté completo el código haría falta la siguiente línea:
add_filter( ‘the_content’, ‘make_clickable’ );
Gracias