Cum să utilizezi operatorul LIKE în interogări de taxonomie WordPress

7 feb. 2014, 07:23:40
Vizualizări: 19.4K
Voturi: 4

Am o taxonomie numită "culoare" asociată cu un tip de postare personalizat. Afișez toate metadatele postărilor și taxonomia într-un tabel. Am o opțiune în tabel pentru a căuta postările care se potrivesc cu valoarea introdusă.

Când se introduce o cheie de căutare, se face un apel AJAX pentru a obține postările.

Iată interogarea pentru a obține toate postările care se potrivesc cu șirul de căutare:

function get_query_posts_custom($post_id,$start,$length)  {
    // Argumente pentru get_posts
    $args =  array(
        'post_type'     => 'custom_post',
        'post_status'   => array('publish'),
        'numberposts'   => $length,
        'offset'        => $start,
        'orderby'       => 'menu_order',
        'order'         => 'asc',
        'post_parent'   => $_product->id
    );


    // Obține taxonomia postării personalizate
    $taxonomies = (array) maybe_unserialize(get_post_meta( $post_id, 'post_taxonomy', true));
    if(empty($attributes)) {
        $taxonomies = array();
    }

    $meta_keys  = array('type','code','key');       
    if(!empty($search)) {
        foreach($meta_keys as $meta_key) {
            $meta_query[] = array(
                        'key'   => $meta_key,
                        'value' => $search,
                        'compare'   => 'LIKE'
                    );

        }

        $args['meta_query'] = $meta_query;
        $tax_query = array();

        foreach($taxonomies as $taxonomy) {
            $tax_query  = array(
                'taxonomy'  =>  $taxonomy,
                'field' =>  'slug',
                'terms' =>  $search,
                'operator'  => 'LIKE'
            );
        }
        if(count($tax_query)) {
            $args['tax_query'] = $tax_query;
        }
    }
    $results    = get_posts($args);
            return $results;
}

Cum pot obține postările care se potrivesc cu șirul de căutare pentru o taxonomie?

Am căutat în documentația WordPress și am văzut că singurii operatori permisi pentru tax_query sunt 'IN', 'NOT IN', 'OR' și 'AND'. Pot folosi operatorul LIKE?

3
Comentarii

Ați încercat soluția din acest thread: http://wordpress.stackexchange.com/questions/123298/term-begins-with-a-letter?

1fixdotio 1fixdotio
7 feb. 2014 09:50:12

Am încercat să obțin ID-ul termenului care se potrivește cu căutarea folosind funcția get_terms cu argumentul name_like și să generez tax_query cu operatorul IN.

B L Praveen B L Praveen
7 feb. 2014 12:07:30

Funcția get_posts suportă argumentul operator în tax_query? Referința funcției nu menționează nimic despre tax_query cu operator. Este explicat doar în WP_Query.

B L Praveen B L Praveen
7 feb. 2014 12:11:39
Toate răspunsurile la întrebare 4
1

Singura opțiune pe care o ai este să scrii propriul tău SQL în filtrul posts_clauses, unde primești un array cu clauzele JOIN, WHERE, ORDER, etc. pe care le poți modifica, adăuga, elimina și așa mai departe.

O NOTĂ FOARTE IMPORTANTĂ legată de acest lucru este să folosești ÎNTOTDEAUNA funcția prepare din globalul $wpdb, care va sanitiza toate datele tale. Nu vrei să permiți niciun fel de injecție prin interogările personalizate ale termenilor de căutare. :)

7 feb. 2014 17:38:51
Comentarii

:) Am adăugat o notă pentru a vă păstra baza de date în siguranță de asemenea.

Eric Holmes Eric Holmes
7 feb. 2014 18:12:22
2

După cum s-a menționat în alte răspunsuri, nu poți efectua o căutare de tip LIKE folosind tax_query.

Ceea ce poți face este fie să modifici instrucțiunea SQL utilizând filtre, așa cum a sugerat @Eric Holmes, care este o tehnică avansată. Trebuie să știi exact ce faci. Alternativ, poți face o interogare separată pentru a încărca mai întâi termenii de taxonomie (folosind LIKE) și apoi să încarci postările efective.

Iată un exemplu simplu pentru încărcarea postărilor care sunt în relație cu orice termeni care se potrivesc cu o comparație LIKE împotriva variabilei $search.

// încarcă termenii folosind LIKE
$termIds = get_terms([
    'name__like' => $search,
    'fields' => 'ids'
]);


// încarcă postările folosind ID-urile termenilor găsite
$posts = get_posts([
    'tax_query' => [
        'relation' => 'OR',
        [
            'taxonomy' => 'yourtaxonomy',
            'field' => 'id',
            'terms' => $termIds,
        ],
        [
            'taxonomy' => 'othertaxonomy',
            'field' => 'id',
            'terms' => $termIds,
        ],
    ],
]);
23 feb. 2018 14:54:52
Comentarii

este inteligent și mai curat, mulțumesc.

gdaniel gdaniel
30 apr. 2020 17:45:27

În tax_query ar trebui să folosești term_id pentru valoarea câmpului.

adamalexanderw adamalexanderw
20 feb. 2023 11:41:53
0

WP_Tax_Query sau parametrul de Taxonomie al WP_Query sau get_posts() acceptă doar următoarele valori pentru argumentul operator:

'operator' string (opțional)
Valori posibile: 'AND', 'IN' sau 'NOT IN'.
Implicit: 'IN'

Deci nu poți folosi LIKE ca operator.

7 feb. 2014 12:21:08
0

De fapt, nu este nevoie să folosești operatori de comparație în interogările de taxonomie (dar în interogările meta, da).

Deci, această parte modificată ar trebui să se comporte ca și cum ar folosi implicit 'LIKE':

foreach($taxonomies as $taxonomy) {
            $tax_query  = array(
                'taxonomy'  =>  $taxonomy;
                'field' =>  'slug';
                'terms' =>  $search;
            );
        }
28 mar. 2020 12:56:51