• Resuelto Aitor Méndez

    (@aitormendez)


    Buenos días. Tengo una página de archivo archive-book.php en donde tengo que ordenar los posts por categoría, de modo que tengo que hacer mi propia query.

    Me pregunto, ya que no uso la WP_query principal, si puedo eliminarla completamente para ahorrarme peticiones a la BD.

    Muchas gracias.

    PS: he intentado minimizar la query con pre_get_posts, dejando el número de posts a cero, pero no funciona.

    add_filter('pre_get_posts', function ($query) {
        if ( $query->is_archive('book') && $query->is_main_query() ) {
            $query->set( 'posts_per_page', 0 );
            return;
        }
    });
Viendo 6 respuestas - de la 1 a la 6 (de un total de 6)
  • Moderador kallookoo

    (@kallookoo)

    Hola @aitormendez,

    No tienes porque eliminarla, sino aprovecharla.
    Usa pre_get_posts y set para crear una tax_query y cambiar la manera de ordenacion, etc…

    Con ello, recibirias todos los posts de book, ordenados por la taxonomia despues podrias crear varios loops para filtrar por el nombre de la taxonomia.

    Tambien podrias solo incluir x taxonomia y despues crear loops por cada taxonomia que quede.

    Sea como sea tienes que tener presente la paginacion, ya que puedes tener problemas si tienes intencion de usarla.

    Mirate este link https://codex.wordpress.org/Class_Reference/WP_Query

    • Esta respuesta fue modificada hace 6 años por kallookoo. Razón: link WP_Query
    Iniciador del debate Aitor Méndez

    (@aitormendez)

    Tienes razón. Ahora que lo dices, suena obvio. Gracias por la respuesta.

    Iniciador del debate Aitor Méndez

    (@aitormendez)

    Pongo aquí mi solución. No he conseguido ordenar los posts por taxonomy term con pre_get_posts. He estado investigando la manera de hacerlo y no he dado con ello. Sin embargo, la solución era muy sencilla iterando dos veces sobre los posts de la main query:

    @while (have_posts()) @php the_post() @endphp
        @if (has_term('bold', 'weight'))
          @include('partials.content-'.get_post_type())
        @endif
      @endwhile
    
      @while (have_posts()) @php the_post() @endphp
        @if (has_term('light', 'weight'))
          @include('partials.content-'.get_post_type())
        @endif
      @endwhile

    La notación es de Blade, espero que se entienda: https://laravel.com/docs/5.7/blade

    Iniciador del debate Aitor Méndez

    (@aitormendez)

    Vale, ya lo he entendido: La tax_query es sólo para recuperar los posts, pero no ordena los posts ¿no? Es decir, luego tengo que iterar igualmente dos veces por los posts (dos loops).

    Lo que me falla ahora es la notación para el método set. He intentado esto, pero no funciona la parte de la tax_query:

    add_filter('pre_get_posts', function ($query) {
        if ( !$query->is_admin() && $query->is_archive('book') && $query->is_main_query() ) {
            $query->set( 'nopaging', true );
            $query->set( 'meta_key', 'production_date' );
            $query->set( 'orderby', 'meta_value' );
            $query->set( 'order', 'DESC' );
            $query->set( 'tax_query', array(
    			'taxonomy' => 'book',
    			'field'    => 'slug',
    			'terms'    => array( 'light', 'comedy' ),
    		) );
            return;
        }
    });

    ¿Cómo sería la notación correcta?

    Moderador kallookoo

    (@kallookoo)

    Buenas,
    No entiendo porque usas la notacion de lavarel, pero eso es secundario.
    Tienes razon no me acordaba que directamente no puedes ordenarlo por la tax.
    Lamento que no me entendieses y leyendo lo que te conteste me falto decirte que mirases los filtros que tienes al final del link que te puse.

    La tax_query no te funciona porque debe ser un array de arrays

    
    $query->set( 'tax_query', array(
    	array(
    		'taxonomy' => 'book',
    		'field'    => 'slug',
    		'terms'    => array( 'light', 'comedy' ),
    	),
    ) );
    

    Ahora lo que deberias mirarte son los filtros para acabar de refinarlo, aparte te recomiendo que mires el source para ver como actua, por lo menos a mi me ayuda.

    Iniciador del debate Aitor Méndez

    (@aitormendez)

    Eso es! muchas gracias @kallookoo.

    Lo de Laravel es porque el starter theme que utilizo lo lleva implementado:

    https://roots.io/sage/docs/blade-templates/

Viendo 6 respuestas - de la 1 a la 6 (de un total de 6)
  • El debate ‘¿Se puede eliminar completamente la main query de una página de archivo?’ está cerrado a nuevas respuestas.