cómo mostrar datos personalizados de tipos de publicaciones personalizadas

4 minutos de lectura

avatar de usuario
Prusprus

He creado un tipo de publicación personalizada. Se cargará bien en el panel de WordPress y también podré guardarlo. Ahora digamos que es un tipo de publicación personalizada que contiene datos para algunas cadenas y algunas fechas.

Quiero poder recuperar estos tipos de publicaciones personalizadas (lo que hice usando WP_Query y especificando post_type en el nombre de mi tipo de publicación personalizada). Cuando llamo a print_r en el objeto devuelto, en ninguna parte del objeto se almacenan los datos personalizados (cadenas y fechas). ¿Cómo los recuperaría de la base de datos?

He buscado durante horas y no he encontrado ningún método para recuperar estos datos.

Según lo solicitado: Así es como se almacenan los datos:

function update_obituary(){
    global $post;
    update_post_meta($post->ID, "first_name", $_POST["first_name"]);
    update_post_meta($post->ID, "last_name", $_POST["last_name"]);
    update_post_meta($post->ID, "birth_date", $_POST["birth_date"]);
    update_post_meta($post->ID, "death_date", $_POST["death_date"]);
    update_post_meta($post->ID, "publication_date", $_POST["publication_date"]);
}

Esta función está vinculada al gancho ‘save_post’. Los datos se volverán a mostrar cuando vuelva a abrir la instancia de tipo de publicación personalizada en el modo de edición. Eso significa que está almacenado en la base de datos, ¿verdad?

  • Por favor agregue algo de código. ¿Cómo se almacenan los metadatos adicionales?

    – Johannes Pille

    4 de noviembre de 2011 a las 20:16

avatar de usuario
johannes pille

Si los metadatos aparecen al editar publicaciones de este tipo, entonces sí, debe haberse almacenado correctamente en la base de datos.

Hay dos funciones wp para recuperar los metadatos del tipo de publicación personalizada: get_post_custom_values y get_post_meta. La diferencia es que get_post_custom_values puede acceder a campos personalizados no únicos, es decir, aquellos con más de un valor asociado con una sola clave. Sin embargo, también puede optar por usarlo para campos únicos: cuestión de gusto.

Suponiendo que su tipo de publicación se llame “obituario”:

// First lets set some arguments for the query:
// Optionally, those could of course go directly into the query,
// especially, if you have no others but post type.
$args = array(
    'post_type' => 'obituary',
    'posts_per_page' => 5
    // Several more arguments could go here. Last one without a comma.
);

// Query the posts:
$obituary_query = new WP_Query($args);

// Loop through the obituaries:
while ($obituary_query->have_posts()) : $obituary_query->the_post();
    // Echo some markup
    echo '<p>';
    // As with regular posts, you can use all normal display functions, such as
    the_title();
    // Within the loop, you can access custom fields like so:
    echo get_post_meta($post->ID, 'birth_date', true); 
    // Or like so:
    $birth_date = get_post_custom_values('birth_date');
    echo $birth_date[0];
    echo '</p>'; // Markup closing tags.
endwhile;

// Reset Post Data
wp_reset_postdata();

Una palabra de precaución, para evitar confusiones: Omitir el booleano en get_post_meta hará que devuelva una matriz en lugar de una cadena. get_post_custom_values siempre devuelve una matriz, razón por la cual, en el ejemplo anterior, estamos haciendo eco de la $birth_date[0]más bien que $birth_date.

Además, no estoy 100% seguro en este momento, si $post->ID funcionará como se esperaba en lo anterior. Si no, reemplácelo con get_the_ID(). Ambos deberían funcionar, uno lo hará seguro. Podría probar eso, pero ahorrándome el tiempo…

En aras de la exhaustividad, consulte el códice en WP_Query para más argumentos de consulta y uso correcto.

  • ¡Gracias! ¡Esto es genial! Con suerte, otros como yo atrapados tratando de encontrar información caerán en esta página 🙂

    – Prusprus

    5 de noviembre de 2011 a las 23:11

  • ¡Agradable! Tenía curiosidad sobre cómo hacer esto yo mismo, respuesta muy útil

    – Alex

    25 de enero de 2017 a las 11:32

  • Sorprendido de recibir un comentario sobre una respuesta que data de hace más de 5 años. Sin embargo, al leerlo de nuevo, esta parte de la API de WP no cambió mucho: esta información sigue siendo cierta.

    – Johannes Pille

    25 de enero de 2017 a las 11:41

¿Ha sido útil esta solución?