Código PHP: Como mostrar metadatos de entradas? Guia completa sobre Metadata API, rendimiento, seguridad e integración con Gutenberg.
ES

Como mostrar valores de campos personalizados en WordPress (guía 2026)

5.00 /5 - (26 votes )
Última verificación: 1 de mayo de 2026
5min de lectura
Guía
Desarrollador full-stack

#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: true retorna un valor único, false retorna 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_query funciona 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:

  1. Use get_post_meta() como función base para obtener metadatos
  2. Siempre escape la salida con esc_html(), esc_url(), etc.
  3. Sanitice al guardar con sanitize_text_field(), absint(), etc.
  4. Verifique nonces en formularios para seguridad
  5. Considere el rendimiento de meta_query en sitios grandes
  6. 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.

Siguiente paso

Transforma el artículo en una implementación real

Este bloque refuerza el enlazado interno y lleva al lector al siguiente paso más útil dentro de la arquitectura del sitio.

¿Quieres implementar esto en tu sitio?

Si quieres transformar el artículo en mejoras concretas, rediseño o un plan de implementación, puedo cerrar el alcance y ejecutar.

Cluster relacionado

Explora otros servicios WordPress y base de conocimiento

Refuerza tu negocio con soporte técnico profesional en áreas clave del ecosistema WordPress.

FAQ del artículo

Preguntas Frecuentes

Respuestas prácticas para aplicar el tema en la ejecución real.

SEO-ready GEO-ready AEO-ready 4 Q&A
Cuanto tiempo tarda implementar este tutorial?
La mayoria de los lectores completan este tutorial en 30-60 minutos. Implementaciones complejas pueden requerir 2-3 horas incluyendo pruebas.
Que requisitos previos necesito antes de comenzar?
Necesitara un sitio WordPress (versión 6.0+ recomendada), acceso de administrador y familiaridad básica con PHP y el panel de WordPress.
Puedo deshacer los cambios si algo sale mal?
Si, siempre haga backup de su sitio antes de hacer cambios. La mayoria de los cambios son reversibles eliminando el código agregado.
Esto afectara el SEO o rendimiento de mi sitio?
Estas técnicas estan optimizadas para rendimiento. Los meta_query pesados pueden impactar sitios con millones de entradas, pero para la mayoria de sitios el impacto es minimo.

¿Necesitas un FAQ adaptado a tu sector y mercado? Preparamos una versión alineada con tus objetivos de negocio.

Hablemos

Artículos Relacionados

has_term() e is_tax() se confunden a menudo. Consulta la guía completa sobre lógica condicional para categorías, etiquetas y taxonomías personalizadas.
development

Comprobar si una entrada pertenece a un termino de taxonomía

has_term() e is_tax() se confunden a menudo. Consulta la guía completa sobre lógica condicional para categorías, etiquetas y taxonomías personalizadas.

Deja de escribir sentencias if desordenadas. Aprende la diferencia entre in_category y has_term, como manejar categorías hijas recursivas eficientemente y optimizar tus etiquetas condicionales.
development

Lógica condicional de WordPress para taxonomías

Deja de escribir sentencias if desordenadas. Aprende la diferencia entre in_category y has_term, como manejar categorías hijas recursivas eficientemente y optimizar tus etiquetas condicionales.

Notas prácticas sobre WP_Query: cuándo get_posts gana a new WP_Query, por qué meta_query sobre claves no indexadas colapsa a escala, y cómo paginar loops personalizados sin caer en 404.
development

Una guía práctica de WP_Query y el Loop (edición de rendimiento 2026)

Notas prácticas sobre WP_Query: cuándo get_posts gana a new WP_Query, por qué meta_query sobre claves no indexadas colapsa a escala, y cómo paginar loops personalizados sin caer en 404.