¿Sintaxis para obtener el noveno elemento en una lista de tipos de publicaciones personalizadas?

2

Tenemos un tipo de publicación personalizado testimonial y queremos mostrar el 1º, 2º y 3º en varias ubicaciones a medida en la página.

A continuación, le indicamos cómo lo haríamos si solo quisiéramos recorrer los testimonios y mostrarlos uno tras otro (esto 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 }?>

¿Pero para mostrar solo el primero o solo el tercero o el Nth? Esto es lo que tenemos hasta ahora (para obtener el primero), obviamente está mal:

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

Recibimos un error que dice:

  

Error grave: no se puede utilizar el objeto de tipo WP_Query como matriz

    
pregunta hawbsl 20.01.2015 - 13:28

2 respuestas

6

Use un desplazamiento para omitir las primeras 2 publicaciones si solo necesita la tercera publicación, y luego establezca posts_per_page en 1 para obtener solo esa publicación específica

Puedes probar algo como esto en tus 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 comenzar, algunas notas sobre su código y mi código editado. ( He editado mi código original para mostrar un bucle normal ).

  • No es necesario usar echo get_the_content() . Solo puedes usar the_content() directamente

  • Recuerde restablecer sus datos post después del bucle con wp_reset_postdata() .

Tal como se solicita en los comentarios, aquí está la sintaxis alternativa donde no se usa el bucle. Además, una o dos notas primero:

  • Con esta sintaxis alternativa, no puede usar las etiquetas de plantilla ya que no estarán disponibles

Debe trabajar con los objetos WP_Post directamente y usar los filtros como se describe en link

  • No es necesario restablecer los datos posteriores, ya que no está modificando los indicadores globales

Puedes intentarlo

$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 );
    
respondido por el Pieter Goosen 20.01.2015 - 14:02
3

Puede usar la propiedad current_post y el método rewind_posts() de la clase WP_Query , para orientar los objetos de publicación relevantes.

Puedes intentar jugar con el siguiente ejemplo (sin probar):

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();
}    

También podría usarlo así, con su actual 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();   
    
respondido por el birgire 20.01.2015 - 14:19

Lea otras preguntas en las etiquetas