meta_query per chiavi non ancora impostate


8

Sto cercando di cercare un tipo di post personalizzato per un sistema di galleria. Ho una casella di controllo per impostare una galleria come una galleria "in primo piano" (impostata tramite il plug-in Altri campi) - se questa opzione è selezionata, il meta valore diventa 1 e quindi se non selezionato diventa 0. Tutto bene. Tuttavia, se la casella non è mai stata selezionata, la meta chiave non viene mai creata, il che significa che non posso eseguire una query per NOT LIKE 1 perché non esiste.

La query che voglio è estrarre 4 gallerie che non sono contrassegnate come '1' in questo meta-valore, ma anche quelle che non hanno affatto questo valore. Esiste un modo per assegnare sempre ai post aggiunti di recente un valore predefinito per questa meta chiave (ovvero renderli sempre 0 per impostazione predefinita se la casella non è selezionata) o esiste un modo per eseguire una query per la chiave non ancora impostata?

La mia domanda attuale è:

$args = array(
                        'post_type' => 'gallery',
                        'showposts' => 4,
                        'meta_key' => 'gal-ID',
                        'order_by' => 'meta_value',
                        'order' => 'ASC',
                        'meta_query' => array( array(
                                            'key' => 'main-gal',
                                            'value' => false,
                                        ) ),
                        ) );

E ho provato vari tentativi con 'compare' => 'NON MI PIACE', '! =' Ecc. Ecc.

Qualche idea? Questo biglietto sembra implicare che è qualcosa che dovrebbe essere risolto:

http://core.trac.wordpress.org/ticket/18158

Grazie!

Risposte:


7

Quella funzione enorme è stata un po 'spaventosa, ho fatto in modo che funzionasse così - con due argomenti (che escludono le funzionalità)

$args = array(

    'meta_query' => array(
        'relation' => 'OR',
            array( // new and edited posts
                'key' => 'Set as Featured Post',
                'compare' => '!=',
                'value' => 1
            ),

            array( // get old posts w/out custom field
                'key' => 'Set as Featured Post',
                'value' => '1',
                'compare' => 'NOT EXISTS'
            ) 
        ),
    'posts_per_page' => 30

);

Il mio primo array ha la precedenza sul secondo con questa soluzione. Sembra che forse non puoi raddoppiare la query nello stesso campo?
Allen Gingrich,

3

Come da Parametri di campo personalizzati nel Codice, NOT EXISTSè disponibile un confronto speciale dalla versione 3.5 di WP

Tecnicamente produce qualcosa come la seguente query SQL nelle richieste di post:

$posts = get_posts( array(
    'meta_query' => array(
        array(
            'key'     => 'wrong',
            'compare' => 'NOT EXISTS',
        ),
    ),
) );
SELECT *,wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'wrong')
WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.post_id IS NULL)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 5

Funziona unendo la meta tabella sulla chiave fornita e selezionando solo i record in cui ciò non ha dato luogo a dati significativi ( IS NULL). Quindi funziona solo nel caso in cui la chiave non esiste affatto e non funzionerà per le chiavi che esistono con valori falsi .


Sono incuriosito da questo NOT EXISTSconfronto. Per ovviare a meta-chiavi non impostate, ho appena salvato uno 0 save_postall'amo se la meta-chiave non è impostata. Come NOT EXISTSfunziona? Ordinerà la query del PO main-gale quindi riempirà il 4 con i post che non hanno quel meta?
Helgatheviking

@helgatheviking Ho approfondito la meccanica in risposta
Rarst

2

Come ha sottolineato il biglietto, non è supportato ... fino ad allora dovrai fare affidamento su una soluzione personalizzata.

Alcuni utenti l'hanno chiesto prima, o almeno chiesto come farlo sui forum di WordPress.org, quindi ho scritto una funzione per fare il lavoro che non ho mai tenuto (incollato), fortunatamente ho trovato l'argomento originale dove ho fornito il link pastebin (che non dovrebbe scadere).

http://pastebin.com/kgLt1RrG

L'ho scritto 8 mesi fa e non l'ho testato (da allora), quindi fatemi sapere di eventuali problemi.

Spero che aiuti..


Bene, grazie per questo - lo proverò più tardi questa sera e ti farà sapere cosa succede.
artparks,

1

Il metodo più semplice, anche se non il più pulito:

$args = array(
    'post_type' => 'gallery',
    'posts_per_page' => -1,
    'meta_key' => 'gal-ID',
    'order_by' => 'meta_value',
    'order' => 'ASC',
    'meta_key' => 'main-gal',
    ) );

Questo ti darà tutte le tue gallerie ordinate per la meta chiave. Il prossimo passo è capire se le gallerie con il valore 1 vengono dopo o prima degli altri post. In questo modo puoi:

  • Elabora gli elementi fino a quando non hai elaborato 4 elementi della galleria o non hai raggiunto un post con un valore meta di 1
  • Salta i post con un meta valore 1, quindi inizia l'elaborazione quando raggiungi il primo valore diverso da 1

Altri metodi che non richiedono un'istruzione SQL personalizzata:

  • Fare una query per trovare le gallerie che non vuoi, usarla per riempire una matrice di ID post, quindi fare una seconda query, passando quella matrice come post per escludere
  • Usando una tassonomia invece di campi personalizzati (risolvilo abbastanza bene e metti molti altri bei miglioramenti gratuitamente in modo da farti risparmiare tempo)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.