SYSADMIT, un veterano blog de administración de sistemas

sysadmit

Valencia, 13/09/2026, G.B.
Sigo ampliando el directorio de webs recomendadas con sitios que uso o consulto a menudo si me surgen dudas relativas a administración de sistemas; o por pura curiosidad. Hoy le toca el turno a SYSADMIT, un blog de referencia en castellano sobre sysadmin, mantenido por Xavier Genestós.

Qué es SYSADMIT

SYSADMIT es un blog de administración de sistemas con años de recorrido, alojado en Blogger, centrado en Windows Server, Windows Client, virtualización con VMware, backups con Veeam, y también con presencia de contenidos sobre Linux, Docker, PowerShell, Active Directory y redes. El propio autor ha publicado varios libros técnicos en castellano bajo el sello de la casa (como los de la serie «LABS»), lo que da una idea del nivel de detalle que maneja en sus artículos.

Qué se puede encontrar

El contenido está organizado por etiquetas, y ahí se ve claramente hacia dónde apunta el blog: VMware, Windows Client y Windows Server concentran el grueso de las entradas, seguidos de Veeam Backup, Networking y PowerShell. Linux también tiene su hueco, con posts sobre Docker (persistencia de datos, laboratorios rápidos, actualización de contenedores) que están bastante bien explicados para quien se inicia en contenedores.

El formato de los artículos es el típico de guía práctica: se plantea un problema o una tarea concreta (por ejemplo, ver el tamaño de un directorio con PowerShell, o desinstalar un parche desde línea de comandos) y se resuelve paso a paso, sin rodeos.

Por qué lo recomiendo

Me parece un blog útil sobre todo si te mueves en entornos mixtos Windows/Linux, algo muy habitual en el día a día de un sysadmin. Yo ya no llevo servidores Windows como antes,  pero sigo consultándolo cuando me surge alguna duda de la vieja escuela.

Un plugin propio de FAQs con lógica condicional para WordPress

Hace poco os contaba cómo monté Comandos Linux, un plugin propio con su tabla, su panel y su shortcode. Esta vez le tocaba a algo que llevaba tiempo queriendo hacer: una sección de preguntas frecuentes con lógica condicional, sin depender de un plugin de formularios de terceros

Valencia, 12/09/2026, G.B.
En un proyecto para una intranet usé Fluent Forms para montar unas FAQs con lógica condicional: el usuario elegía un tema y solo veía las preguntas de ese tema. Funciona muy bien, pero es una herramienta pensada para formularios complejos, y para una sección de FAQs en Indaga.net me sobraba casi todo. Así que hice lo de siempre aquí: quedarme solo con la pieza que necesito y montarla yo mismo.

El planteamiento

La «lógica condicional» que quería no es tan sofisticada como la de un constructor de formularios: no necesito árboles de decisión ni preguntas que dependan de respuestas anteriores. Lo que necesito es más simple y, para una FAQ, más que suficiente: el usuario elige una categoría (por ejemplo «WordPress» o «Facturación») y solo se muestran las preguntas de esa categoría. El resto permanece oculto hasta que cambia de categoría.

Con eso claro, el plugin se reduce a tres piezas: una tabla propia en la base de datos, un panel de administración para gestionar las preguntas, y un shortcode que pinta el selector y las preguntas en el front end.

La tabla

Cada pregunta se guarda con seis campos: categoria, pregunta, respuesta (admite HTML básico, para poder meter enlaces o negritas en la respuesta), orden (para decidir en qué posición aparece dentro de su categoría) y activo (para poder desactivar una pregunta sin borrarla). Nada de post types personalizados ni de meta fields sueltos: una tabla con dbDelta() en la activación, como en el resto de plugins que he ido publicando aquí.

El panel de administración

El formulario de alta y edición es sencillo: categoría (con autocompletado a partir de las categorías ya creadas, para no acabar con «Facturación», «facturacion» y «Facturación » conviviendo en la misma tabla), pregunta, respuesta con el editor visual de WordPress, orden y una casilla de activo. El listado de abajo tiene buscador por texto, filtro por categoría y paginación, para cuando la lista crezca y no quepa cómodamente en una sola pantalla.

