Meta Query LIKE %...% con Array Serializzato

8 feb 2013, 17:56:02
Visualizzazioni: 40.6K
Voti: 4

Ho un array serializzato come valore meta e sto cercando di eseguire una WP Query che trovi un valore specifico nell'array serializzato.

Ecco un esempio del campo array serializzato:

a:6:{i:0;s:3:"173";i:1;s:3:"172";i:2;s:3:"171";i:3...

Ecco la mia query, ma non funziona: Gli ID che sto cercando sono anche numerici.

$practiceArgs = array(
    'post_type' => 'attorney',
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'meta_query' => array(
                        array(
                              'key' => 'practice_area',
                              'value' => $post->ID,
                              'compare' => 'LIKE',
                              'type' => 'NUMERIC'
                              )
                        )
);

Ho provato a usare 'value' => '%'.$post->ID.'%' nelle mie query, ma sembra non funzionare lo stesso.

Qualcuno ha mai avuto esperienza con questo tipo di problema?

0
Tutte le risposte alla domanda 4
0
15

Mi sono imbattuto nello stesso problema oggi. In entrambi i nostri casi, esiste in realtà una soluzione elegante. Poiché i dati serializzati che stiamo cercando sono semplicemente ID, e sono sempre racchiusi tra virgolette, dobbiamo solo includere le virgolette come parte della query. Questo elimina il problema di trovare falsi positivi nei risultati della ricerca.

Devi solo modificare la meta query come segue:

array(
    'key' => 'practice_area',
    'value' => '"'.$post->ID.'"',
    'compare' => 'LIKE',
)

In questo modo, cerca l'intero ID, comprese le virgolette doppie prima e dopo all'interno dell'array serializzato. Non verranno inclusi falsi positivi.

13 mag 2014 19:52:31
0

Mi sono imbattuto in questo problema una volta, ma non è sicuramente una bella situazione. Il modo in cui lo stai affrontando non avrà mai un risultato coerente — la tua ricerca restituirà molti falsi positivi (ad esempio, cercare l'ID del post 43 restituirà 143, 243, 1431, 1432, ecc.).

Dal mio punto di vista, hai due opzioni:

  • Ripensare il modo in cui salvi i tuoi metadati; usa array per i dati
    necessari solo durante il rendering del post, ma non per i dati che devi interrogare per filtrare i post. Per quest'ultimi, usa singole chiavi meta nel tuo database — è molto più veloce, le query sono più facili da codificare, e puoi stare tranquillo che avrai il pieno controllo su ciò che le query restituiscono. Non preoccuparti di usare troppe righe nella tabella postmeta: sono lì proprio per questo.
  • Se per qualche motivo devi avere più campi compressi in una riga del database,
    non affidarti alla serializzazione predefinita: opta per CSV, preferibilmente con una sorta di prefisso, qualcosa che non restituisca falsi positivi. Qualcosa come "id:43,id:54,foo:bar,id:57,", poi cerca 'id:{post_ID},' (nota che tutti i valori dovrebbero terminare con virgole per poter usare in sicurezza i wildcard doppi in una ricerca LIKE. È un po' un hack, ma è più affidabile di quello che stai facendo ora.

Per quanto riguarda la domanda originale, WP aggiunge già entrambi i wildcard quando esegue confronti LIKE usando query_posts, quindi non devi fare nulla.

9 feb 2013 16:22:27
0

Il LIKE di WordPress non è come il LIKE di MySQL, quindi 'value' => '%'.$post-ID.'%' non funziona.

Puoi provare la versione con REGEXP. Ad esempio:

'meta_query' => array(
    array(
        'key'       => 'attorney',
        'value'     => '^'.$post-ID,
        'compare'   => 'REGEXP',
    )
)

Dovrebbe cercare tutti gli elementi in cui il campo attorney inizia con il valore di $post-ID.

4 dic 2019 00:20:21
3

Non puoi usare LIKE con numeric (almeno sono abbastanza sicuro che non sia possibile). numeric cercherà di convertire l'intero value in un numero. Questo fallirà, poiché non è un numero. Questo è il primo errore.

In secondo luogo, per ottenere un % letterale, devi raddoppiarlo come %%. Nota: non ricordo esattamente per meta_query nello specifico. Sto estrapolando da ciò che serve per far passare un % attraverso $wpdb->prepare. Penso sia lo stesso comunque. Modifica: Sembra che questo valga solo con $wpdb->prepare. Il codice è stato modificato.

Non ho testato questo codice, poiché dovrei configurare alcune cose nel mio database e non ho tempo al momento, ma penso che funzionerà.

$practiceArgs = array(
    'post_type' => 'attorney',
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'meta_query' => array(
      array(
        'key' => 'practice_area',
        'value' => $post->ID,
        'compare' => 'LIKE'
      )
    )
);

Spero che questo ti dia la spinta necessaria. Se non funziona, ci ritornerò sopra.

Modifica: Ho inserito il tuo array serializzato (rotto) nel mio database e ho eseguito il codice sopra. Se configuro tutto correttamente - i meta_fields, i post type, ecc. - il codice sopra funziona. Se non funziona per te, c'è qualcos'altro che non va - forse pensi che ci dovrebbe essere una corrispondenza dove non c'è.

Sto assumendo che avrai un array come quello per ogni tuo post di tipo 'attorney'. Se è così, dovrebbe funzionare. Personalmente, preferirei usare multiple righe practice_area invece di un array serializzato. = è una query più efficiente di LIKE, specialmente quando hai wildcard, e i tuoi risultati dovrebbero essere più accurati. Anche l'indicizzazione (database MySQL) dovrebbe funzionare meglio.

8 feb 2013 18:11:50
Commenti

Sfortunatamente, restituisce ancora NIL. Hai altre idee?

Troy Troy
8 feb 2013 20:59:49

Il tuo commento riguardo a '%' è vero solo quando si usa $wpdb->prepare. Quando si usa query_posts, usare '%' non è necessario: WP li inserisce automaticamente per te, che tu lo voglia o no.

Tomas Buteler Tomas Buteler
9 feb 2013 16:25:00

@tbuteler WP convertirà automaticamente anche % in %% in quel caso.

Robbert Robbert
10 dic 2013 09:31:17