El bucle personalizado de WordPress no se muestra cuando está en la plantilla de página

11 minutos de lectura

avatar de usuario
Ben dagas

Tengo un bucle personalizado de WordPress en mi archivo de índice que actualmente no funciona. El propósito de este bucle WP personalizado es asignar diferentes clases y estructuras en función de su número de publicación.

El siguiente código funciona perfectamente en el archivo index.php PERO desafortunadamente, no funciona cuando se copia en una plantilla de página personalizada.

<?php
/**
* Template Name: custom page template
*/
get_header(); ?>

<?php if (have_posts()) : ?>
<?php $count = 0; ?>
<?php while (have_posts()) : the_post(); ?>
<?php $count++; ?>
<?php if ($count == 1) : ?>

<div class="item1">
<span>hello!</span<?php the_title(); ?>>
</div><!-- .item# --> 

<?php elseif ($count == 2) : ?>      

<div class="item2">
<?php the_title(); ?><span>Hi!</span
</div><!-- .item# --> 

<?php elseif ($count == 3) : ?>      

<div class="item3">
<!-- Put Your Stuff Here -->
</div><!-- .item# --> 

<?php elseif ($count == 4) : ?>      

<div class="item4">
<!-- Put Your Stuff Here -->
</div><!-- .item# --> 

<?php elseif ($count == 5) : ?>      

<div class="item5">
<!-- Put Your Stuff Here -->
</div><!-- .item# -->

<?php else : ?>

<?php endif; ?>
<?php endwhile; ?>
<?php endif; ?>

Meta:

Lo que estoy tratando de lograr es crear una página personalizada (digamos) www.mywebsite.com/my-custom-page que enumere todos los artículos.

Como se mencionó anteriormente, el bucle personalizado no se muestra en la página, así como la paginación numerada. Como si la plantilla de página no reconociera o ignorara los códigos de bucle personalizados.

He intentado usar el Consulta de WP pero todavía no hay suerte. El siguiente código devuelve “Lo sentimos, ningun texto coincide con tu Criteria.”

Código de consulta de WP que funciona parcialmente

Aquí está mi sitio web donde aparecerá este código pero parece que no funciona

<?php
/**
* Template Name: Custom Page - Blog
*/
get_header(); ?>


<!-- START of WP Query -->

<?php $the_query = new WP_Query( array("post_type"=>'post')); ?>

<?php if ( $the_query->have_posts() ) : ?>

<?php while ($the_query->have_posts()) : $the_query->the_post(); ?>

<?php $count++; ?>

    <?php if ($count == 1) : ?>
    <div class="item1">
        <span>Post 1</span><?php the_title(); ?>
    </div><!-- .item# --> 

    <?php elseif ($count == 2) : ?>      
    <div class="item2">
    <span>Post 2</span><?php the_title(); ?>
    </div><!-- .item# --> 

    <?php elseif ($count == 3) : ?>      
    <div class="item3">
        <span>Post 3</span><?php the_title(); ?>
    </div><!-- .item# --> 

    <?php elseif ($count == 4) : ?>      
    <div class="item4">
        <span>Post 4</span><?php the_title(); ?>
    </div><!-- .item# --> 

    <?php elseif ($count == 5) : ?>      
    <div class="item5">
        <span>Post 5</span><?php the_title(); ?>
    </div><!-- .item# -->

    <?php elseif ($count >= 5 || $count <= 7) : ?>      
    <div class="item6">
        <span>Post 6 to 7</span><?php the_title(); ?>
    </div><!-- .item# -->

    <?php elseif ($count >= 8 || $count <= 15) : ?>      
    <div class="item6">
        <span>Post 8 onwards - </span><?php the_title(); ?><?php the_excerpt(); ?>
    </div><!-- .item# -->

    <?php elseif ($count >= 16) : ?>      
    <div class="item6">
        <span>Post 8 onwards - </span><?php the_title(); ?><?php the_excerpt(); ?>
    </div><!-- .item# -->
    <?php
    global $wp_query;

        $big = 999999999; // need an unlikely integer

        echo paginate_links( array(
        'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
        'format' => '?paged=%#%',
        'current' => max( 1, get_query_var('paged') ),
        'total' => $wp_query->max_num_pages
        ) );
    ?>


