Recuperare tutti i meta dati personalizzati per un tipo di post personalizzato

11 mar 2012, 17:08:08
Visualizzazioni: 43.6K
Voti: 8

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
0
Tutte le risposte alla domanda 5
5
15

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

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.

WouterB WouterB
12 mar 2012 16:21:26

Felice di aver potuto aiutare

Bainternet Bainternet
12 mar 2012 16:33:50

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.

WouterB WouterB
12 mar 2012 17:35:56

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

Bainternet Bainternet
12 mar 2012 18:05:41

Sì, avevo bisogno di un singolo termine di una tassonomia. Restituisce il valore, ma anche un "1" e lo fa in ogni istanza restituita dal ciclo foreach.

WouterB WouterB
12 mar 2012 18:34:44
4

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.

11 mar 2012 18:01:22
Commenti

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

WouterB WouterB
11 mar 2012 19:49:18

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

mor7ifer mor7ifer
11 mar 2012 20:01:56

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

WouterB WouterB
12 mar 2012 13:11:29

Sembra che la query non venga eseguita, prova a dichiarare l'oggetto WP_Query separatamente e poi esegui il metodo query() con $args.

mor7ifer mor7ifer
12 mar 2012 23:42:47
0

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.

1 set 2013 18:26:08
0

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

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