Aquí me llevé un buen susto durante las pruebas: el formulario, al guardar, se quedaba la página a medio cargar, como congelada. La causa no tenía nada que ver con la base de datos ni con archivos grandes, sino con el orden de ejecución de WordPress: el guardado del formulario y la redirección posterior se ejecutaban dentro de la misma función que pinta el HTML del panel, y para ese punto WordPress ya ha enviado las cabeceras HTTP. Una redirección que llega tarde, simplemente, no llega. La solución fue mover todo el procesamiento del formulario a un enganche admin_init, que se ejecuta antes de que se imprima nada, y que la función de renderizado se limite a pintar. Detalle poco vistoso, pero de esos que conviene tener en la cabeza si escribís vuestros propios paneles de administración.

La lógica condicional, en el front end

Aquí está el motivo del plugin. Al insertar el shortcode, el plugin agrupa las preguntas por categoría y, si hay más de una, añade automáticamente unos botones de selección arriba del todo, empezando por un botón «Todas». Al pulsar sobre una categoría, un poco de JavaScript sin dependencias oculta el resto de preguntas y muestra solo las de esa categoría, sin recargar la página. Si solo existe una categoría, o si el shortcode se usa fijando una en concreto, el selector directamente no aparece: no tiene sentido mostrar un filtro con una sola opción.

A eso se suma un buscador de texto libre y una paginación, ambos también resueltos en el cliente: no hace falta ir a la base de datos cada vez que alguien escribe una letra o cambia de página, porque una sección de FAQs no suele tener miles de registros. Las preguntas se despliegan en acordeón al hacer clic, así que la página no se llena de texto de golpe.

El shortcode

Para insertarlo en cualquier entrada o página basta con:

indaga_faqs (entre corchetes, [ ])

Y admite varios parámetros para adaptarlo a cada sitio:

indaga_faqs categoria=»Facturación»

Muestra solo esa categoría, sin selector. Útil si queréis una página de FAQs dedicada a un único tema.

indaga_faqs mostrar_selector=»no»

Lista todas las categorías seguidas, sin botones de filtro.

indaga_faqs mostrar_buscador=»no»

Oculta la barra de búsqueda superior.

indaga_faqs por_pagina=»5″

Cambia cuántas preguntas se muestran por página (10 por defecto).

Por qué así

La misma filosofía de siempre: identificar qué parte de una herramienta de terceros es la que de verdad necesito, y quedarme solo con eso, escrito a medida, ligero y sin dependencias que arrastrar en cada actualización. Para una intranet con formularios complejos, Fluent Forms tiene todo el sentido. Para una sección de FAQs en un blog, con esto sobra.

Descargar plugin de mi cuenta de pCloud

Míralo en acción: Indaga FAQs

Elements of AI: el curso gratuito de la Universidad de Helsinki para aprender inteligencia artificial en español

elements of ia

Valencia, 11/09/2026, G.B.
Ha vuelto a circular por redes un curso que ya lleva un tiempo entre nosotros pero que sigue mereciendo un hueco en el directorio: Elements of AI, desarrollado por la Universidad de Helsinki junto a la empresa finlandesa MinnaLearn (en su origen, junto a Reaktor). Nació en 2018 y desde entonces ha ido ampliando su disponibilidad en idiomas, español incluido, lo que explica que siga apareciendo como descubrimiento reciente para quien no lo conocía.

Es una introducción a la inteligencia artificial pensada para cualquier persona, sin exigir conocimientos previos de programación ni de matemáticas.

Qué ofrece

El curso está organizado en varios módulos que van de los principios básicos de la disciplina hasta nociones de machine learning y redes neuronales, combinando teoría con ejercicios prácticos que se completan a tu propio ritmo. Suele llevar entre 25 y 60 horas, según el tiempo que cada persona le dedique, y al finalizar es posible obtener un certificado si se completan los módulos y ejercicios propuestos.

Por qué en español

Lo interesante para el público hispanohablante es que el curso está disponible en 26 idiomas, entre ellos el español, lo que elimina una barrera de entrada habitual en este tipo de formación online. Ya lo han completado más de un millón de personas de 170 países, lo que lo convierte en uno de los cursos abiertos de IA más seguidos del mundo.

Enlace

Puede realizarse de forma gratuita desde: https://course.elementsofai.com/es/

Un interesante efecto óptico para saber si estás tranquilo o no…

