
Un shortcode es un código entre corchetes, como [boton] o [formulario id="3"], que un plugin reemplaza por algo al mostrar la página. Si desactivas ese plugin, nadie lo reemplaza, y el texto aparece tal cual en tus entradas: corchetes, atributos y todo.
Es muy común después de dejar un constructor visual antiguo, un plugin de «columnas y botones» o un tema que traía sus propios shortcodes.
Paso 1: encontrar qué shortcodes huérfanos hay
Este comando revisa todas las entradas y páginas publicadas y cuenta los shortcodes que no están registrados en tu sitio (los que nadie va a procesar):
wp eval '
global $shortcode_tags;
$conteo = array();
foreach ( get_posts( array( "post_type" => "any", "post_status" => "publish", "numberposts" => -1, "fields" => "ids" ) ) as $id ) {
preg_match_all( "/\[([a-zA-Z0-9_-]+)[\s\]\/]/", get_post_field( "post_content", $id ), $m );
foreach ( array_unique( $m[1] ) as $nombre ) {
if ( ! isset( $shortcode_tags[ $nombre ] ) ) {
$conteo[ $nombre ][] = $id;
}
}
}
foreach ( $conteo as $nombre => $ids ) {
printf( "[%s] en %d entradas: %s\n", $nombre, count( $ids ), implode( ", ", array_slice( $ids, 0, 10 ) ) );
}
'
Verás algo como:
[one_half] en 37 entradas: 112, 118, 240...
[button] en 52 entradas: 98, 112, 133...
Revisa la lista con criterio: a veces aparecen palabras entre corchetes que no son shortcodes (por ejemplo, [nota] escrito a propósito en un texto). Mira una o dos entradas de cada uno antes de decidir.
Paso 2, opción A: ocultarlos sin tocar la base de datos
La forma más segura y reversible: registrar de nuevo esos shortcodes, pero que no hagan nada visible. Hay dos tipos:
- Los que envuelven contenido (
[one_half]Texto[/one_half]): queremos conservar el texto y quitar los corchetes. - Los que no envuelven nada (
[divider],[button link="…"]): queremos que desaparezcan.
En un mu-plugin (wp-content/mu-plugins/cwp-shortcodes-huerfanos.php):
<?php
/**
* Plugin Name: Shortcodes huérfanos (Curso WordPress)
*/
add_action( 'init', function () {
// Envuelven contenido: se conserva el texto de adentro.
foreach ( array( 'one_half', 'one_half_last', 'one_third', 'row', 'column' ) as $nombre ) {
add_shortcode( $nombre, function ( $atributos, $contenido = '' ) {
return do_shortcode( $contenido );
} );
}
// No envuelven nada: desaparecen.
foreach ( array( 'divider', 'spacer', 'social_icons' ) as $nombre ) {
add_shortcode( $nombre, '__return_empty_string' );
}
// Un botón: lo convertimos en un enlace normal.
add_shortcode( 'button', function ( $atributos, $contenido = '' ) {
$a = shortcode_atts( array( 'link' => '', 'url' => '' ), $atributos );
$url = $a['link'] ?: $a['url'];
return $url ? sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html( wp_strip_all_tags( $contenido ?: 'Ver más' ) ) ) : '';
} );
}, 20 );
Ajusta las listas con los nombres que encontraste en el paso 1.
Ventajas: no tocas el contenido; si te equivocas, borras el mu-plugin y todo vuelve a estar como antes.
Paso 2, opción B: borrarlos de la base de datos
Si prefieres limpiar el contenido de forma definitiva (por ejemplo, porque vas a migrar a otro sistema), WP-CLI permite buscar y reemplazar con expresiones regulares.
Haz un respaldo de la base de datos antes (wp db export antes-de-limpiar.sql) y usa siempre primero --dry-run, que muestra cuántos cambios haría sin hacer ninguno.
Quitar las etiquetas de apertura y cierre de one_half, conservando el texto de adentro:
wp search-replace '\[/?one_half[^\]]*\]' '' wp_posts --include-columns=post_content --regex --dry-run
Si el número de reemplazos tiene sentido, repite el comando sin --dry-run. Haz lo mismo con cada shortcode.
Para los que no envuelven nada, el mismo patrón sirve: '\[divider[^\]]*\]'.
El reemplazo con regex de WP-CLI funciona bien en contenido de entradas. No lo uses sobre columnas con datos serializados (como wp_options o wp_postmeta) sin saber exactamente qué haces.
Paso 3: revisar
Abre algunas de las entradas del listado del paso 1 y comprueba que se vean bien. Los shortcodes de columnas solían crear el diseño en dos columnas: al quitarlos, el contenido queda en una sola. Si alguna entrada importante necesita las columnas, ábrela en el editor de bloques y usa el bloque Columnas.
¿Encontraste shortcodes huérfanos que no sabes de qué plugin eran? Comparte sus nombres en el foro y averiguamos su origen.





