Evitar usar um loop para acessar uma única postagem

4

Às vezes, quero acessar um CPT específico para extrair algo dele, por exemplo, um valor de campo personalizado:

$group = new WP_Query( array( 
    'post_type' => 'group',
    'p' => $group_id
) );
while ( $group->have_posts() ) : $group->the_post();
    $group_type = get_post_meta($post->ID, "group_type", $single = true);       
endwhile;

No entanto, o objetivo de um loop é acessar mais de um elemento, portanto, não gosto de usar um loop para um único post. Existe uma maneira de fazer exatamente a mesma coisa (acessando este valor de campo personalizado) sem usar um loop?

    
por drake035 26.01.2013 / 11:42

3 respostas

1

que tal get_post ?

$post       = get_post( $p );
$group_type = get_post_meta( $post->ID, 'group_type', true );
    
por Simon Blackbourn 26.01.2013 / 17:52
3

Seu WP_Query objeto contém uma matriz de postagens. Basta pegar a primeira entrada:

get_post_meta( $group->posts[0]->ID, "group_type", true );

Observação: o terceiro parâmetro para get_post_meta() espera uma palavra-chave: true ou false , não $single = true . Funciona, mas parece bastante estranho. :)

    
por fuxia 26.01.2013 / 11:49
0

Você pode usar apenas metade de um loop. Bem, não é nem um loop, apenas o cheque se recebemos algum post. Basta usar os métodos de objetos (WP_Query). O exemplo é apresentado em uma função, e você pode usá-lo como uma tag de modelo:

function wpse83212_get_group_post( $group_id )
{
    add_filter( 'post_limits', 'wpse83212_group_post_limit' );
    $group = new WP_Query( array( 
         'post_type' => 'group'
        ,'p'         => $group_id
    ) );
    // Did the query return anything?
    if ( $group->have_posts() )
    {
        // Setup the post data
        $group->the_post();
        // Now we have access to the '$GLOBALS['post']' object
        // as well as to any functions that only work inside the Loop:
        return get_post_meta( get_the_ID(), 'group_type', true );
    }
    else
    {
        return NULL;
    }
}
function wpse83212_group_post_limit( $limit )
{
    remove_filter( current_filter(), __FUNCTION__, 10 );
    return 1;
}

Em seguida, basta usá-lo em qualquer modelo: $group_meta = wpse83212_get_group_post( 12 ); . Se o valor agora for NULL , não existe esse post. Senão você teria o único valor retornado.

    
por kaiser 26.01.2013 / 13:22

Tags