Valencia, 10/09/2026, G.B.
Me ha llegado este tuit y no he podido resistirme a comprobarlo: una imagen que, según dicen, se queda quieta si estás tranquilo y empieza a «moverse» en cuanto sientes estrés (a mí se me movía…).

Antes de sacar conclusiones sobre tu nivel de estrés, un apunte: la historia del «neurólogo japonés» es un bulo que lleva circulando desde 2018. La imagen es obra de un ilustrador ucraniano, Yurii Perepadia, que se basó en los trabajos de Akiyoshi Kitaoka, profesor de psicología en la Universidad de Ritsumeikan (Japón) especializado en ilusiones ópticas de movimiento. El propio Perepadia ha desmentido lo del neurólogo, que ni siquiera existe.

Lo interesante es que el efecto de movimiento es real y le pasa a (casi) todo el mundo, esté como esté de estresado. Se debe a cómo el cerebro procesa patrones de contraste y color repetidos, no a tu estado de ánimo: si mueves los ojos por la imagen, el sistema visual periférico interpreta esos patrones como movimiento aunque estén completamente estáticos.

Así que la próxima vez que veas circular esta imagen (o alguna parecida) como «test de estrés», ya sabes: es una ilusión óptica curiosa, pero no tiene nada de diagnóstico. Aquí va:

Plugin para importar CSV o Excel a cualquier tabla de WordPress

Un plugin propio para convertir un CSV o un Excel en filas listas para cualquier tabla de la base de datos, con dos modos: inserción directa o script SQL descargable

Valencia, 10/09/2026, G.B.
Cada vez que necesito poblar una tabla propia —la de comandos Linux, la de frases aleatorias, la de FAQs— acababa haciendo lo mismo: montar el INSERT INTO línea a línea a partir de un listado o insertarlo manualmente en el panel de administración del plugin. Pero si necesito crear muchos registros a la vez, la cosa se hacía algo pesada. Así que he preparado un plugin genérico para no repetir ese trabajo: Importador CSV/Excel a Tabla, que sube un archivo y lo convierte en inserciones para la tabla que le indiques.

Qué hace

El plugin añade una página en Herramientas → Importador CSV/Excel. Desde ahí se sube un archivo .csv o .xlsx y se indican tres cosas:

  • El nombre real de la tabla destino, con su prefijo (por ejemplo, wp_fa_frases)
  • Las columnas destino, separadas por comas y en el mismo orden que las columnas del archivo (sin incluir id si es autoincremental)
  • Si la primera fila es cabecera, para que se ignore

Y después hay que elegir el modo:

  • Insertar directamente en la base de datos, fila a fila, con un resumen de cuántas se han insertado, cuántas han fallado y cuántas se han descartado por no tener suficientes columnas
  • Generar un script SQL descargable, con el INSERT INTO completo, para revisarlo y ejecutarlo yo mismo en phpMyAdmin en vez de dejar que el plugin toque la tabla directamente

Cómo lee los archivos

Con el CSV no hay mucho misterio: se parsea con fgetcsv(), detectando automáticamente si el delimitador es coma, punto y coma o tabulador, y respetando el BOM UTF-8 que añaden Excel o LibreCalc al exportar.

El XLSX es más delicado porque, en el fondo, es un ZIP con varios XML dentro. En vez de tirar de una librería de terceros como PhpSpreadsheet, lo abro con ZipArchive y leo directamente sharedStrings.xml (donde Excel guarda los textos) y sheet1.xml (donde guarda la estructura de celdas) con SimpleXML. Las dos son extensiones nativas de PHP, así que sigo sin añadir ninguna dependencia externa al sitio.

Esto tiene límites que asumo: solo lee la primera hoja del libro, no soporta celdas combinadas ni fórmulas, y las fechas se leen como el valor crudo de la celda, sin formatear. Para el uso que le voy a dar —listados sencillos de una sola hoja— es más que suficiente.

Por qué así

El plugin sigue la misma arquitectura que el resto de los que tengo en marcha: procesamiento del formulario enganchado a admin_init en lugar de dentro del callback del menú (para evitar el típico problema de cabeceras ya enviadas), patrón POST/Redirect/GET para no reenviar el formulario al recargar, y comprobación de nonce y de capacidad manage_options antes de tocar nada. debo comprobar si eso ralentiza el «pintado» del escritorio de WordPress.

