
Internet está lleno de snippets para WordPress, muchos copiados de un sitio a otro sin revisar, algunos con años de antigüedad y funciones que ya no existen. Aquí tienes diez que resuelven necesidades reales, escritos para versiones actuales de WordPress y PHP, y explicados para que sepas qué estás pegando.
Antes de empezar
- Pega cada snippet en Code Snippets o en un mu-plugin, no en el
functions.phpdel tema padre. Si no sabes cuál elegir, revisa la entrada «Dónde poner tus snippets en WordPress». - Agrégalos de a uno y revisa el sitio después de cada uno.
- Todos usan funciones anónimas. Para deshacer cualquiera, basta con borrarlo o desactivarlo.
1. Mostrar el tiempo de lectura al inicio de cada entrada
add_filter( 'the_content', function ( $contenido ) {
if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
return $contenido;
}
$texto = wp_strip_all_tags( strip_shortcodes( $contenido ) );
$palabras = count( preg_split( '/\s+/u', trim( $texto ), -1, PREG_SPLIT_NO_EMPTY ) );
$minutos = max( 1, (int) ceil( $palabras / 200 ) );
$aviso = sprintf(
'<p class="tiempo-lectura">Tiempo de lectura: %d %s</p>',
$minutos,
1 === $minutos ? 'minuto' : 'minutos'
);
return $aviso . $contenido;
} );
Cuenta las palabras (con preg_split y el modificador u, que entiende tildes y eñes; la función str_word_count de PHP se equivoca con ellas) y calcula unos 200 por minuto.
2. Mostrar la fecha de última actualización
add_filter( 'the_content', function ( $contenido ) {
if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
return $contenido;
}
// Solo si se actualizó al menos un día después de publicarse.
if ( get_the_modified_time( 'U' ) - get_the_time( 'U' ) < DAY_IN_SECONDS ) {
return $contenido;
}
$fecha = '<p class="fecha-actualizacion">Actualizado el ' . esc_html( get_the_modified_date() ) . '</p>';
return $fecha . $contenido;
} );
Ideal para un blog técnico: le dice al lector que la guía sigue vigente. get_the_modified_date() usa el formato de fecha de Ajustes → Generales.
3. Extractos más cortos y con «Seguir leyendo»
add_filter( 'excerpt_length', function () {
return 30;
} );
add_filter( 'excerpt_more', function () {
return '… <a class="seguir-leyendo" href="' . esc_url( get_permalink() ) . '">Seguir leyendo</a>';
} );
Solo afecta a los extractos generados automáticamente. Si escribiste un extracto a mano en la entrada, WordPress usa el tuyo.
4. Que la búsqueda muestre solo entradas
add_action( 'pre_get_posts', function ( $consulta ) {
if ( ! is_admin() && $consulta->is_main_query() && $consulta->is_search() ) {
$consulta->set( 'post_type', array( 'post' ) );
}
} );
Evita que aparezcan páginas como «Contacto» o «Política de privacidad» en los resultados. pre_get_posts permite modificar la consulta antes de que llegue a la base de datos. Las condiciones son importantes: ! is_admin() para no cambiar las búsquedas del panel y is_main_query() para no tocar los widgets.
5. Ocultar la barra de administración a los suscriptores
add_filter( 'show_admin_bar', function ( $mostrar ) {
return current_user_can( 'edit_posts' ) ? $mostrar : false;
} );
En un sitio con foro, los miembros (suscriptores) ven una barra negra arriba que no les sirve. Así solo la ven quienes pueden editar contenido.
6. Mensajes de error de acceso que no den pistas
add_filter( 'login_errors', function () {
return '<strong>Error:</strong> usuario o contraseña incorrectos.';
} );
Por defecto, WordPress dice si el usuario existe o si solo falló la contraseña. Eso le confirma a un atacante qué usuarios son válidos. Con este cambio, el mensaje es siempre el mismo.
7. Limitar las revisiones guardadas
add_filter( 'wp_revisions_to_keep', function ( $cantidad, $post ) {
return 10;
}, 10, 2 );
Hace lo mismo que WP_POST_REVISIONS en wp-config.php, pero desde código, y te permite distinguir por tipo de contenido usando $post->post_type. Fíjate en el 10, 2: prioridad 10 y dos argumentos.
8. No cargar el script de emojis
add_action( 'init', function () {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'wp_enqueue_scripts', 'wp_enqueue_emoji_styles' );
remove_action( 'admin_enqueue_scripts', 'wp_enqueue_emoji_styles' );
} );
WordPress carga un pequeño script para mostrar emojis en navegadores antiguos. Hoy todos los navegadores modernos los muestran solos. Los emojis seguirán viéndose: solo deja de cargarse ese script extra.
9. Quitar la versión de WordPress del código
remove_action( 'wp_head', 'wp_generator' );
Quita la etiqueta <meta name="generator" content="WordPress X.Y.Z">. No es una protección real (lo que protege es estar actualizado), pero evita anunciar tu versión a los programas que buscan sitios desactualizados.
10. Desactivar los pingbacks de XML-RPC
add_filter( 'xmlrpc_methods', function ( $metodos ) {
unset( $metodos['pingback.ping'], $metodos['pingback.extensions.getPingbacks'] );
return $metodos;
} );
Los pingbacks se usan para lanzar ataques contra otros sitios desde el tuyo. Este snippet los quita sin desactivar XML-RPC por completo (por si usas Jetpack o la app). Si no usas nada de eso, es mejor bloquear xmlrpc.php desde .htaccess, como explicamos en la entrada sobre ataques de fuerza bruta en Seguridad & Alertas.
Bonus: dales estilo
Los snippets 1 y 2 agregan párrafos con clases propias. Puedes darles estilo en Apariencia → Personalizar → CSS adicional:
.tiempo-lectura,
.fecha-actualizacion {
font-size: .9em;
opacity: .75;
margin: 0 0 .6em;
}
Revisa que tu tema o un plugin no hagan ya lo mismo. Si tu tema muestra el tiempo de lectura y agregas el snippet 1, aparecerá dos veces.
¿Tienes un snippet favorito que no está en la lista? Compártelo en el foro con una explicación de qué hace. Los mejores los sumamos a una próxima entrada, con crédito para ti.