<?php else : ?>

<?php endif; ?>
<?php endwhile; ?>
<?php else : ?>
<p><?php esc_html_e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>

<!-- END of WP Query -->


<?php get_footer(); ?>

    </article>

<?php get_footer(); ?>

Agradezco su ayuda en esto. ¡Gracias!

  • ¿Cuál es el nombre del archivo de plantilla de página personalizada?

    – Sagar Bahadur Tamang

    5 de marzo de 2019 a las 7:40

  • Debe hacer llamadas have_posts y the_post desde $the_query para que se conviertan en: $the_query->have_posts() y $the_query->the_post() También configure $args = [‘post_type’=>’post’] Por cierto, puede encontrar todos estos detalles en la página de referencia de WP_Query Class que he mencionado.

    -Mahdi Mehrizi

    6 de marzo de 2019 a las 5:37

  • Necesita agregar su conteo inicial, después de esto <?php if ( $the_query->have_posts() ) : ?> agregar <?php $count++; ?>.

    – diseño a código

    8 de marzo de 2019 a las 14:13

  • Ya lo tiene, vea la 4ta línea.

    – Ben Dagas

    8 de marzo de 2019 a las 15:15

avatar de usuario
Sally C.J.

Como se señaló en las respuestas anteriores, puede usar WP_Query para realizar una consulta personalizada de publicaciones, tipos de publicaciones personalizadas (CPT) y páginas:

$the_query = new WP_Query( array(
    'post_type'      => 'post',
    'posts_per_page' => 10,
    // other args here
) );

Y use El lazo para mostrar las publicaciones:

if ( $the_query->have_posts() ) {
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        //
        // Post Content here
        //
    } // end while
} // end if

Ahora refiriéndome a esto:

Código de consulta de WP que funciona parcialmente

Aquí está mi sitio web donde aparecerá este código pero parece que no funciona

Creo que quisiste decir “el paginación no funciona”, ¿verdad? Porque no:

  1. Porque estás usando el global $wp_query objeto con su paginación.

  2. En tus WP_Query construir, usted no configuró el paged parámetro que se necesita para que la paginación funcione correctamente.

Así es como debería ser:

$current_page = max( 1, get_query_var( 'paged' ) ); // the current page
$the_query = new WP_Query( array(
    'post_type'      => 'post',
    'posts_per_page' => 10,
    'paged'          => $current_page,
    // other args here
) );

Y luego usa el $current_page con paginate_links() — también puedes ver aquí, yo usé $the_query y no $wp_query al recuperar/especificar el número máximo de páginas:

echo paginate_links( array(
    'current'  => $current_page,
    'total'    => $the_query->max_num_pages, // here I don't use $wp_query
    // other args here
) );

Y debajo hay un código de trabajo que puede usar en lugar de su código de trabajo parcial (el que está entre el <!-- START of WP Query --> y <!-- END of WP Query -->):

<?php
$current_page = max( 1, get_query_var( 'paged' ) );
$the_query = new WP_Query( array(
    'post_type'      => 'post',
    'posts_per_page' => 10,
    'paged'          => $current_page,
    // other args here
) );

if ( $the_query->have_posts() ) :
    $count = 1;
    while ( $the_query->have_posts() ) : $the_query->the_post();
        if ( 1 === $count ) :
        ?>
        <div class="item item1" style="background: red; color: #fff;">
            <span>Post 1</span> <?php the_title( '<h3>', '</h3>' ); ?>
        </div>
        <?php
        elseif ( 2 === $count ) :
        ?>
        <div class="item item2" style="background: orange; color: #fff;">
            <span>Post 2</span> <?php the_title( '<h3>', '</h3>' ); ?>
        </div>
        <?php
        // other conditions here
        else :
        ?>
        <div class="item item3" style="background: yellow; color: #666;">
            <span>Post <?php echo $count; ?></span>
            <?php the_title( '<h3>', '</h3>' ); ?>
        </div>
        <?php
        endif;
        $count++;
    endwhile;
?>
<p>Pagination:</p>
<?php
    $big = 999999999; // need an unlikely integer
    echo paginate_links( array(
        'base'     => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
        'format'   => '?paged=%#%',
        'current'  => $current_page,
        'total'    => $the_query->max_num_pages,
        'type'     => 'list',
        'end_size' => 3,
    ) );
