Los campos personalizados de WordPress: La base del contenido estructurado
Conozca más sobre el desarrollo profesional de WordPress en WPPoland.
Los campos personalizados (Custom Fields) son una de las características más poderosas de WordPress. Permiten almacenar datos adicionales asociados a cualquier entrada, página o tipo de contenido personalizado. Desde precios de productos hasta fechas de eventos, los campos personalizados extienden WordPress más alla de un simple blog.
La función fundamental: get_post_meta()
get_post_meta() es la puerta de entrada a todos los metadatos de una entrada. Acepta tres parametros:
$valor = get_post_meta($post_id, 'nombre_campo', $single);
- $post_id: El ID de la entrada (use
get_the_ID()dentro del Loop) - ‘nombre_campo’: La clave del campo personalizado
- $single:
trueretorna un valor único,falseretorna un array
Ejemplo básico: Mostrar un campo personalizado
// Dentro del Loop de WordPress
$precio = get_post_meta(get_the_ID(), 'precio_producto', true);
if ($precio) {
echo '<div class="precio">';
echo '<strong>Precio:</strong> ' . esc_html($precio) . ' EUR';
echo '</div>';
}
Mostrar multiples campos personalizados
// Obtener todos los metadatos de una entrada
$todos_los_meta = get_post_meta(get_the_ID());
// O obtener campos específicos
$campos = [
'precio' => 'Precio',
'ubicacion' => 'Ubicacion',
'fecha_evento' => 'Fecha del evento',
'capacidad' => 'Capacidad',
];
echo '<dl class="detalles-evento">';
foreach ($campos as $key => $label) {
$valor = get_post_meta(get_the_ID(), $key, true);
if ($valor) {
echo '<dt>' . esc_html($label) . '</dt>';
echo '<dd>' . esc_html($valor) . '</dd>';
}
}
echo '</dl>';
Seguridad: Sanitizacion y escape
Nunca confie en los datos de campos personalizados sin sanitizar y escapar adecuadamente.
Escapar en la salida
// Para texto plano
echo esc_html($valor);
// Para URLs
echo esc_url($valor);
// Para atributos HTML
echo esc_attr($valor);
// Para contenido HTML (permite etiquetas seguras)
echo wp_kses_post($valor);
Sanitizar al guardar
// Guardar campo de texto
update_post_meta($post_id, 'título', sanitize_text_field($_POST['título']));
// Guardar URL
update_post_meta($post_id, 'enlace', esc_url_raw($_POST['enlace']));
// Guardar número entero
update_post_meta($post_id, 'cantidad', absint($_POST['cantidad']));
// Guardar email
update_post_meta($post_id, 'correo', sanitize_email($_POST['correo']));
Filtrar entradas por campos personalizados
Use WP_Query con meta_query para filtrar entradas basandose en valores de campos personalizados:
$args = [
'post_type' => 'evento',
'meta_query' => [
'relation' => 'AND',
[
'key' => 'fecha_evento',
'value' => date('Y-m-d'),
'compare' => '>=',
'type' => 'DATE',
],
[
'key' => 'ciudad',
'value' => 'Madrid',
'compare' => '=',
],
],
'orderby' => 'meta_value',
'meta_key' => 'fecha_evento',
'order' => 'ASC',
];
$query = new WP_Query($args);
Consideraciones de rendimiento
Las consultas meta_query generan JOINs SQL que pueden ser costosos:
- Para sitios pequeños (<10.000 entradas):
meta_queryfunciona bien - Para sitios medianos (10.000-100.000): Agregue indices personalizados a
wp_postmeta - Para sitios grandes (100.000+): Considere tablas personalizadas o Elasticsearch
-- Agregar indice para acelerar consultas meta
CREATE INDEX idx_postmeta_key_value
ON wp_postmeta (meta_key, meta_value(50));
Guardar campos personalizados desde el editor
Metabox personalizado
// Registrar metabox
add_action('add_meta_boxes', function() {
add_meta_box(
'detalles_evento',
'Detalles del Evento',
'renderizar_metabox_evento',
'evento',
'normal',
'high'
);
});
// Renderizar metabox
function renderizar_metabox_evento($post) {
wp_nonce_field('guardar_evento', 'evento_nonce');
$precio = get_post_meta($post->ID, 'precio', true);
$fecha = get_post_meta($post->ID, 'fecha_evento', true);
echo '<p>';
echo '<label for="precio">Precio (EUR):</label>';
echo '<input type="number" id="precio" name="precio" value="' . esc_attr($precio) . '">';
echo '</p>';
echo '<p>';
echo '<label for="fecha_evento">Fecha:</label>';
echo '<input type="date" id="fecha_evento" name="fecha_evento" value="' . esc_attr($fecha) . '">';
echo '</p>';
}
// Guardar metabox
add_action('save_post_evento', function($post_id) {
if (!isset($_POST['evento_nonce']) ||
!wp_verify_nonce($_POST['evento_nonce'], 'guardar_evento')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!current_user_can('edit_post', $post_id)) return;
if (isset($_POST['precio'])) {
update_post_meta($post_id, 'precio', absint($_POST['precio']));
}
if (isset($_POST['fecha_evento'])) {
update_post_meta($post_id, 'fecha_evento', sanitize_text_field($_POST['fecha_evento']));
}
});
Integración con ACF (Advanced Custom Fields)
ACF simplifica enormemente el trabajo con campos personalizados. En lugar de get_post_meta(), puede usar las funciones de ACF:
// ACF: obtener campo
$valor = get_field('nombre_campo');
// ACF: mostrar campo directamente
the_field('nombre_campo');
// ACF: obtener campo de imagen (retorna array)
$imagen = get_field('imagen_destacada');
if ($imagen) {
echo '<img src="' . esc_url($imagen['url']) . '"
alt="' . esc_attr($imagen['alt']) . '"
width="' . esc_attr($imagen['width']) . '"
height="' . esc_attr($imagen['height']) . '">';
}
Campos personalizados en la REST API
Exponga campos personalizados a través de la REST API para integraciones headless:
add_action('rest_api_init', function() {
register_rest_field('evento', 'precio', [
'get_callback' => function($post) {
return get_post_meta($post['id'], 'precio', true);
},
'update_callback' => function($value, $post) {
update_post_meta($post->ID, 'precio', absint($value));
},
'schema' => [
'type' => 'integer',
'description' => 'Precio del evento en EUR',
],
]);
});
Resumen
Los campos personalizados son esenciales para cualquier proyecto WordPress que vaya más alla de un blog simple:
- Use
get_post_meta()como función base para obtener metadatos - Siempre escape la salida con
esc_html(),esc_url(), etc. - Sanitice al guardar con
sanitize_text_field(),absint(), etc. - Verifique nonces en formularios para seguridad
- Considere el rendimiento de
meta_queryen sitios grandes - Use ACF para interfaces de edicion más ricas sin escribir metaboxes manualmente
Conozca más sobre los servicios de desarrollo WordPress y el rediseño WordPress en WPPoland.