La idea de fondo es la misma de siempre: cubrir una necesidad muy concreta —pasar una hoja de cálculo a SQL— con el menor peso posible y sin depender de plugins de terceros que no controlo.

Qué me falta por probar

Lo acabo de instalar y todavía no lo he puesto a prueba con datos reales: antes tengo que revisar la estructura de las tablas con las que voy a trabajar para asegurarme de que las columnas coinciden. Si funciona bien, es probable que añada una vista previa de las primeras filas del archivo antes de confirmar la importación, para pillar errores de columnas antes de que lleguen a la base de datos.

Descargar plugin de mi cuenta de pCloud

Brand New Day: la canción que necesitaba hoy

Valencia, 09/09/2026, G.B.
Llevo un tiempo dándole vueltas a esto: la sensación de estar demasiado encasillado, de repetir siempre el mismo patrón ante según qué situaciones o personas. Y creo que parte de aprender en serio, de vivir en serio, es justo eso: no quedarte fijo en una única forma de ver las cosas, aunque tengas anclas —principios, gente, costumbres— que te sostengan. Se puede cambiar de aires sin perder el rumbo.

Porqué esta canción

«Brand New Day» se publicó como single en septiembre de 1999, con Stevie Wonder a la armónica, y da título al sexto álbum de estudio de Sting. La escribió casi como un pequeño homenaje a Wonder, y el tema acabó funcionando como un contrapunto optimista a todo el miedo apocalíptico que rodeaba el cambio de milenio: en vez de esperar el fin del mundo, propone la idea de empezar de cero. Le valió un Grammy al año siguiente. Si te interesa la historia completa, Songfacts la cuenta bien.

Lo que más me gusta es precisamente ese mensaje: no hace falta esperar a un cambio de año, de década o de milenio para «empezar de cero». Cada día es, en potencia, un Brand New Day.

El vídeo

Aterrizándolo

Al final, esto no va solo de música. Va de permitirte, de vez en cuando, cuestionar la rutina, el rol que has asumido, la forma en la que sueles reaccionar. No es inconsistencia, es simplemente seguir vivo, seguir aprendiendo. Y si además tiene banda sonora, mejor que mejor. Como ya he dicho en varias ocasiones, la música es una de las mejores vacunas contra la rutina, la desidia y la desilusión…

 

PD: Haré un crossbloging con Focus On Learning English sobre la frase «Brand New Day». En breve… Hasta pronto!

Mu-plugins en WordPress: qué son, para qué sirven y un ejemplo práctico

Valencia, 09/09/2026, G.B.
Si llevas un tiempo trasteando con WordPress, seguro que conoces la carpeta wp-content/plugins, donde viven los plugins que activas y desactivas desde el escritorio. Pero existe otra carpeta, mucho menos conocida, que merece la pena tener en el radar: wp-content/mu-plugins.

Qué son los mu-plugins

«MU» viene de Must-Use (de uso obligatorio). Son plugins que WordPress carga automáticamente en cada petición, sin que tengan que activarse desde el panel de administración. De hecho, ni siquiera aparecen en el listado habitual de plugins junto al botón de «Desactivar»: aparecen en una sección aparte, de solo lectura, llamada «Uso obligatorio».

Las diferencias clave respecto a un plugin normal son:

  • Se cargan siempre. No hay riesgo de que alguien los desactive sin querer desde el escritorio.
  • Se cargan antes que los plugins normales. Esto es importante si necesitas engancharte a hooks muy tempranos en el ciclo de carga de WordPress.
  • No admiten subcarpetas. WordPress solo lee los archivos .php que están directamente dentro de mu-plugins/, no los que están en subdirectorios (aunque sí puedes tener un archivo suelto que a su vez incluya otros ficheros desde una subcarpeta).
  • No tienen pantalla de ajustes activar/desactivar. Se gestionan a nivel de sistema de archivos, subiendo o quitando el .php correspondiente.

Para qué sirven