?>
<?php else : ?>
    <p><?php esc_html_e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif;

wp_reset_postdata();
?>

  • Hola Sally, disculpa la pregunta. pero, ¿hay alguna manera de agrupar toda la clase item1 en un contenedor div? Entonces item2 en un contenedor div?

    – Ben Dagas

    11 de marzo de 2019 a las 11:01

  • Hola Ben, perdón por la demora. Probar este que debe usarse en lugar del código entre el <!-- START of WP Query --> y <!-- END of WP Query -->.

    – Sally C.J.

    13 de marzo de 2019 a las 2:25

Necesitas definir el $args. Puede encontrar una lista de elementos que puede usar en WP_Query aquí https://www.billerickson.net/code/wp_query-arguments/

Vea abajo:

// WP_Query arguments
$args = array(
    'post_type'              => array( 'post' ),
);

// The Query
$query = new WP_Query( $args );

// The Loop
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // do something
    }
} else {
    // no posts found
}

// Restore original Post Data
wp_reset_postdata();

avatar de usuario
mahdi mehrizi

No sé a qué se refiere con “bucle de WordPress personalizado”, pero el código se está ejecutando para lo que WordPress ya solicitó publicaciones y, en consecuencia, en su página personalizada, ¡esto no está hecho! Asi que have_posts() devuelve falso. Para consultar “a mano” para todas las publicaciones, debe hacer lo siguiente:

$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {

y el resto va de <?php $count = 0; ?> en. para obtener más información sobre WP_Query, consulte lo siguiente
WP_Query

  • He probado tus sugerencias pero no devuelve nada. Vea mi pregunta actualizada arriba. Por cierto, gracias por tomarse el tiempo para mirar mi pregunta.

    – Ben Dagas

    5 de marzo de 2019 a las 8:01

  • Estimado @BenDaggers, debe hacer llamadas have_posts y the_post desde $the_query para que se conviertan en: $the_query->have_posts() y $the_query->the_post() También configure $args = [‘post_type’=>’post’] Por cierto, puede encontrar todos estos detalles en la página de referencia de WP_Query Class que he mencionado.

    -Mahdi Mehrizi

    6 de marzo de 2019 a las 5:33


  • Lo siento, @MahdiMehrizi, soy un novato y me cuesta mucho averiguar qué hay que codificar para insertar en qué línea. ¿Podrias ayudarme por favor?

    – Ben Dagas

    7 de marzo de 2019 a las 2:22

  • @BenDaggers La primera línea de su código (la que ha corregido) se convierte en: ‘post’)); ?> Y la tercera línea se convierte en: have_posts()) : $the_query->the_post(); ?> y el resto está bien..

    -Mahdi Mehrizi

    7 de marzo de 2019 a las 4:34

Please try this one   

  <?php
    /**
     * Template Name: Custom Page - Blog
     */
    ?>

    <?php get_header(); ?>
    <!-- START of WP Query -->
    <?php
    $post_per_page = 10;
    $paged = !empty(get_query_var('paged')) ? get_query_var('paged') : 1;
    $the_query = new WP_Query(array("post_type" => 'post', 'posts_per_page' => $post_per_page));
    $count = ( $paged * $post_per_page ) - ($post_per_page - 1);
    ?>

    <?php if ($the_query->have_posts()) : ?>

        <?php while ($the_query->have_posts()) : $the_query->the_post(); ?>

            <div class="item<?php echo $count ?>">
                <span>Post <?php echo $count ?> </span><?php the_title(); ?>
            </div><!-- .item# -->

            <?php $count++; ?>

        <?php endwhile; ?>

        <?php
        $big = 999999999; // need an unlikely integer

        echo paginate_links(array(
            'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
            'format' => '?paged=%#%',
            'current' => max(1, get_query_var('paged')),
            'total' => $the_query->max_num_pages
        ));
        ?>

    <?php else : ?>
        <p><?php esc_html_e('Sorry, no posts matched your criteria.'); ?></p>
    <?php endif; ?>
    <!-- END of WP Query -->

    <?php get_footer(); ?>

¿Ha sido útil esta solución?