• Resuelto SerGi

    (@sdesergi)


    Buenas,

    Antes que nada disculpad si cometo algun error creando este debate, pues es la primera vez que uso el foro de soporte de wordpress. También os informo de que mis conocimientos de php son más limitados de lo que quisiera.

    Mi caso es el de alguien que quiere modificar el Loop de la última plantilla que wordpress lleva por defecto (Twenty seventeen), en su archivo index.php, para que, en el frontpage, pueda mostrar las entradas de una categoria en concreto.

    Para lograr esto busqué en el códex para finalmente dar con esta obertura del Loop:

    $loop_customizado = new WP_Query(‘cat=3’);
    if ($loop_customizado-> have_posts()):
    /* Start the Loop */
    while ($loop_customizado-> have_posts()): $loop_customizado-> the_post();

    El resto sigue tal y como está en la plantilla de wordpress.

    ¿Funciona? Sí, pero en cada una de las paginaciones del blog me repite exactamente las mismas entradas. Cabe decir que he probado otros métodos para modificar el Loop con idénticos o similares resultados. Unos crean el mimso nº de entradas que nº de entradas hay en dicha categoria mientras que otros crean el mismo nº de entradas que cantidad total hay de entradas en el blog. Sea como sea, y una vez creada la paginación, puedes leer exactamente el mismo contenido en cada una de las páginas (1, 2, 3, 4…). Los cambios los realizo en un tema hijo. Todo me ha funcionado perfecto pero este detalle no consigo solucionarlo y he ido siguiendo el códex con varios ejemplos 🙁

    No he encontrado un debate similar que pudiera ayudarme, espero encontrar con alguien que sepa como solucionarlo. ¡Muchas gracias de antemano!

    SerGi