Los mu-plugins son la herramienta adecuada cuando necesitas que algo se ejecute siempre, de forma incondicional, sin dejarlo al albur de que un cliente, un editor o tú mismo en un despiste desactivéis un plugin importante. Casos típicos:

  • Funcionalidad crítica del sitio: cosas de las que depende el funcionamiento correcto y que no deberían poder desactivarse por error.
  • Ajustes de seguridad: por ejemplo, desactivar la edición de archivos desde el escritorio, forzar SSL en el admin, o bloquear XML-RPC.
  • Configuración de hosting o multisitio: en instalaciones multisitio son muy usados para forzar comportamientos comunes a toda la red, ya que se cargan en todos los sitios sin necesidad de activarlos uno a uno.
  • Pequeñas utilidades propias que no justifican un plugin completo con cabecera, opciones y demás, pero que quieres tener siempre disponibles.
  • Parches o correcciones rápidas, ideales cuando necesitas asegurarte de que algo se aplica sin depender de que nadie recuerde activarlo.

Cómo se instalan

No hay instalador ni pantalla de subida. El proceso es manual:

  1. Si la carpeta wp-content/mu-plugins/ no existe, se crea.
  2. Se sube el archivo .php directamente a esa carpeta.
  3. Listo. WordPress lo detecta y lo ejecuta en la siguiente petición, sin activar nada.

Ejemplo práctico: mostrar la fecha de última actualización en las entradas

Un caso de uso muy típico en un blog: mostrar al lector cuándo se actualizó por última vez un artículo, además de (o en lugar de) la fecha de publicación. Es útil para dar señales de que el contenido se mantiene al día, algo que además ayuda en SEO.

Vamos a crear un mu-plugin que añada esa fecha automáticamente al principio del contenido de las entradas, solo cuando la fecha de modificación sea distinta a la de publicación (para no mostrar información redundante si el artículo nunca se ha tocado).

<?php
/**
* Plugin Name: Indaga – Last Updated Notice
* Description: Displays the last updated date on blog posts.
* Version: 1.0
* Author: Guillermo Beltrán Pilato
*/

// Exit if this file is loaded directly.
if ( ! defined( ‘ABSPATH’ ) ) {
exit;
}

/**
* Prepends the last updated notice to the post content.
*/
function indaga_show_last_updated_notice( $content ) {

// Only run on single posts, within the main content loop.
if ( ! is_single() || ! in_the_loop() || ! is_main_query() ) {
return $content;
}

$published_date = get_the_date( ‘U’ );
$modified_date = get_the_modified_date( ‘U’ );

// If the difference is less than a day, we consider there was no
// real update (avoids false positives from minor resaves).
if ( ( $modified_date – $published_date ) < DAY_IN_SECONDS ) {
return $content;
}

$formatted_date = get_the_modified_date( ‘F j, Y’ );

$notice = sprintf(
‘<p class=»indaga-last-updated-notice»><em>Last updated: %s</em></p>’,
esc_html( $formatted_date )
);

return $notice . $content;
}
add_filter( ‘the_content’, ‘indaga_show_last_updated_notice’ );

Descargar plugin desde mi cuenta de pCloud

Menudo batería…

Valencia, 08/09/2026, G.B.
¡Uauh! Este vídeo llevaba días circulando por redes en clips de pocos segundos, pero el solo completo es otra cosa.

El batería es Daniel Varfolomeyev, ucraniano, y el vídeo tiene ya diez años: en diciembre de 2016 ganó el DrumQuest Ucrania, un concurso bianual fundado ese mismo año por Tobi «Medic Drums» Fatonade —un estudiante nigeriano de medicina afincado en Ucrania— y promocionado en su momento como «el mayor concurso de batería de Europa».

La segunda edición se celebró el 2 y 3 de diciembre de 2016 en Dom Pechat, en Járkov. En la gran final, Daniel, con solo doce años y natural de Dnipropetrovsk (la actual Dnipro), se impuso a otros quince baterías. Su interpretación de «Tiempo De Festival», el tema de Dave Weckl, quedó grabada y circuló bastante por YouTube en su momento — casi con toda seguridad es ese el «solo completo» al que se refiere el tuit, del que normalmente solo se veían fragmentos recortados.

El jurado de aquella edición lo formaban Alexander Lyulyakin (batería de Boombox y The Erised), Paul Kholdyansky (batería de Prime Orchestra) y Vadym Samosyuk, de Los Samos. Fuente: Wikipedia

Diez años después, el vídeo sigue impresionando igual que el primer día. Ese es el poder de un buen solo de batería. Aquí va:

¿Y qué fue de Daniel?

