meta_query para chaves que ainda não estão definidas

8

Estou tentando consultar um tipo de postagem personalizado para um sistema de galeria. Eu tenho uma caixa de seleção para definir uma galeria como uma galeria "em destaque" (configurada através do plug-in More Fields) - se isso estiver marcado, o valor meta se tornará 1 e, se desmarcado, se tornará 0. Tudo bem. No entanto, se a caixa nunca tiver sido marcada, a meta-chave nunca será criada, o que significa que não posso consultar NOT LIKE 1 porque ela não existe.

A consulta que eu quero é extrair 4 galerias que não estão marcadas como '1' nesse valor meta, mas também aquelas que não têm esse valor. Existe uma maneira de sempre atribuir às postagens recém-adicionadas um valor padrão para essa meta-chave (ou seja, sempre torná-las 0 por padrão, se a caixa for deixada desmarcada) ou existe uma maneira de consultar a chave que ainda não está sendo definida?

Minha consulta atual é:

$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 eu tentei várias tentativas com 'compare' => 'NOT LIKE', '! =' Etc etc.

Alguma ideia? Este ingresso parece indicar que é algo que deve ser resolvido:

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

Obrigado!

artparks
fonte

Respostas:

7

Essa função massiva foi um pouco assustadora, consegui funcionar dessa maneira - com dois argumentos (que excluem os recursos)

$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

);
ArleyM
fonte
Minha primeira matriz está substituindo minha segunda por esta solução. Parece que talvez você não possa consultar duas vezes o mesmo campo?
Allen Gingrich
3

Conforme parâmetros de campo personalizados no Codex, a NOT EXISTScomparação especial está disponível desde o WP versão 3.5

Tecnicamente, ele produz algo como a seguinte consulta SQL em solicitações de postagens:

$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

Ele funciona juntando a tabela meta na chave fornecida e selecionando apenas os registros onde isso não resultou em dados significativos ( IS NULL). Portanto, ele funciona apenas para o caso em que a chave não existe e não funciona para chaves que existem com valores falsos .

Rarst
fonte
Estou intrigado com essa NOT EXISTScomparação. Como uma solução alternativa para save_postas meta-chaves não definidas , eu salvo um 0 no gancho se a meta-chave não estiver definida. Como NOT EXISTSfunciona? Ele classificará a consulta do OP main-gale preencherá o 4 com as postagens que não possuem essa meta?
helgatheviking
@helgatheviking eu elaborado em mecânica em resposta
Rarst
2

Como o ticket apontou, ele não é suportado. Até então, você terá que confiar em uma solução personalizada.

Alguns usuários pediram isso antes, ou pelo menos perguntaram como fazê-lo nos fóruns do WordPress.org, por isso escrevi uma função para fazer o trabalho que nunca segurei (pastebinned), felizmente encontrei o tópico original onde eu forneci o link pastebin (que não deve expirar).

http://pastebin.com/kgLt1RrG

Escrevi isso há 8 meses e não o testei (desde então), então, deixe-me saber de quaisquer problemas.

Espero que ajude..

t31os
fonte
Legal, obrigado por isso - irá testá-lo ainda esta noite e informar o que acontece.
Artparks
1

O método mais simples, embora não o mais limpo:

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

Isso fornecerá todas as suas galerias classificadas pela meta-chave. O próximo passo é descobrir se as galerias com o valor 1 vêm depois ou antes das outras postagens. Dessa forma, você pode:

  • Processe itens até que você tenha processado 4 itens da galeria ou alcançado uma postagem com um valor meta de 1
  • Pule as postagens com um meta-valor 1 e inicie o processamento quando atingir o primeiro valor diferente de 1

Outros métodos que não exigem uma instrução SQL customizada:

  • Fazendo uma consulta para encontrar as galerias que você não deseja, usando-a para preencher uma matriz de IDs de postagem, depois fazendo uma segunda consulta, passando essa matriz como postagens para excluir
  • Usando uma taxonomia em vez de campos personalizados (resolve isso muito bem e coloca muitas outras melhorias legais gratuitamente, para economizar tempo)
Tom J Nowell
fonte