Viendo 15 respuestas - de la 1 a la 15 (de un total de 30)
  • Moderador almendron

    (@almendron)

    Prueba con

    $query = new WP_Query( array( 'cat' => 3, 'posts_per_page' => 10 ) );

    https://codex.wordpress.org/Class_Reference/WP_Query

    Moderador LGrusin

    (@lgrusin)

    Con paginación:
    $loop_customizado = new WP_Query( array( 'cat' => 3, 'posts_per_page' => 10, 'paged' => $paged ) );

    Un saludo

    Iniciador del debate SerGi

    (@sdesergi)

    ¡Gracias a los dos!

    LGrusin el argumento paged es el que funciona. Por fin se paginan las entradas sin repetir contenido, solo que el nº de paginaciones sigue respondiendo al nº de entradas totales en el blog en vez del nº de entradas de esa categoria en concreto. Como la cantidad siempre es mayor tenemos como resultado páginas vacías, sin entradas en los últimos números.

    Sigo buscando por qué debo estar cerca ^^

    Moderador LGrusin

    (@lgrusin)

    Pues no debería pasar. Comprueba que no haya más loops.

    También elimina temporales, vacía caché si usas, en fin, revisa todo bien.

    Un saludo

    Iniciador del debate SerGi

    (@sdesergi)

    Buenas,

    Hoy hice los deberes: limpié datos de navegación e instalé un wordpress en local desde 0, última versión, plantilla Twenty Seventeen. 0 plugins (ni akismet o Hello Dolly), 0 modificaciones. Base de datos nueva no compartida. Xampp actualizado a 7.1.7 (antes corría con la 5.6.24). Ajustes y configuraciones intactas. A partir de ahí creé 1 categoria con 20 entradas y 3 categorias con 10 entradas cada una. Al comprobar la paginación funcionaba correctamente. Todo bien.

    Modifico el Loop substituyendo solamente las siguientes líneas:

    			<?php
    			if ( have_posts() ) :
    
    				/* Start the Loop */
    				while ( have_posts() ) : the_post();

    Por éstas otras:

    			<?php
          $query = new WP_Query( array( 'cat' => 1, 'posts_per_page' => 10, 'paged' => $paged ) );  
          if ($query-> have_posts()):
    
    				/* Start the Loop */
    				while ($query-> have_posts()): $query-> the_post();

    Resultado: páginas vacías con el mensaje «nada encontrado». Solo estaban llenas las dos páginas correspondientes a las 20 entradas a mostrar, sin embargo habia 5 páginas dónde navegar.

    Hice pruebas configurando enlaces permanentes, cambiando la categoría por defecto, añadiendo en el código el parámetro que especifica también el nº de entradas por página (por aquéllo de copiar intacto el código que te aconsejan), cambiando la categoría a filtrar… y una variedad de cambios y pruebas que se acostumbran a hacer cuando vamos perdidos, aún sabiendo que poco o nada tienen que ver con la solución.

    Entonces… ¿es fallo del códex? Si es fallo mio no tengo ni idea de a dónde más puedo buscar.

    Moderador almendron

    (@almendron)

    Te faltaría añadir wp_reset_postdata(); justo en la línea después de endwhile;.

    Moderador almendron

    (@almendron)

    He hecho alguna prueba y creo que el problema está en que estás modificando el archivo index.
    En este archivo debes poner lo siguiente:

    $misEntradas = new WP_Query( 'cat=1' );
    if ( $misEntradas->have_posts() ) :		
      while ( $misEntradas->have_posts() ): 
        $misEntradas->the_post();

    Y luego ajustar el número de entradas en los ajustes de lectura.

    Lo que tú estás poniendo es para una página de plantilla:
    1) Copias el index.php y lo guardas como index-cat1.php
    2) Editas el index-cat1.php y en la primera línea pones <?php /* Template Name: cat1 */ ?>
    3) Sustituye el loop por el personalizado.
    4) Crea una nueva página y le asignas esa plantilla.

    Moderador LGrusin

    (@lgrusin)

    Una opción quizás más fácil es copiar el archivo index.php y crear un archivo home.php

    Después editas en el home.php

    Por cierto, ¿estás poniendo el ID de la categoría correcto? No se me ocurre qué puedes estar haciendo mal.

    Un saludo

    • Esta respuesta fue modificada hace 7 años, 6 meses por LGrusin.
    Iniciador del debate SerGi

    (@sdesergi)

    Sisi, e incluso he ido probando lo que se me ocurria. La categoria funciona, el problema era que las entradas se multiplicaban como hamsters y luego que aparecian «con paginaciones vacías de más».

    ¡Os agradezco las soluciones! Aunque no sabria cómo hacerlo seguro que si me pongo no es complicado. Supongo que establecer una página estática como inicio seria otra posible solución pero perdiendo la funcionalidad característica que tiene la plantilla en su Frontpage y que no sabría emular (y menos en el backend).

    Creo que me conformaré con mostrar un número limitado de entradas en el index.php con un enlace al final del estilo… «ver todoas las noticias». Ya estoy conencido de que será mucho mejor 🙂

    ¡Gracias de nuevo y Un saludo!

    Moderador LGrusin

    (@lgrusin)

    Que pronto te das por vencido, seguro que es algún error al teclear.

    Podrías ponernos el archivo index.php completo con las modificaciones. Así estaríamos seguro de que has realizado los cambios de forma correcta.

    Un saludo

    Iniciador del debate SerGi

    (@sdesergi)

    Bien, entonces sigamos 🙂

    Ahí va el index.php más básico que tengo (el de las pruebas que hice esta mañana):

    <?php
    /**
     * The main template file
     *
     * This is the most generic template file in a WordPress theme
     * and one of the two required files for a theme (the other being style.css).
     * It is used to display a page when nothing more specific matches a query.
     * E.g., it puts together the home page when no home.php file exists.
     *
     * @link https://codex.wordpress.org/Template_Hierarchy
     *
     * @package WordPress
     * @subpackage Twenty_Seventeen
     * @since 1.0
     * @version 1.0
     */
    
    get_header(); ?>
    
    <div class="wrap">
    	<?php if ( is_home() && ! is_front_page() ) : ?>
    		<header class="page-header">
    			<h1 class="page-title"><?php single_post_title(); ?></h1>
    		</header>
    	<?php else : ?>
    	<header class="page-header">
    		<h2 class="page-title"><?php _e( 'Posts', 'twentyseventeen' ); ?></h2>
    	</header>
    	<?php endif; ?>
    
    	<div id="primary" class="content-area">
    		<main id="main" class="site-main" role="main">
    
    			<?php
          $query = new WP_Query(array('cat' => 3, 'paged' => $paged));
    			if ( have_posts() ) :
    
    				/* Start the Loop */
    				while ( have_posts() ) : the_post();
    
    					/*
    					 * Include the Post-Format-specific template for the content.
    					 * If you want to override this in a child theme, then include a file
    					 * called content-___.php (where ___ is the Post Format name) and that will be used instead.
    					 */
    					get_template_part( 'template-parts/post/content', get_post_format() );
    
    				endwhile;
    
    				the_posts_pagination( array(
    					'prev_text' => twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '<span class="screen-reader-text">' . __( 'Previous page', 'twentyseventeen' ) . '</span>',
    					'next_text' => '<span class="screen-reader-text">' . __( 'Next page', 'twentyseventeen' ) . '</span>' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ),
    					'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Page', 'twentyseventeen' ) . ' </span>',
    				) );
    
    			else :
    
    				get_template_part( 'template-parts/post/content', 'none' );
    
    			endif;
    			?>
    
    		</main><!-- #main -->
    	</div><!-- #primary -->
    	<?php get_sidebar(); ?>
    </div><!-- .wrap -->
    
    <?php get_footer();

    Poniendo el Loop en el home.php tampoco funciona

    Iniciador del debate SerGi

    (@sdesergi)

    Ups…

    Lo copié incompleto. Rectifico la línea del while…
    while ($query-> have_posts()): $query-> the_post();

    Iniciador del debate SerGi

    (@sdesergi)

    Pufff menudo lio, hice ya como 40 index.php de pruebas…

    Vuelvo a copiar el index.php tal cual lo tengo en la web

    <?php
    /**
     * The main template file
     *
     * This is the most generic template file in a WordPress theme
     * and one of the two required files for a theme (the other being style.css).
     * It is used to display a page when nothing more specific matches a query.
     * E.g., it puts together the home page when no home.php file exists.
     *
     * @link https://codex.wordpress.org/Template_Hierarchy
     *
     * @package WordPress
     * @subpackage Twenty_Seventeen
     * @since 1.0
     * @version 1.0
     */
    
    get_header(); ?>
    
    <div class="wrap">
    
    	<div id="primary" class="content-area">
    		<div id="main" class="site-main" role="main">
    
    			<?php
          
          $query = new WP_Query(array('cat' => 3, 'paged' => $paged));  
          if ($query-> have_posts()):
    
    				/* Start the Loop */
    				while ($query-> have_posts()): $query-> the_post();
    
    					/*
    					 * Include the Post-Format-specific template for the content.
    					 * If you want to override this in a child theme, then include a file
    					 * called content-___.php (where ___ is the Post Format name) and that will be used instead.
    					 */
    					get_template_part( 'template-parts/post/content', get_post_format() );
    
    				endwhile;
    
    				the_posts_pagination( array(
    					'prev_text' => twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '<span class="screen-reader-text">' . __( 'Previous page', 'twentyseventeen' ) . '</span>',
    					'next_text' => '<span class="screen-reader-text">' . __( 'Next page', 'twentyseventeen' ) . '</span>' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ),
    					'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Page', 'twentyseventeen' ) . ' </span>',
    				) );
    
    			else :
    
    				get_template_part( 'template-parts/post/content', 'none' );
    
    			endif;
    			?>
    
    		</div><!-- #main -->
    	</div><!-- #primary -->
    	<?php get_sidebar(); ?>
    </div><!-- .wrap -->
    
    <?php get_footer();

    Disculpad la confusión 😛

    Moderador LGrusin

    (@lgrusin)

    Claro, estabas haciendo trampas… 🙂

    Es imprescindible que le digas cuantos posts de esa categoría quieres mostrar, es decir:
    $query = new WP_Query(array('cat' => 3, 'posts_per_page' => 8, 'paged' => $paged));

    Ocho, diez o los que sean, aunque coincidan con el valor que has puesto en Ajustes – Lectura. El query es nuevo por tanto debes pasarle todos los valores que necesite.

    Un saludo

    Moderador almendron

    (@almendron)

    Yo he hecho la prueba en local con el mismo tema y la paginación no funcionaba bien. De hecho, mandaba la de ajustes de lectura en cuanto a entradas por página.

    A mi solo me ha funcionado

    $misEntradas = new WP_Query( 'cat=3' );
    if ( $misEntradas->have_posts() ) :		
      while ( $misEntradas->have_posts() ): 
        $misEntradas->the_post();

    y ajustando luego el número de entradas en ajustes de lectura.

Viendo 15 respuestas - de la 1 a la 15 (de un total de 30)
  • El debate ‘Paginación que repite las mismas entradas’ está cerrado a nuevas respuestas.