Diez años después de aquel solo viral, Daniel Varfolomeyev sigue detrás de la batería. Hoy comparte proyecto musical con su hermano Ilya, también batería, a través del canal de YouTube Drummer Daniel Varfolomeyev (@varfikdrummer), dedicado a la trayectoria y el día a día de ambos hermanos. Su actividad también se puede seguir en Facebook, donde la página «Барабанщик Даниил Варфоломеев / Drummer Daniel Varfolomeyev» —con base en Dnipro— suma ya más de 32.000 seguidores.

Un apunte que da contexto a todo esto: al tratarse de una familia ucraniana afincada en Dnipro, en plena guerra, el propio canal de YouTube incluye datos de cuenta (PrivatBank, PayPal) para quien quiera apoyar económicamente a los hermanos. Un recordatorio de que, detrás del vídeo viral de un niño prodigio de hace una década, hay hoy una familia que sigue haciendo música en circunstancias muy distintas a las de 2016.

Feeds, sitemap y una cabecera que sobra: pequeña auditoría de un sitio WordPress con curl

curl

Valencia, 08/09/2026, G.B.
Hay comandos que uno lanza casi por rutina y que, sin embargo, acaban destapando cosas interesantes. La semana pasada me tocó revisar el sitemap nativo de uno de mis sitios en WordPress y, de paso, aproveché para repasar algo que tenía pendiente desde hace tiempo: los feeds del sitio y una cabecera HTTP que no debería estar ahí.

Qué es el feed de un sitio en WordPress

El feed es una versión del contenido en XML —normalmente RSS 2.0, aunque WordPress también sabe hablar Atom— pensada para que lectores de noticias, agregadores o scripts consuman las entradas sin tener que «leer» el HTML de la página. Es una de esas piezas del núcleo de WordPress que llevan ahí desde siempre y que casi nadie mira hasta que algo deja de funcionar (a mí me pasó hace poco con un gadget de Blogger de terceros que dejó de refrescar entradas porque un Disallow: */feed/ en el robots.txt se lo estaba impidiendo).

Lo interesante es que WordPress no genera un único feed, sino uno por cada «vista» relevante del sitio:

  • Feed general, con todas las entradas: /feed/
  • Feed de comentarios de todo el sitio: /comments/feed/
  • Feed de una categoría: /category/nombre-categoria/feed/
  • Feed de una etiqueta: /tag/nombre-etiqueta/feed/
  • Feed de un autor: /author/nombre-autor/feed/
  • Feed de comentarios de una entrada concreta: /nombre-entrada/feed/
  • Feed de una búsqueda: /?s=termino&feed=rss2
  • Feed de un tipo de contenido personalizado, si el CPT lo soporta: /tipo-contenido/feed/

Y todavía hay una capa más: dentro de cada uno de esos ámbitos, el formato de salida se puede forzar con el parámetro ?feed=, con hasta cuatro variantes: rss2 (el que usa WordPress por defecto), rss (RSS 0.92, un formato ya legado), atom y rdf (RSS 1.0). En total, contando ámbitos y formatos, un sitio WordPress típico expone bastantes más «puertas de entrada» XML de las que uno recuerda a primera vista.

El sitemap no es un feed

Conviene no confundir los feeds con el sitemap. Desde WordPress 5.5 (2020), el núcleo genera automáticamente un sitemap XML nativo en /wp-sitemap.xml, sin necesidad de plugins de SEO. No es RSS ni Atom: es un índice que agrupa entradas, páginas, taxonomías y usuarios en sub-sitemaps independientes (wp-sitemap-posts-post-1.xml, wp-sitemap-users-1.xml, etc.), pensado para que los buscadores rastreen el sitio de forma eficiente.

Para comprobar rápidamente si el sitemap responde bien, sin descargarlo entero, uso el comando curl:

curl -I https://midominio.com/wp-sitemap.xml

El -I fuerza una petición HEAD: solo pide las cabeceras HTTP de la respuesta, no el cuerpo. Es la forma más rápida de saber si una URL existe, qué código de estado devuelve y qué tipo de contenido sirve, sin gastar ancho de banda en el XML completo.

Lo que las cabeceras cuentan (y lo que delatan)

Al lanzar ese curl -I contra uno de mis sitios, obtuve algo así (he sustituido la versión de PHP que aparecía por X.X.XX en el código que adjunto por motivos de seguridad):

