Come ottenere tutti i campi personalizzati di qualsiasi tipo di post

17 mar 2017, 13:35:31
Visualizzazioni: 19.9K
Voti: 8

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>';
8
Commenti

Ho bisogno di tutti i campi con un tipo di post. Potrebbe essere l'immagine in evidenza o il corpo, un campo personalizzato. Non per il post. :)

es: array( 'post_type'=>array('image,body,title,featured_image')) Il tipo di post potrebbe essere una pagina, un post o qualsiasi altra cosa.

Spero sia chiaro ora.

user115277 user115277
17 mar 2017 17:43:16

Hai un pezzo di codice, di nuovo? Un frammento da mostrarci. Qui nessuno scriverà codice per te.

Max Yudin Max Yudin
17 mar 2017 19:17:31

Non sto codificando nulla. Ho bisogno di un'idea. Non sto chiedendo a nessuno di codificare per me. Ho cercato molto per trovare soluzioni. Ora sto cercando nel core di WordPress come recuperano i campi con altri campi personalizzati in un post o pagina. Se trovo qualcosa, risponderò qui.

Grazie

user115277 user115277
17 mar 2017 19:33:11

Per favore, inserisci il tuo codice per trovare gli errori. Altrimenti cancellerò il tuo post in quanto non soddisfa i requisiti di questo sito.

Max Yudin Max Yudin
17 mar 2017 19:47:38

Ok, puoi farlo. Non sei in grado di capire ciò che voglio... :)

user115277 user115277
17 mar 2017 20:28:24

Dovresti chiarire la tua domanda. Penso che tu voglia i campi personalizzati registrati e altri campi predefiniti per un custom post type. Se è così, è possibile. Se usi ACF o Pods, o Types posso darti delle soluzioni. Perché mantengono un log nel database e puoi facilmente ottenere i valori dal database usando una query. La soluzione è complessa e se non conosci la struttura di WordPress, non puoi raggiungere questa soluzione.

Faysal Mahamud Faysal Mahamud
23 mar 2017 09:03:03

@user115277 fammi sapere se ho interpretato correttamente la tua domanda con la mia risposta, e modificherò la tua domanda per chiarire eventuali dubbi

bosco bosco
25 mar 2017 05:50:43

grazie, @bosco entrambe le soluzioni mi sono state molto utili. In realtà mi servivano tutti i campi personalizzati associati a un post type utilizzando Advanced Custom Fields (ACF).

user115277 user115277
25 mar 2017 10:56:06
Mostra i restanti 3 commenti
Tutte le risposte alla domanda 2
0

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.

25 mar 2017 05:38:40
0

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.

23 mar 2017 09:25:52