Cum să obții toate câmpurile personalizate ale oricărui tip de postare

17 mar. 2017, 13:35:31
Vizualizări: 19.9K
Voturi: 8

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

Am nevoie de toate câmpurile pentru un tip de postare. Poate fi imaginea caracteristică sau corpul, câmp personalizat. Nu pentru postare. :)

ex: array( 'post_type'=>array('image,body,title,featured_image')) tipul de postare poate fi pagină sau postare sau orice altceva.

Sper că acum e clar.

user115277 user115277
17 mar. 2017 17:43:16

Ai un fragment de cod, din nou? Un fragment să ne arăți. Aici nu e nimeni să scrie cod pentru tine.

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

Nu scriu nimic. Am nevoie de o idee. Nu cer nimănui să codeze pentru mine. Am căutat mult timp să găsesc soluții. Acum caut în nucleul WordPress cum preiau ei câmpurile împreună cu alte câmpuri personalizate într-o postare sau pagină. Dacă găsesc, voi răspunde aici.

Mulțumesc

user115277 user115277
17 mar. 2017 19:33:11

Te rog să postezi codul tău pentru a identifica greșelile. În caz contrar, voi șterge postarea ta deoarece nu îndeplinește cerințele acestui site.

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

Ok Poți. Nu ești capabil să înțelegi ce vreau... :)

user115277 user115277
17 mar. 2017 20:28:24

Ar trebui să clarifici întrebarea ta. Cred că vrei câmpuri personalizate înregistrate și alte câmpuri implicite pentru un tip de postare personalizat. Dacă da, este posibil. Dacă folosești ACF sau Pods, sau Types, pot să-ți ofer soluții. Pentru că acestea păstrează datele în baza de date și poți obține ușor valori folosind interogări. Soluția este complexă și dacă nu cunoști structura WordPress, nu vei putea realiza această soluție.

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

@user115277 spune-mi dacă am interpretat corect întrebarea ta cu răspunsul meu și voi edita întrebarea ta pentru a clariza confuzia

bosco bosco
25 mar. 2017 05:50:43

mulțumesc, @bosco ambele soluții m-au ajutat foarte mult. De fapt, aveam nevoie de toate câmpurile personalizate asociate cu un tip de postare folosind Advanced Custom Field (acf).

user115277 user115277
25 mar. 2017 10:56:06
Arată celelalte 3 comentarii
Toate răspunsurile la întrebare 2
0

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.

25 mar. 2017 05:38:40
0

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.

23 mar. 2017 09:25:52