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 plugin More Fields) - se esta opção estiver marcada, o valor meta torna-se 1 e, se desmarcado, torna-se 0. Tudo bem. No entanto, se a caixa nunca foi marcada, a meta-chave nunca é criada, o que significa que não posso consultar o NOT LIKE 1 porque ela não existe.

A consulta que desejo é extrair 4 galerias que não estão marcadas como '1' neste meta valor, mas também aquelas que não têm esse valor. Existe uma maneira de sempre dar aos posts recém-adicionados um valor padrão para essa meta-chave (ou seja, sempre torná-los 0 por padrão se a caixa for deixada desmarcada) ou existe uma maneira de consultar a chave que ainda não está 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' = > 'NÃO GOSTA', '! =' Etc etc.

Alguma ideia? Este bilhete parece implicar que é algo que deve ser resolvido:

enlace

Obrigado!

    
por artparks 26.07.2011 / 12:05

4 respostas

7

Essa função massiva foi um pouco assustadora, eu consegui isso funcionando assim - 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

);
    
por ArleyM 15.02.2013 / 19:24
3

De acordo com os Parâmetros de campo personalizados no Codex, a comparação especial NOT EXISTS está disponível desde a versão 3.5 do WP

Tecnicamente, produz algo como seguir uma 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 unindo a tabela meta na chave fornecida e apenas selecionando registros em que isso não resultou em dados significativos ( IS NULL ). Por isso, funciona apenas quando a chave não existe e não funciona para chaves que existem com valores falsy .

    
por Rarst 22.10.2012 / 22:07
2

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

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

enlace

Eu escrevi isso há oito meses e não testei (desde então), então me avise sobre quaisquer problemas.

Espero que ajude ..

    
por t31os 26.07.2011 / 15:27
1

O método mais simples, embora não seja 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 lhe dará todas as suas galerias classificadas pela chave meta. O próximo passo é descobrir se as galerias com o valor 1 vêm depois ou antes dos outros posts. Desta forma, você pode:

  • Processar itens até que você tenha processado 4 itens da galeria ou tenha alcançado uma postagem com um valor meta de 1
  • Ignore as postagens com um meta valor 1 e comece a processar quando atingir o primeiro valor diferente de 1

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

  • Fazendo uma consulta para encontrar as galerias que você não deseja, usando-a para preencher uma matriz de IDs de postagem e, em seguida, fazendo uma segunda consulta, passando essa matriz como postagens a serem excluídas
  • Usando uma taxonomia em vez de campos personalizados (resolve isso muito bem e coloca muitas outras melhorias agradáveis de forma gratuita, economizando seu tempo também)
por Tom J Nowell 24.12.2011 / 12:37