Pot interoga metadate personalizate prin WP_Query

4 oct. 2012, 19:37:01
Vizualizări: 24.3K
Voturi: 6

Ok, întrebarea mea este puțin complexă, așa că voi încerca să ofer mai întâi o explicație generală și apoi să intru în detalii.

Folosesc WordPress 3.4.2 și utilizez WCK Post Type Creator și WCK Custom Fields Creator pentru a crea tipul meu personalizat de postare și câmpurile personalizate.

Încerc să interoghez postări din tipul personalizat 'business' care au un câmp personalizat 'special' atașat. Problema mea este că aș dori să fiu mai specific și să obțin doar un anumit tip de ofertă specială (care este setat în plugin-ul Custom Fields Creator), dar nu știu dacă/cum pot face acest lucru folosind argumentul meta_query pentru WP_Query.

Ceea ce am acum va extrage postări din tipul de postare, dar apoi trebuie să folosesc get_post_meta() pentru a găsi câmpurile personalizate și să trec prin ele făcând teste pentru ceea ce vreau. Iată ce am momentan:

<?php   
$args = array(
    'post_type' => 'business',
    'meta_query'  => array(
                array(
                    'key' => 'specials'
                )
            )

    );
$loop = new WP_Query( $args );

while ( $loop->have_posts() ) : $loop->the_post(); 

$specials = get_post_meta( $post->ID, 'specials'); 

//Trece prin array-ul de oferte speciale    
foreach( $specials as $special){

    //Trece prin fiecare ofertă specială
    foreach($special as $individual){

    //Verifică dacă există o ofertă specială pentru băuturi
    if ($individual ['type-of-special'] == 'Drink' ) { 
        //Execută diverse acțiuni          

    }//individual
    }//special
} //specials

endwhile; ?>

Deci, ceea ce fac aici este să extrag postările și apoi pentru fiecare postare să obțin metadatele 'specials' și să trec prin diferitele array-uri pentru a verifica ce tip de ofertă specială este și apoi să afișez lucruri dacă este tipul potrivit de ofertă specială. Există o modalitate de a fi mai specific în WP_query astfel încât să returnez doar postările care sunt de un anumit tip de ofertă specială?

Problema pe care par să o întâmpin este că nu știu cum să ajung suficient de adânc în array-urile multidimensionale pe care le are câmpul personalizat 'specials' pentru a verifica valorile cu argumentul meta_query pentru WP_Query.

Dacă afișez $special în foreach($specials as $special) obțin următoarele:

Array
(
    [0] => Array
        (
            [type-of-special] => Drink
            [name-of-special] => Pumpkin Latte
            [price] => 2.00
            [day-of-the-week] => Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
        )
)

Deci nu știu cum să ajung la cheia [type-of-special] pentru a-i verifica valoarea prin meta_query.

Știu că sunt multe informații și apreciez foarte mult orice feedback și ajutor pentru a rezolva această problemă. Dacă aveți nevoie de mai multe informații sau clarificări cu privire la ceva, vă rog să-mi spuneți. Mulțumesc din nou!

1
Comentarii

Evitați utilizarea tablourilor multidimensionale

Tom J Nowell Tom J Nowell
4 oct. 2012 21:11:01
Toate răspunsurile la întrebare 2
8
11

În mod normal, ai specifica doar o meta_value, de exemplu:

 $args = array(
     'post_type' => 'business',
     'meta_query'  => array(
            array(
                'key' => 'specials',
                'value' => 'these are not the specials you are looking for - Obi Wan Kenobi'
            )
        )

);

Totuși, deoarece meta postul tău este de fapt o structură de date, un array/obiect PHP serializat, acest lucru nu este posibil.

Poți citi mai multe aici:

http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

4 oct. 2012 19:51:44
Comentarii

Nu sunt sigur cum să format câmpul 'value' deoarece informația pe care trebuie să o verific este ținută într-un array. Am încercat aceste variante: 'value' => 'Drink' 'value' => 'type-of-special' 'value' => array([type-of-special]=>'Drink')

dar niciuna dintre acestea nu funcționează. Ai vreo idee cum ar trebui să formatez asta pentru a accesa acele array-uri? Mulțumesc

yoxalld yoxalld
4 oct. 2012 20:39:53

de ce ai face 'value' => 'type-of-special' 'value' => array([type-of-special]=>'Drink') ? Pur și simplu accesează câmpul din array pe care îl dorești, PHP de bază. De exemplu, pentru a accesa elementul 5 din array-ul 'stuff' fă $thefifthvalueinstuff = $stuff[5];

Tom J Nowell Tom J Nowell
4 oct. 2012 21:08:53

de fapt, uitându-mă la codul tău, întrebarea ta ulterioară nu are sens nici ea. Setează-l la 'Drink' și nu va trebui să verifici dacă este tipul drink deoarece vor fi returnate doar tipurile drink

Tom J Nowell Tom J Nowell
4 oct. 2012 21:10:35

Cred că problema este cum stochează WCK Custom Fields Creator câmpurile personalizate pe care le creează. Caseta meta personalizată este 'specials', dar 'Drink' este doar o informație conținută în acel câmp personalizat, așa că nu este recunoscută de meta_query ca o 'cheie'.

De aceea am afișat conținutul lui $special, pentru că am nevoie de ajutor pentru a înțelege cum să accesez informațiile din acele array-uri. Îmi cer scuze pentru confuzie. Mulțumesc.

yoxalld yoxalld
4 oct. 2012 22:10:04

Dar interogarea meta se întâmplă înainte de buclă, nu ai încă niciunul din acele date, așa că nu le poți folosi în argumentele interogării.

Tom J Nowell Tom J Nowell
4 oct. 2012 22:20:05

Ok, în regulă, voi continua să fac verificările în interiorul buclei, nu eram sigur dacă există o metodă mai corectă decât cea pe care o foloseam. Apreciez foarte mult ajutorul tău! Mulțumesc.

yoxalld yoxalld
4 oct. 2012 22:46:56

AHA, scuze, acum am înțeles - va trebui să stochezi meta datele postării altfel, deoarece valorile meta sunt obiecte serializate

Tom J Nowell Tom J Nowell
5 oct. 2012 00:20:16

Am actualizat răspunsul meu pentru a reflecta asta, scuze, trebuia să observ mai devreme că meta datele nu erau o valoare individuală

Tom J Nowell Tom J Nowell
5 oct. 2012 00:21:57
Arată celelalte 3 comentarii
0
    $args = array(
        'post_type' => "your_post_type", // tipul postului
        'meta_key' => 'name_of_the_meta_key', // cheia meta
        'meta_compare' => '=', // vezi documentația pentru opțiuni de comparare
        'meta_value ' => 'the_value_you_want to search' // valoarea pe care dorești să o cauți
    );

    $posts = new WP_Query( $args ); // interogare WP

https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters

dacă dorești să cauți elemente care nu sunt goale

    $args = array(
        'post_type' => "your_post_type", // tipul postului
        'meta_key' => 'name_of_the_meta_key', // cheia meta
        'meta_compare' => '!=', // diferit de
        'meta_value ' => '' // valoare goală
    );

    $posts = new WP_Query( $args ); // interogare WP
22 ian. 2021 14:41:24