Cum să obții toate câmpurile personalizate ale oricărui tip de postare
Am mai multe tipuri de postări. Vreau să obțin toate câmpurile personalizate asociate cu acel tip de postare.
Exemplu:
Postare
-- imagine
-- Imagine reprezentativă
-- conținut
Am nevoie să obțin toate câmpurile sau câmpurile personalizate într-un array. Am găsit o soluție de aici, dar nu servește scopului meu:
echo '<pre>';
print_r(get_post_custom($post_id));
echo '</pre>';

Caracteristicile Tipurilor de Postare
Există mai multe opțiuni pentru a obține o listă de "caracteristici" pe care un anumit tip de postare le suportă. Cea mai simplă este să folosești funcția get_all_post_type_supports()
:
$post_type_features = get_all_post_type_supports( 'post' );
print_r( $post_type_features );
/* Array
* (
* [0] => author
* [1] => editor
* [2] => thumbnail
* [3] => excerpt
* [4] => trackbacks
* [5] => custom-fields
* [6] => comments
* [7] => revisions
* [8] => post-formats
* [9] => title
* )
*/
Poți folosi și post_type_supports()
pentru a verifica dacă un tip de postare suportă anumite caracteristici specifice.
O altă metodă de a verifica caracteristicile unui tip de postare este să obții obiectul tipului de postare și să verifici proprietatea $supports
:
$post_type_object = get_post_type_object( 'post' );
print_r( $post_type_object->supports );
Câmpuri Personalizate
Deoarece câmpurile personalizate sunt meta-date asociate postării pe bază de postare și nu de tip de postare, nu există o modalitate directă de a obține o listă cu numele câmpurilor personalizate folosite de un anumit tip de postare.
În schimb, ar trebui să compili tu un array parcurgând fiecare postare din tipul de postare în cauză și folosind get_metadata( $post_id )
sau get_post_custom_keys( $post_id )
pentru a obține fiecare câmp personalizat stocat pentru acea postare. Aceasta este o operațiune foarte costisitoare și ar trebui efectuată cât mai rar posibil - dacă ai nevoie să faci asta mai des de o dată pe săptămână sau pe lună, recomand să te gândești la alte metode pentru a-ți atinge scopul.
De asemenea, este posibilă utilizarea unei interogări SQL personalizate pentru a determina aceste informații, care ar fi, fără îndoială, mult mai eficientă decât interogarea meta-datelor pentru fiecare postare a unui tip de postare.

Adaugă următorul cod în functions.php
pentru acf
function get_all_meta($type){
global $wpdb;
$result = $wpdb->get_results($wpdb->prepare(
"SELECT post_id,meta_key,meta_value FROM wp_posts,wp_postmeta WHERE post_type = %s
AND wp_posts.ID = wp_postmeta.post_id", $type
), ARRAY_A);
return $result;
}
function acf(){
$options = array();
$acf = get_all_meta('acf');
foreach($acf as $key => $value){
$options['post_type'][$value['post_id']]['post_id'] = $value['post_id'];
$test = substr($value['meta_key'], 0, 6);
if($test === 'field_'){
$post_types = maybe_unserialize( $value['meta_value'] );
$options['post_type'][$value['post_id']]['key'][] = $post_types['key'];
$options['post_type'][$value['post_id']]['key'][] = $post_types['name'];
$options['post_type'][$value['post_id']]['key'][] = $post_types['type'];
}
if($value['meta_key'] == 'rule'){
$post_types = maybe_unserialize( $value['meta_value'] );
$options['post_type'][$value['post_id']]['post_types'] = $post_types['value'];
}
}
return $options;
}
Acest cod va returna o matrice cu valorile meta key pentru acf.
Cum se utilizează
foreach(acf() as $key => $value){
update_post_meta(76, $value['type'], 'Steve');
}
Pentru pods
function pods(){ global $wpdb; //obține ID-ul post type-urilor pods.
$result = $wpdb->get_results($wpdb->prepare(
"SELECT ID,post_title,post_parent FROM wp_posts WHERE post_type = %s", $type
), ARRAY_A);
// pentru fiecare câmp al unui post type, pods creează un post type separat, deci interogăm din nou pentru a obține rezultatele post type-urilor câmpurilor.
$pods_field_post_type = array();
foreach($result as $value){
$pods_field_post_type = $wpdb->get_results($wpdb->prepare(
"SELECT ID,post_title,post_name FROM wp_posts WHERE post_type = %s
AND post_parent = %d
", '_pods_field',$value["ID"]
), ARRAY_A);
}
$fields = array();
foreach($pods_field_post_type as key => $value):
$podsAPI = new PodsAPI();
$pod = $podsAPI->load_pod( array( 'name' => '
post' ));
$fields[] = $pod['fields'][$value['post_name']]['type'];
endforeach;
}
print_r($fields);
Cum se utilizează
foreach($fields as $key => $value){
update_post_meta(76, $value, 'Steve');
}
Funcțiile acf() și pods() vă oferă exact meta key-ul acelui post type. Dacă copiați și lipiți codul, este posibil să nu funcționeze.
Sper că acest răspuns vă va ajuta pe voi și pe alții.
Anunțați-mă dacă întâmpinați probleme.
