Returnează toate datele meta personalizate pentru un tip de postare personalizat
Am configurat un tip de postare personalizată care are trei câmpuri meta personalizate: nume, latitudine, longitudine. Fiecare postare afișează deja numele pe o hartă integrată bazată pe latitudinea și longitudinea sa.
Acum aș dori să adaug o pagină site-ului meu care să afișeze TOATE numele pe o hartă pe baza latitudinii și longitudinii lor.
Evident, știu cum să extrag valori individuale și să le afișez pe hartă, dar nu am atât de multă experiență în WordPress, așa că nu sunt sigur care ar fi cea mai bună modalitate de a extrage toate aceste informații într-un mod structurat pentru ceea ce încerc să fac. Orice sugestii pentru a mă ajuta să încep ar fi apreciate.
Dacă toate articolele din tipul tău personalizat de postări au toate câmpurile meta de care ai nevoie, atunci poți folosi argumentul fields
și să îl setezi la ids
, ceea ce va funcționa mult mai rapid, de exemplu:
//obține ID-urile postărilor personalizate ca un array
$posts = get_posts(array(
'post_type' => 'your_post_type',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids'
)
);
//iterează prin fiecare postare
foreach($posts as $p){
//obține metadatele necesare pentru fiecare postare
$long = get_post_meta($p,"longitude-key",true);
$lati = get_post_meta($p,"latitude-key",true);
$name = get_post_meta($p,"name-key",true);
//fă ce dorești cu acestea
}

Bainternet, cu unele modificări la codul tău am reușit să obțin cel puțin toate informațiile de pe pagina mea. Mai am câteva probleme minore, dar se pare că voi reuși să fac asta să funcționeze acum.

Poate o întrebare rapidă de follow-up. În loc de get_post_meta
, am folosit $name = get_the_term_list($p, "name-key",true);
pentru a obține una dintre valorile mele. Dar asta continuă să adauge un "1" în fața numelui. Nu știu de unde vine.

Asta se întâmplă pentru că get_the_term_list
este folosit pentru a obține o listă de termeni dintr-o taxonomie și nu meta-ul unui post.

Acest cod vă va oferi toate articolele care au o longitudine, latitudine și nume asignate. Apoi puteți parcurge lista pentru a afișa rezultatele sau pentru alte operații.
$args = array(
// elemente de bază
'post_type' => 'your_post_type',
'post_status' => 'publish',
// interogare meta
'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 );
Desigur, va trebui să modificați acest cod și vă recomand să citiți documentația WP_Query
pentru a-l ajusta exact după necesități, dar acesta vă va rezolva problema. Dacă folosiți acest cod într-un șablon, totul ar trebui să fie foarte simplu.

Mulțumesc, când am afișat array-ul returnat, nu am obținut exact ceea ce mă așteptam. Cred că va trebui să verific din nou acest lucru.

Asta ar trebui să îți returneze un array de obiecte post din tipul de post setat, unde longitude-key
, latitude-key
și name-key
nu sunt goale. Nu funcționează așa?

Deocamdată am eliminat name-key
și am testat codul. Am afișat array-ul returnat și l-am copiat în pastebin pentru a-ți arăta rezultatul.
http://pastebin.com/uhQHSths

De ce să nu folosești get_metadata()?
Dacă transmiți parametrii corespunzători, vei obține toate atributele meta ale unui articol (personalizate sau nu).
Exemplu:
$META_ATTRIBUTES = get_metadata( 'post', get_the_ID(), '', true );
Reține că nu am folosit numele mașinii CPT ca prim parametru; trebuie să folosești 'post' sau funcția nu va returna nimic.
Setând al treilea parametru (meta key) ca un șir gol, îi spui funcției să returneze toate atributele meta ale articolului.

Acesta este cel mai bun mod de a obține valorile meta în tipurile personalizate de postări. Includeți acest cod în function.php pentru a adăuga un array metaval la răspuns, incluzând toate valorile meta.
add_action( 'rest_api_init', 'create_api_posts_meta_field' );
function create_api_posts_meta_field() {
// register_rest_field ( 'numele-tipului-de-postare', 'numele-campului-de-retur', array-de-callback-si-schema() )
register_rest_field( 'tour', 'metaval', array(
'get_callback' => 'get_post_meta_for_api',
'schema' => null,
)
);
}
function get_post_meta_for_api( $object ) {
//obține ID-ul din array-ul obiectului postării
$post_id = $object['id'];
//returnează meta datele postării
return get_post_meta( $post_id );
}

Aici prezentăm un exemplu de afișare relativă a unui tip de postare personalizată în WordPress, iar în acest cod avem argumente în array și folosim wp_query cu bucla pentru a obține datele postărilor.
$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;
