Come ottenere tutti i campi personalizzati di qualsiasi tipo di post
Ho diversi tipi di post. Voglio ottenere tutti i campi personalizzati associati a quel tipo di post.
Esempio:
Post
-- immagine
-- Immagine in evidenza
-- corpo
Ho bisogno di ottenere tutti i campi o campi personalizzati in un array. Ho trovato una soluzione da qui, ma non serve al mio scopo:
echo '<pre>';
print_r(get_post_custom($post_id));
echo '</pre>';

Funzionalità dei Post Type
Esistono diverse opzioni per ottenere una lista di "funzionalità" supportate da un particolare post type. La più semplice è utilizzare direttamente la funzione 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
* )
*/
Puoi anche usare post_type_supports()
per verificare se un post type supporta specifiche funzionalità.
Un altro modo per controllare le funzionalità di un post type è ottenere il suo oggetto post type e semplicemente verificare la proprietà $supports
:
$post_type_object = get_post_type_object( 'post' );
print_r( $post_type_object->supports );
Campi Personalizzati
Poiché i campi personalizzati sono meta-dati dei post associati su base post-by-post piuttosto che per post type, non esiste un modo diretto per recuperare una lista di nomi di campi personalizzati utilizzati da un particolare post type.
Piuttosto, dovresti compilare un array manualmente ciclando attraverso ogni post del post type in questione e utilizzando get_metadata( $post_id )
o get_post_custom_keys( $post_id )
per recuperare ogni campo personalizzato memorizzato per quel post. Questa è potenzialmente un'operazione molto costosa e dovrebbe essere eseguita il meno frequentemente possibile - se stai considerando di farlo più di una volta alla settimana o al mese, ti consiglio vivamente di valutare altri mezzi per raggiungere il tuo obiettivo finale.
Una query SQL personalizzata per determinare queste informazioni è anche possibile, e senza dubbio sarebbe significativamente più performante rispetto alla query dei meta-dati per ogni post di un post type.

Aggiungi il seguente codice nel file functions.php
per 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;
}
Questo ti darà l'array dei valori dei meta key per ACF.
Come usarlo
foreach(acf() as $key => $value){
update_post_meta(76, $value['type'], 'Steve');
}
Per Pods
function pods(){ global $wpdb; //ottieni l'ID dei post type di Pods
$result = $wpdb->get_results($wpdb->prepare(
"SELECT ID,post_title,post_parent FROM wp_posts WHERE post_type = %s", $type
), ARRAY_A);
// pods crea un post type separato per ogni campo, quindi eseguiamo un'altra query per ottenere i risultati dei field post type
$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);
Come usarlo
foreach($fields as $key => $value){
update_post_meta(76, $value, 'Steve');
}
Le funzioni acf() e pods() ti danno l'esatto meta key di quel post type. Se copi e incolli il codice potrebbe non funzionare.
Spero che questa risposta ti sia utile e anche ad altri.
Fammi sapere se hai problemi con qualcosa.
