Recuperare tutti i meta dati personalizzati per un tipo di post personalizzato
Ho configurato un tipo di post personalizzato che ha tre campi meta personalizzati: nome, latitudine, longitudine. Ogni post mostra già il nome su una mappa integrata basata sulla sua latitudine e longitudine.
Ora vorrei aggiungere una pagina al mio sito che mostri TUTTI i nomi su una mappa basata sulle loro latitudini e longitudini.
Ovviamente so come estrarre singoli valori e visualizzarli su una mappa, ma non ho molta esperienza con WordPress quindi non sono sicuro di quale sia il modo migliore per ottenere tutte queste informazioni in modo strutturato per quello che sto cercando di fare. Qualsiasi suggerimento per iniziare sarebbe apprezzato.
Ecco un esempio di codice per recuperare tutti i post e i relativi meta dati:
// Recupera tutti i post del tuo custom post type
$args = array(
'post_type' => 'il_tuo_custom_post_type',
'posts_per_page' => -1 // Recupera tutti i post
);
$query = new WP_Query($args);
// Array per memorizzare tutti i dati
$locations = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Recupera i meta dati per ogni post
$name = get_post_meta(get_the_ID(), 'name', true);
$latitude = get_post_meta(get_the_ID(), 'latitude', true);
$longitude = get_post_meta(get_the_ID(), 'longitude', true);
// Aggiungi i dati all'array
$locations[] = array(
'name' => $name,
'lat' => $latitude,
'lng' => $longitude
);
}
}
// Ripristina i dati originali del post
wp_reset_postdata();
// Ora $locations contiene tutti i dati che puoi utilizzare per la tua mappa
Se tutti i tuoi post di tipo personalizzato hanno tutti i campi meta di cui hai bisogno, puoi utilizzare l'argomento fields
e impostarlo su ids
che funzionerà molto più velocemente, ad esempio:
//ottieni gli ID dei tuoi post personalizzati come array
$posts = get_posts(array(
'post_type' => 'your_post_type',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids'
)
);
//cicla su ogni post
foreach($posts as $p){
//recupera i meta di cui hai bisogno per ogni post
$long = get_post_meta($p,"longitude-key",true);
$lati = get_post_meta($p,"latitude-key",true);
$name = get_post_meta($p,"name-key",true);
//fai ciò che vuoi con questi dati
}

Bainternet, con alcune modifiche al tuo codice sono riuscito ad ottenere almeno tutte le informazioni sulla mia pagina. Ho ancora qualche piccolo problema, ma sembra che ora riuscirò a far funzionare tutto.

Forse una rapida domanda di follow-up. Invece di get_post_meta
, ho usato $name = get_the_term_list($p, "name-key",true);
per ottenere uno dei miei valori. Però continua ad aggiungere un "1" davanti al nome. Non ho idea da dove provenga.

Questo perché get_the_term_list
viene utilizzato per ottenere un elenco di termini di una tassonomia e non i meta di un post.

Questo codice ti fornirà tutti i post con longitudine, latitudine e nome assegnati. Potrai poi eseguire un ciclo attraverso di essi per generare l'output e simili.
$args = array(
// elementi base
'post_type' => 'your_post_type',
'post_status' => 'publish',
// meta query
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'longitude-key',
'value' => '',
'compare' => 'NOT'
),
array(
'key' => 'latitude-key',
'value' => '',
'compare' => 'NOT'
),
array(
'key' => 'name-key',
'value' => '',
'compare' => 'NOT'
),
)
);
$posts = new WP_Query( $args );
Naturalmente dovrai modificarlo, e ti consiglio vivamente di leggere la documentazione di WP_Query
per personalizzarlo esattamente come desideri, ma questo codice farà al caso tuo. Se lo utilizzi in un template, il tutto dovrebbe essere un gioco da ragazzi.

Grazie, quando ho stampato l'array restituito, non era esattamente quello che mi aspettavo. Immagino che dovrò ricontrollare.

Dovrebbe restituirti un array di oggetti post del tipo di post specificato dove longitude-key
, latitude-key
e name-key
non sono vuoti. Non funziona così?

Per ora ho rimosso name-key
e testato il codice. Ho stampato l'array restituito e copiato il risultato su pastebin per farti vedere cosa restituisce.
http://pastebin.com/uhQHSths

Perché non usare get_metadata()?
Se passi i parametri corretti, ottieni tutti gli attributi meta di un post (personalizzati o meno).
Esempio:
$META_ATTRIBUTES = get_metadata( 'post', get_the_ID(), '', true );
Nota che non ho usato il nome della mia macchina CPT come primo parametro; devi usare 'post' altrimenti la funzione non restituirà nulla.
Impostando il terzo parametro (meta key) come stringa vuota stai dicendo alla funzione di recuperare tutti gli attributi meta del post.

Questo è il modo migliore per ottenere i valori meta nei Custom post types. Includi questo codice in function.php per aggiungere un array metaval alla risposta che include tutti i valori meta.
add_action( 'rest_api_init', 'create_api_posts_meta_field' );
function create_api_posts_meta_field() {
// register_rest_field ( 'nome-del-post-type', 'nome-del-campo-da-restituire', array-di-callback-e-schema() )
register_rest_field( 'tour', 'metaval', array(
'get_callback' => 'get_post_meta_for_api',
'schema' => null,
)
);
}
function get_post_meta_for_api( $object ) {
//ottieni l'id dall'array dell'oggetto post
$post_id = $object['id'];
//restituisci i post meta
return get_post_meta( $post_id );
}

Qui mostriamo un esempio per visualizzare un tipo di post personalizzato in WordPress e in questo codice abbiamo argomenti in array e utilizziamo wp_query con il ciclo per ottenere i dati del post.
$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;
