WP Query post meta valor

3

Estou tentando conseguir postagens que aplicaram o valor meta trainees .

$args = array(
    'posts_per_page'   => -1,
    'orderby'          => 'post_date',
    'order'            => 'DESC',
    'post_status'      => 'publish',
    'meta_query' => array(
        array(
            'key'     => 'enterprise_on_page',
            'value'   => array( 'trainees' ),
            'compare' => 'IN',
        ),
    ),
);

$enterprise_posts = get_posts( $args );


Em meu meta-campo com a chave enterprise_on_page , eu armazenei um array () anteriormente como update_post_meta( $post_id, 'enterprise_on_page', array('trainees', 'staff') ); .

Se eu chamar var_dump(get_post_meta($post->ID)) , recebo a seguinte saída:

'enterprise_on_page' => 
    array (size=1)
      0 => string 'a:2:{i:0;s:8:"trainees";i:1;s:7:"staff";}' 


Como posso modificar minha consulta para que somente postagens com meta-valor trainees sejam exibidas. Até agora não recebo nenhuma postagem.

    
por pbaldauf 18.11.2014 / 15:58

3 respostas

5

Obrigado ao @Howdy_McGee. Ele me deu a dica de cuidar de meta-consultas serializadas . Com este código, recebo o resultado desejado.

$args = array(
    'posts_per_page'   => -1,
    'orderby'          => 'post_date',
    'order'            => 'DESC',
    'post_status'      => 'publish',
    'meta_query' => array(
        array(
            'key'     => 'enterprise_on_page',
            'value'   => serialize(strval('trainees')),
            'compare' => 'LIKE',
        ),
    ),
);

$enterprise_posts = get_posts( $args );
    
por pbaldauf 18.11.2014 / 16:24
2

Como seus dados estão atualmente estruturados, você não pode usar o SQL para fazer isso (bem, não de uma maneira melhor, pelo menos). Você tem duas opções:

  1. Buscar TODAS as postagens e percorrê-las na memória procurando a meta meta correta ou
  2. Armazene os valores de meta separadamente.

Entre os dois, eu aconselho o último. O WordPress permite que você armazene várias linhas do mesmo post meta para um único post, para que você possa obter uma matriz de dados sem precisar serializá-lo e armazená-lo em uma chave. Para fazer isso, você precisa alterar um pouco como está interagindo com a meta-meta do post aqui. Algo parecido com isso é o que você deseja:

Ao receber o post meta, você faria

get_post_meta($ID, 'enterprise_on_page', false);

A atualização seria a mais diferente. Se você quiser apenas acrescentar um valor, faça

add_post_meta($ID, 'enterprise_on_page', $value);

Para atualizar um valor,

update_post_meta($ID, 'enterprise_on_page', $new_value, $old_value);

E para remover um valor:

delete_post_meta($ID, 'enterprise_on_page', $value_to_delete);

    
por John P Bloch 18.11.2014 / 16:23
2

Eu não acredito que você possa comparar com precisão os valores para uma Matriz serializada , que acontece sempre que você passar uma matriz para update_post_meta , você precisa obter o valor inteiro durante o loop usando

get_post_meta( $post->ID, 'enterprise_on_page', 1 )

Se você precisar especificar consultas com base nesses valores, é melhor salvá-los separadamente.

Veja esta pergunta para mais informações:

meta_query com valores meta como matrizes serializadas

    
por Howdy_McGee 18.11.2014 / 16:14