Obtener todos los metadatos personalizados para un tipo de entrada personalizada
He configurado un tipo de entrada personalizada que tiene tres campos meta personalizados: nombre, latitud y longitud. Cada entrada ya muestra el nombre en un mapa integrado basado en su latitud y longitud.
Ahora me gustaría agregar una página a mi sitio que muestre TODOS los nombres en un mapa basado en sus latitudes y longitudes.
Obviamente sé cómo obtener valores individuales y mostrarlos en un mapa, pero no tengo tanta experiencia en WordPress, así que no estoy seguro de cuál sería la mejor manera de obtener toda esta información de forma estructurada para lo que estoy tratando de hacer. Agradecería cualquier orientación para empezar.
Si todos los posts de tu tipo de entrada personalizada tienen todos los campos meta que necesitas, entonces puedes usar el argumento fields
y establecerlo como ids
, lo cual funcionará mucho más rápido, por ejemplo:
//obtener los IDs de tus entradas personalizadas como un array
$posts = get_posts(array(
'post_type' => 'tu_tipo_de_post',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids'
)
);
//iterar sobre cada post
foreach($posts as $p){
//obtener los meta que necesitas de cada post
$long = get_post_meta($p,"clave-longitud",true);
$lati = get_post_meta($p,"clave-latitud",true);
$name = get_post_meta($p,"clave-nombre",true);
//hacer lo que necesites con ellos
}

Bainternet, con algunos ajustes a tu código he logrado obtener al menos toda la información en mi página. Todavía tengo algunos problemas menores, pero parece que podré hacer que esto funcione ahora.

Tal vez una pregunta rápida de seguimiento. En lugar de get_post_meta
, usé $name = get_the_term_list($p, "name-key",true);
para obtener uno de mis valores. Sin embargo, esto sigue agregando un "1" delante del nombre. No tengo idea de dónde viene.

Eso es porque get_the_term_list
se usa para obtener una lista de términos de una taxonomía y no los meta de un post.

Este código te proporcionará todas las publicaciones que tengan asignadas una longitud, latitud y nombre. Luego puedes iterar a través de ellas para generar tu salida y demás.
$args = array(
// básicos
'post_type' => 'tu_tipo_de_publicacion',
'post_status' => 'publish',
// consulta de metadatos
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'clave-de-longitud',
'value' => '',
'compare' => 'NOT'
),
array(
'key' => 'clave-de-latitud',
'value' => '',
'compare' => 'NOT'
),
array(
'key' => 'clave-de-nombre',
'value' => '',
'compare' => 'NOT'
),
)
);
$posts = new WP_Query( $args );
Naturalmente, vas a necesitar modificar esto, y recomiendo encarecidamente leer la documentación de WP_Query
para ajustarlo exactamente como lo necesites, pero esto te servirá como base. Si usas esto en una plantilla, todo debería ser pan comido.

Gracias, al imprimir el array devuelto, no obtuve exactamente lo que esperaba. Supongo que tendré que revisarlo de nuevo.

Eso debería darte un array de objetos de post en el tipo de publicación establecido donde longitude-key
, latitude-key
, y name-key
no estén vacíos. ¿No es así?

Por ahora quité el name-key
y probé el código. He impreso el array devuelto, y copié y pegué el resultado en pastebin para que puedas ver lo que devuelve.
http://pastebin.com/uhQHSths

¿Por qué no usar get_metadata()?
Si pasas los parámetros correctos, obtendrás todos los atributos meta de un post (personalizados o no).
Ejemplo:
$META_ATTRIBUTES = get_metadata( 'post', get_the_ID(), '', true );
Nota que no usé el nombre de mi CPT como primer parámetro; debes usar 'post' o la función no devolverá nada.
Al establecer el tercer parámetro (meta key) como una cadena vacía, le estás indicando a la función que recupere todos los atributos meta del post.

Esta es la mejor manera de obtener valores meta en Custom post types. Incluye este código en function.php para añadir un array metaval a la respuesta que incluya todos los valores meta.
add_action( 'rest_api_init', 'create_api_posts_meta_field' );
function create_api_posts_meta_field() {
// register_rest_field ( 'nombre-del-tipo-de-post', 'nombre-del-campo-a-retornar', array-de-callbacks-y-esquema() )
register_rest_field( 'tour', 'metaval', array(
'get_callback' => 'get_post_meta_for_api',
'schema' => null,
)
);
}
function get_post_meta_for_api( $object ) {
//obtener el id del array del objeto post
$post_id = $object['id'];
//retornar los meta datos del post
return get_post_meta( $post_id );
}

Aquí mostramos un ejemplo para mostrar relativamente un tipo de entrada personalizado (custom post type) en WordPress. Este código contiene argumentos en arreglos y utiliza wp_query con el ciclo (loop) para obtener los datos de las entradas.
$args = array(
'post_status' => 'publish',
'posts_per_page' => 5,
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
the_title();
the_excerpt();
endwhile;
