Obtener todos los metadatos personalizados para un tipo de entrada personalizada

11 mar 2012, 17:08:08
Vistas: 43.6K
Votos: 8

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.

0
Todas las respuestas a la pregunta 5
5
15

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
}
12 mar 2012 14:07:35
Comentarios

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.

WouterB WouterB
12 mar 2012 16:21:26

Me alegra haber podido ayudar

Bainternet Bainternet
12 mar 2012 16:33:50

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.

WouterB WouterB
12 mar 2012 17:35:56

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.

Bainternet Bainternet
12 mar 2012 18:05:41

Sí, necesitaba un único término de una taxonomía. Devuelve el valor, pero también un "1" y lo hace en cada instancia devuelta por el bucle foreach.

WouterB WouterB
12 mar 2012 18:34:44
4

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.

11 mar 2012 18:01:22
Comentarios

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

WouterB WouterB
11 mar 2012 19:49:18

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í?

mor7ifer mor7ifer
11 mar 2012 20:01:56

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

WouterB WouterB
12 mar 2012 13:11:29

Parece que la consulta no se está ejecutando, intenta declarar el objeto WP_Query por separado y luego ejecuta el método query() con $args.

mor7ifer mor7ifer
12 mar 2012 23:42:47
0

¿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.

1 sept 2013 18:26:08
0

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 );
}
14 nov 2017 10:37:48
0

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;
22 jul 2020 16:12:45