Sintaxe para obter o enésimo item em uma lista de tipos de postagem personalizados?

2

Temos um tipo de postagem personalizado testimonial e queremos mostrar o primeiro, o segundo e o terceiro em vários locais sob medida na página.

Veja como poderíamos fazer isso se quiséssemos apenas passar por cima de depoimentos e mostrá-los um após o outro (isso funciona):

<?php
$args = array('post_type' => 'testimonial');
$testimonials = new WP_Query( $args );
    while( $testimonials->have_posts() ) {
    $testimonials->the_post();
?>
    <li>
        <?php echo get_the_content(); ?>
    </li>

<?php }?>

Mas para mostrar apenas o primeiro ou apenas o terceiro ou o enésimo? Aqui está o que temos até agora (para obter o primeiro), está obviamente errado:

$args = array('post_type' => 'testimonial');
$testimonials = new WP_Query( $args );   
$testimonial1 =$testimonials[0]->the_post;
echo $testimonial1->the_content;

Recebemos um erro dizendo:

  

Erro fatal: não é possível usar o objeto do tipo WP_Query como array

    
por hawbsl 20.01.2015 / 13:28

2 respostas

6

Use um deslocamento para pular as duas primeiras postagens se precisar apenas da terceira postagem e, em seguida, defina posts_per_page para 1 para obter apenas essa postagem específica

Você pode tentar algo assim em seus argumentos

$args = array(
    'post_type' => 'testimonial',
    'offset' => 2,
    'posts_per_page' => 1
);
$testimonials = new WP_Query( $args );
    while( $testimonials->have_posts() ) {
    $testimonials->the_post();
?>
    <li>
        <?php the_content(); ?>
    </li>

<?php }
wp_reset_postdata(); ?>

EDITAR

Antes de começar, algumas notas sobre seu código e meu código editado. ( Eu editei meu código original para mostrar um loop normal ).

  • Você não precisa usar echo get_the_content() . Você pode usar apenas the_content() diretamente

  • Lembre-se de redefinir seus pós-dados após o loop com wp_reset_postdata() .

Conforme solicitado nos comentários, aqui está a sintaxe alternativa em que você não usa o loop. Além disso, uma nota ou duas primeiro:

  • Com essa sintaxe alternativa, você não pode usar as tags de modelo, pois elas não estarão disponíveis

Você precisa trabalhar diretamente com os objetos WP_Post e usar filtros conforme descrito na link

  • Você não precisa redefinir pós-dados, pois não está alterando os globais

Você pode tentar

$args = array(
    'post_type' => 'testimonial',
    'offset' => 2,
    'posts_per_page' => 1
);
$testimonials = new WP_Query( $args );

//Displays the title
echo apply_filters( 'the_title', $testimonials->posts[0]->post_title );

//Displays the content
echo apply_filters( 'the_content', $testimonials->posts[0]->post_content );
    
por Pieter Goosen 20.01.2015 / 14:02
3

Você pode usar a propriedade current_post e o método rewind_posts() da classe WP_Query para segmentar os objetos de postagem relevantes.

Você pode tentar jogar com o seguinte exemplo (não testado):

if( $testimonials->post_count >= 3 )
{
    // First post:
    $nr = 1;
    if( isset( $testimonials->posts[$nr-1] ) )
    {
        $testimonials->rewind_posts();
        $testimonials->current_post = $nr - 2;
        $testimonials->the_post();
        the_title();
    }

    // Third post:
    $nr = 3;
    if( isset( $testimonials->posts[$nr-1] ) )
    {
        $testimonials->rewind_posts();
        $testimonials->current_post = $nr - 2;
        $testimonials->the_post();
        the_title();
    }

    // Second post:
    $nr = 2;
    if( isset( $testimonials->posts[$nr-1] ) )
    {
        $testimonials->rewind_posts();
        $testimonials->current_post = $nr - 2;
        $testimonials->the_post();
        the_title();
    }  

    wp_reset_postdata();
}    

Você também pode usá-lo assim, com seus atuais while loops:

$testimonials = new WP_Query( $args );

// First post:
$nr = 1; 
while( $testimonials->have_posts() && ( $nr - 2 ) === $testimonials->current_post ) {
    $testimonials->the_post();
    // ...
}

// Third post:
$nr = 3;
$testimonials->rewind_posts();
while( $testimonials->have_posts() && ( $nr - 2 ) === $testimonials->current_post ) {
    $testimonials->the_post();
    // ...
}

// Second post:
$nr = 2;
$testimonials->rewind_posts();
while( $testimonials->have_posts() && ( $nr - 2 ) === $testimonials->current_post ) {
    $testimonials->the_post();
    // ...
}

wp_reset_postdata();   
    
por birgire 20.01.2015 / 14:19