
🛠 Cómo añadir un campo personalizado a muchas entradas en WordPress
Un sitio en WordPress ha crecido hasta tener cientos de entradas, y cada una necesita un nuevo campo personalizado. Abrir cada entrada a mano y hacer clic en «Actualizar» es un trabajo de medio día, como mínimo.
Sobre todo si está refinando un tema o conectando un plugin de SEO que necesita la misma meta_key en todo el flujo de entradas. El panel de administración de WordPress no ofrece un botón de «aplicar a todas», pero sí le da dos maneras de resolver esto con código.
A continuación, ambos métodos con fragmentos listos para usar: rápido (una consulta SQL para todo el lote) y simple (un bucle sobre los ID usando la función nativa add_post_meta). Elija según la tarea.

💡 Resumen rápido:
- Puede asignar en lote el mismo campo personalizado a todas las entradas usando
add_post_metaen un bucle, 4 líneas de código. - Si hay cientos de entradas y la velocidad importa, una inserción directa en la tabla
wp_postmetamediante una función personalizada. - Ambos métodos funcionan a través del
functions.phpdel tema o el plugin Code Snippets. Haga una copia de seguridad de la base de datos antes de ejecutar cualquier SQL.
Por qué añadir un campo a muchas entradas a la vez
Los campos personalizados (también conocidos como post meta) almacenan información adicional sobre un registro: contador de visitas, etiquetas para filtrado interno, una bandera de «favorito», un ID de producto relacionado. Cualquier cosa que no encaje en los campos estándar post_title y post_content.
Normalmente un campo se añade caso por caso: abra una entrada, busque el bloque «Campos personalizados» en el editor, introduzca un par clave-valor. Pero cuando el campo debe aparecer en las 200 entradas a la vez, el método manual queda descartado.
Escenarios típicos donde se necesita una acción en lote:
- Activó un tema hijo que usa
get_post_meta($post_id, 'featured_post', true)para marcar entradas populares. Sin una asignación masiva, las entradas antiguas no aparecerán en la salida. - Una auditoría SEO exigió establecer
noindexpara un tipo de contenido específico mediante un campo meta, en lugar de hacerlo a través de robots.txt. - Migración desde otra plataforma: los datos del antiguo CMS llegaron en un CSV y necesitan cargarse en
wp_postmetapara miles de registros.
WordPress no tiene una función nativa add_multiple_posts_meta. Pero existen dos caminos probados, elija según la situación.
Método 1. Una consulta SQL para todas las entradas
El método más rápido, una inserción directa en la tabla wp_postmeta en una sola transacción. En lugar de 200 consultas individuales a la base de datos, hace una y se ejecuta en milisegundos.
A continuación, la función add_multiple_posts_meta, que acepta un array de ID de entrada y refleja la firma de la función nativa add_post_meta: mismos parámetros, mismo orden.
Añada el código al functions.php del tema hijo o mediante el plugin Code Snippets. La propia función comprueba si ese campo ya existe para la entrada (si se pasa $unique = true) y filtra los ID no válidos.
1 if( !function_exists( 'add_multiple_posts_meta' ) ){ 2 function add_multiple_posts_meta( $post_ids, $meta_key, $meta_value, $unique = false ){ 3 4 // If key or ID is not set — exit 5 if( !$meta_key || empty( $post_ids ) ){ 6 return false; 7 } 8 9 // One post — pass to native add_post_meta 10 if( is_numeric( $post_ids ) || ( is_array( $post_ids ) && count( $post_ids ) === 1 ) ){ 11 return add_post_meta( 12 is_array( $post_ids ) ? $post_ids[0] : $post_ids, 13 $meta_key, 14 $meta_value, 15 $unique 16 ); 17 } 18 19 global $wpdb; 20 21 // Filter out invalid IDs and duplicates 22 $valid_post_ids = array_unique( 23 array_filter( $post_ids, function( $post_id ) use ( $wpdb, $meta_key, $unique ){ 24 return $post_id 25 && is_numeric( $post_id ) 26 && get_post_status( $post_id ) 27 && ( 28 ! $unique 29 || ! $wpdb->get_var( $wpdb->prepare( 30 "SELECT COUNT(*) FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s", 31 $post_id, 32 $meta_key 33 ) ) 34 ); 35 } ) 36 ); 37 38 if( ! count( $valid_post_ids ) ){ 39 return false; 40 } 41 42 // Sanitization 43 $meta_key = wp_unslash( $meta_key ); 44 $meta_value = sanitize_meta( $meta_key, wp_unslash( $meta_value ), 'post' ); 45 46 // Collect data and format strings for a single INSERT 47 $insert_data = []; 48 $insert_formats = []; 49 50 foreach( $valid_post_ids as $post_id ){ 51 array_push( $insert_data, $post_id, $meta_key, $meta_value ); 52 $insert_formats[] = '(%d, %s, %s)'; 53 } 54 55 $sql_string = "INSERT INTO $wpdb->postmeta (`post_id`, `meta_key`, `meta_value`) VALUES " 56 . implode( ', ', $insert_formats ); 57 58 // ... unpacks the array into separate arguments for prepare 59 $sql_query = $wpdb->prepare( $sql_string, ...$insert_data ); 60 61 return $wpdb->query( $sql_query ); 62 } 63 }
Qué ocurre aquí línea por línea. La comprobación !function_exists es una protección contra conflictos: si otro plugin ya ha declarado una función con ese nombre, no habrá error fatal. El bloque is_numeric($post_ids) pasa un solo ID a la función nativa add_post_meta, de modo que la misma función sirve tanto para una sola entrada como para un array. El filtro array_filter descarta los ID de borradores, registros eliminados y aquellos para los que el campo único ya existe. La sanitización mediante wp_unslash y sanitize_meta es obligatoria: sin ella, los datos serializados y los caracteres especiales romperán la consulta.
*Nota importante sobre ...$insert_data.* El operador ... (splat) desempaqueta el array en una lista plana de argumentos. Sin él, $wpdb->prepare recibiría un argumento de array en lugar de un conjunto de (%d, %s, %s), y la consulta fallaría con un error de recuento de marcadores de posición. PHP 5.6+ (WordPress requiere un mínimo de 7.0, así que está a salvo).
Cómo usarlo
Pase un array de ID de entrada, la clave y el valor como una llamada normal. El cuarto parámetro, la bandera de unicidad: true no añadirá el campo si ya existe para la entrada.
1 $post_ids = [ 1, 2, 3, 42, 108 ]; 2 $meta_key = 'featured_priority'; 3 $meta_value = 'high'; 4 $unique = false; // will set for all, even if the field already existed 5 6 add_multiple_posts_meta( $post_ids, $meta_key, $meta_value, $unique );
Es conveniente ejecutar una llamada así mediante el hook init (una vez, y luego eliminarla) o mediante WP-CLI con el comando wp eval-file. Después de la ejecución, asegúrese de eliminar el código de functions.php, de lo contrario la función se disparará en cada carga de página.
Método 2. Bucle sobre los ID con add_post_meta
Si no quiere tocar SQL directamente, use la función nativa add_post_meta en un bucle. El código es cuatro veces más corto y depende completamente del núcleo de WordPress.
1 $post_ids = [ 1, 2, 3, 42, 108 ]; 2 $meta_key = 'featured_priority'; 3 $meta_value = 'high'; 4 $unique = false; 5 6 foreach( $post_ids as $post_id ){ 7 add_post_meta( $post_id, $meta_key, $meta_value, $unique ); 8 }
El bucle itera sobre el array y llama a add_post_meta para cada ID. La propia función comprueba la existencia del registro, la unicidad de la clave (si se establece $unique = true) y la corrección de los datos; no se necesita validación adicional.
Rendimiento. Con un centenar de entradas, la diferencia con la consulta SQL es imperceptible. Pero si tiene 5.000 registros, cada llamada a add_post_meta genera una inserción separada, más los hooks internos (added_post_meta, update_post_meta_cache). Con esos volúmenes, el primer método con una sola consulta se ejecutará entre 10 y 20 veces más rápido.
Para operaciones puntuales con un par de docenas de entradas, use el bucle, no complique las cosas en exceso.
Comparación de enfoques
Criterio | Método 1 (SQL único) | Método 2 (bucle add_post_meta) |
|---|---|---|
Velocidad en 5.000 entradas | ~0,2 s (1 consulta) | ~3-6 s (5.000 consultas) |
Complejidad del código | ~50 líneas con validación | 4 líneas |
Seguridad | Necesita sanitización manual | add_post_meta lo gestiona todo |
Hooks de WordPress | No se llaman | added_post_meta, update_post_meta_cache |
Cuándo elegirlo | Migración masiva, importación CSV | Ediciones puntuales, hasta cien entradas |
Una regla universal: si hay menos de cien entradas y la operación es puntual, use el bucle. Si implica sincronización periódica o migración de miles de registros, solo la consulta directa con la función preparada.
⁉️🤔 Preguntas frecuentes
¿Puedo asignar un campo de forma selectiva, solo a entradas de una categoría específica?
Sí. Obtenga los ID de las entradas mediante get_posts con el parámetro 'category' => ID_рубрики, luego pase el array a cualquiera de los dos métodos anteriores. Para miles de entradas, añada 'numberposts' => -1 y 'fields' => 'ids'; la consulta devolverá solo un array de ID, sin cargar objetos.
Aquí tiene un ejemplo listo para usar:
$post_ids = get_posts( [ 'category' => 5, 'numberposts' => -1, 'fields' => 'ids', 'post_type' => 'post' ] );. Luego, llame aadd_multiple_posts_meta($post_ids, ...)o a un bucle conadd_post_meta.
¿Qué ocurre si necesito un valor de campo diferente para distintas entradas?
La inserción masiva no funcionará aquí. Construya un array asociativo [ ID_поста => значение ] e itere sobre él en un bucle con add_post_meta o update_post_meta. Un valor para todas, SQL; valores diferentes para distintas entradas, solo un bucle.
Para más de 50 entradas con valores únicos, use
update_post_metaen lugar deadd_post_meta: no crea duplicados si el campo ya existe.
¿Es seguro escribir consultas SQL directamente en wp_postmeta?
Es seguro bajo dos condiciones. Primera: pase siempre los datos por $wpdb->prepare; escapa caracteres especiales y bloquea inyecciones SQL. Segunda: haga una copia de seguridad completa de la base de datos antes de ejecutar. Un UPDATE incorrecto sin WHERE y wp_postmeta se vacía para todos los registros.
Comando de copia de seguridad mediante WP-CLI:
wp db export backup-before-meta.sql. Restauración:wp db import backup-before-meta.sql.
¿En qué se diferencia add_post_meta de update_post_meta?
add_post_meta añade una nueva fila a wp_postmeta, incluso si la clave ya existe para la entrada, lo que resulta en un duplicado. update_post_meta comprueba la existencia de la clave: si existe, actualiza el valor; si no, lo crea. Para la asignación masiva donde hay una clave por entrada, add_post_meta con $unique = true produce el mismo efecto.
En la práctica:
add_post_meta($id, 'views', 0, true)creará el campo una vez y no lo volverá a tocar.update_post_meta($id, 'views', $count)sobrescribirá el valor en cada llamada.
¿Dónde debo colocar el código, en el tema o en un plugin?
Para operaciones puntuales, en el functions.php del tema hijo, con eliminación inmediata después de la ejecución. Para tareas recurrentes, empaquételo como un plugin Must-Use (carpeta wp-content/mu-plugins/) o añádalo a Code Snippets con la bandera «Ejecutar una vez». El código en un tema activo sin eliminación impactará la base de datos en cada carga de página; eso es carga innecesaria.
Qué elegir para su tarea
La práctica muestra: 9 de cada 10 casos se cubren con el bucle con add_post_meta. Son cuatro líneas de código, una función nativa y ninguna sorpresa.
Una consulta SQL directa se justifica en dos situaciones: migración masiva (miles de entradas, el tiempo es valioso) y sincronización periódica donde usted controla la sanitización en la entrada. En caso contrario, no complique las cosas en exceso.
Qué hacer ahora mismo:
- Si necesita asignar un campo a ≤100 entradas, copie el bucle del segundo método, introduzca sus ID y ejecútelo.
- Si hay varios miles de entradas, tome la función del primer método, pero pruébela primero en una copia del sitio.
- En cualquier escenario, haga una copia de seguridad de la base de datos antes de ejecutar. Esto no es una precaución; es una regla.
¿Y qué método suele usar usted para añadir campos personalizados: mediante el panel de administración, código o un plugin como ACF? Escriba en los comentarios, es interesante comparar enfoques.

![🛠 Cómo añadir tu propio shortcode en WordPress: desglose de add_shortcode() [+2 ejemplos]](/api/media/file/ai-cover-1785346567950.avif)