HTTP/2 200
content-type: text/xml;charset=UTF-8
date: Fri, 04 Sep 2026 06:42:34 GMT
server: Apache
x-powered-by: PHP/X.X.XX

Todo correcto salvo un detalle: x-powered-by: PHP/X.X.XX está anunciando al mundo, con número de versión exacto, qué motor PHP corre detrás. No es una vulnerabilidad en sí misma, pero sí información gratuita para cualquiera que esté buscando qué CVEs probar contra esa versión concreta. Es el tipo de cabecera que no aporta nada al visitante legítimo y sí algo a quien está reconociendo el terreno.

La buena noticia es que server: Apache ya venía sin número de versión, así que esa parte no hacía falta tocarla.

Cómo quitar la cabecera con php.ini

Yo tengo creado el archivo php.ini (o .user.ini) propio en el directorio del sitio. El mío ya incluía algunos ajustes habituales:

upload_max_filesize = 128M
post_max_size = 128M
max_execution_time = 300
memory_limit = 512M
zlib.output_compression = 1
zlib.output_compression_level = 9

Simplemente basta con añadir una línea más:

expose_php = Off

Tras guardar el archivo -y en algunos casos esperar unos minutos a que el hosting recargue la configuración- un nuevo curl -I me ha confirmado que la cabecera x-powered-by había desaparecido. Un cambio de una sola línea, pero de esos que conviene no dejar pendientes.

Resumiendo

  • Un sitio WordPress puede exponer más de media docena de feeds distintos, cada uno con hasta cuatro formatos posibles.
  • El sitemap nativo (/wp-sitemap.xml) es una pieza distinta, propia del núcleo desde la versión 5.5.
  • curl -I es la herramienta de cabecera rápida para auditar cualquier URL sin descargar su contenido.
  • Si tu hosting lo permite, expose_php = Off en tu php.ini o .user.ini es un cambio mínimo con un beneficio de seguridad nada despreciable.

Un plugin propio para aprender comandos básicos de Linux en WordPress

plugin comandos linux

Tal y como comentaba aquí, he preparado un pequeño plugin para mostrar comandos de Linux, para aprender, vaya. Insertaré el shortcode en una nueva página, en vez de en una entrada o post

Valencia, 06/09/2026, G.B.
Llevo tiempo trabajando en plugins a medida, sin dependencias externas, para cubrir necesidades muy concretas sin cargar el sitio con librerías de terceros. El último que he montado va dirigido a quien empieza con Linux: Comandos Linux, un plugin que permite gestionar una pequeña base de datos de comandos —con su explicación y un ejemplo práctico— y mostrarla en el front end mediante un shortcode.

Qué hace

El plugin crea su propia tabla en la base de datos con cuatro campos por registro:

  • Nombre del comando (ls, grep, chmod…)
  • Explicación, en lenguaje sencillo
  • Ejemplo práctico, listo para copiar y probar en terminal

Desde el panel de administración se pueden crear, editar y eliminar comandos con un formulario simple, y el listado incluye un buscador y paginación para cuando la lista crezca.

El shortcode

Para mostrarlo en cualquier entrada o página basta con insertar, entre corchetes []:

comandos_linux

El front end reproduce la misma lógica que el panel: buscador propio y resultados paginados, sin necesidad de recargar toda la página gracias a los parámetros por URL. Si se quiere ajustar cuántos comandos se muestran por página, se puede indicar con (entre corchetes []:

comandos_linux por_pagina="10"

Por qué así

Como en el resto de plugins que he ido publicando aquí, la idea es mantenerlo ligero: sin librerías externas, con consultas preparadas contra la base de datos, y siguiendo el patrón POST/Redirect/GET para evitar reenvíos accidentales de formularios. Es la misma filosofía que ya apliqué en el plugin de recursos o en el de autores: cubrir una necesidad concreta con el menor peso posible.

De momento arranca con comandos básicos como ls, cd, grep o chmod, pero la idea es irlo ampliando poco a poco a medida que vaya cubriendo más terreno, desde gestión de permisos hasta redes o procesos.

Así queda insertado el shortcode en una página  (iré añadiendo más y mejorándolo): Comandos Linux


Descargar el plugin desde mi cuenta de pCloud