Come utilizzare l'operatore LIKE nelle query di tassonomia in WordPress

7 feb 2014, 07:23:40
Visualizzazioni: 19.4K
Voti: 4

Ho una tassonomia chiamata "color" associata a un custom post type. Sto elencando tutti i post meta e la tassonomia in una tabella. Ho un'opzione nella tabella per cercare i post che corrispondono al valore di ricerca.

Quando viene inserita una chiave di ricerca, viene effettuata una chiamata AJAX per ottenere i post.

Questa è la query per ottenere tutti i post che corrispondono alla stringa di ricerca:

function get_query_posts_custom($post_id,$start,$length)  {
    // argomenti per 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
    );


    // ottiene la tassonomia del custom post
    $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;
}

Come posso ottenere i post che corrispondono alla stringa di ricerca di una tassonomia?

Ho cercato nella documentazione di WordPress e dice che gli unici operatori consentiti per tax_query sono 'IN, NOT IN, OR e AND'. Posso usare l'operatore LIKE?

3
Commenti

Hai provato la soluzione in questa discussione: http://wordpress.stackexchange.com/questions/123298/term-begins-with-a-letter?

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

Ho provato a ottenere l'ID del termine corrispondente alla ricerca usando la funzione get_terms con l'argomento name_like e generare il tax_query con l'operatore IN.

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

La funzione get_posts supporta l'argomento operator in tax_query? La documentazione non menziona nulla riguardo a tax_query con operator. Viene spiegato solo in WP_Query.

B L Praveen B L Praveen
7 feb 2014 12:11:39
Tutte le risposte alla domanda 4
1

L'unica opzione che hai è scrivere il tuo SQL personalizzato nel filtro posts_clauses, dove riceverai un array delle clausole JOIN, WHERE, ORDER, ecc. che puoi modificare, aggiungere, rimuovere, ecc.

Una NOTA IMPORTANTISSIMA su questo è di USARE SEMPRE la funzione prepare della variabile globale $wpdb, che sanificherà tutti i tuoi dati. Non vuoi permettere alcun tipo di iniezione attraverso le tue query personalizzate di ricerca. :)

7 feb 2014 17:38:51
Commenti

:) Aggiunta una nota per mantenere al sicuro anche il tuo database.

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

Come indicato in altre risposte, non puoi semplicemente fare una ricerca di tipo LIKE utilizzando tax_query.

Quello che puoi fare è modificare la dichiarazione SQL utilizzando i filtri come suggerito da @Eric Holmes, che è una tecnica avanzata. Devi sapere cosa stai facendo. Oppure puoi semplicemente fare una query separata caricando prima i termini della tassonomia (usando LIKE) e poi caricare i post effettivi.

Ecco un semplice esempio per caricare i post che sono in relazione con qualsiasi termine che corrisponda a un confronto LIKE con la variabile $search.

//  carica i termini usando LIKE
$termIds = get_terms([
    'name__like' => $search,
    'fields' => 'ids'
]);


//  carica i post utilizzando gli ID dei termini trovati
$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
Commenti

è intelligente e più pulito, grazie.

gdaniel gdaniel
30 apr 2020 17:45:27

Nella tax_query dovresti usare term_id come valore del campo.

adamalexanderw adamalexanderw
20 feb 2023 11:41:53
0

WP_Tax_Query o rispettivamente il Parametro di Tassonomia di WP_Query o get_posts() accetta solo i seguenti valori per l'argomento operator:

'operator' string (opzionale)
Valori possibili: 'AND', 'IN' o 'NOT IN'.
Default: 'IN'

Quindi non puoi utilizzare LIKE come operator.

7 feb 2014 12:21:08
0

In realtà non è necessario utilizzare operatori di confronto negli argomenti delle query tassonomiche (ma nelle query sui metadati, sì).

Quindi, questa parte modificata dovrebbe comportarsi come se utilizzasse 'LIKE' per impostazione predefinita:

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