Ordenar publicaciones por campo personalizado

8 abr 2015, 16:59:51
Vistas: 16.8K
Votos: 2

Estoy intentando ordenar mis publicaciones por el campo personalizado artwork_title. Cuando uso el siguiente código, solo obtengo una categoría particular de publicaciones sin importar en qué archivo de categoría esté.

Además, la paginación muestra el número correcto de páginas pero al avanzar a la siguiente página siempre muestra el mismo conjunto de publicaciones. ¿Alguien ve qué estoy haciendo mal?

<?php $query = new WP_Query(
    array(
        'posts_per_page' => 20,
        'orderby' => 'meta_value',
        'meta_key' => 'artwork_title',
        'order' => 'ASC'
    ) ); ?>

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

                <?php get_template_part( 'content', get_post_format() );
                ?>

            <?php endwhile; ?>

@PieterGoosen sugirió usar pre_get_posts. No tengo experiencia con eso pero intenté esto pero no obtengo ningún resultado al usarlo. Seguro es algo simple.

<?php add_action( 'pre_get_posts', 'sort_artwork_title' );?>

function sort_artwork_title( $query )
{
    if (is_admin()){
        return;
    }

   if( $query->is_main_query() && is_post_type_archive() ) {


            $query->set('orderby', 'artwork_title');
            $query->set('posts_per_page', '20');
            $query->set('order', 'ASC' );
        }
    return $query;
}
1
Comentarios

No uses una consulta personalizada, utiliza pre_get_posts

Pieter Goosen Pieter Goosen
8 abr 2015 17:04:45
Todas las respuestas a la pregunta 1
6

Para ampliar el comentario de @pieter-goosen, efectivamente deberías usar pre_get_posts. En tu ejemplo, al utilizar WP_Query, estás sobrescribiendo la consulta completa y restableciendo la mayoría de sus partes a los valores predeterminados. De hecho, probablemente no estás viendo publicaciones de una categoría específica en absoluto. Deberías estar viendo todas las publicaciones, ya que ese es el valor predeterminado de la clase WP_Query.

En su lugar, usa pre_get_posts que modifica una consulta existente en lugar de crear una completamente nueva. Aquí tienes un fragmento [no probado] que debería funcionar en tu archivo functions.php:

add_action( 'pre_get_posts', 'wpse183601_filter_category_query' );
function wpse183601_filter_category_query( $query ) {
    // solo modifica las páginas de archivo de categorías en el front-end
    if( is_category() && !is_admin() && $query->is_main_query() ) {
        $query->set( 'posts_per_page','20' );
        $query->set( 'orderby','meta_value' );
        $query->set( 'meta_key','artwork_title' );
        $query->set( 'order','ASC' );
    }
}
8 abr 2015 18:14:43
Comentarios

Respondiste mientras yo estaba modificando mi publicación para preguntar sobre pre_get_posts. Muchas gracias. Parece que está funcionando. Pregunta, ¿de dónde salió ese nombre de función? ¿Hay alguna razón por la que no podría llamarse simplemente artwork_title_filter_category_query o algo así?

Thomas Martin Thomas Martin
8 abr 2015 18:28:11

@ThomasMartin puedes nombrar tu función como quieras. Muchos de nosotros usamos el prefijo wpse**** para tener un nombre único para las funciones. wpse significa wordpress stackexchange y los números son el número de la publicación :-). Solo una nota, recuerda renombrar el nombre de la función de callback acordemente.

Pieter Goosen Pieter Goosen
8 abr 2015 18:36:06

¿Necesito agregar algo a mis páginas archive.php, index.php o search.php? Parece estar funcionando bien en las páginas de archivo pero en el índice la lista de publicaciones es aleatoria (o no veo el orden).

Thomas Martin Thomas Martin
8 abr 2015 19:12:51

Olvídalo. Veo que el índice probablemente solo está ordenando las publicaciones más recientes (todas se crearon simultáneamente, por eso no reconozco el orden). Gracias nuevamente por tu ayuda.

Thomas Martin Thomas Martin
8 abr 2015 19:35:11

La cláusula if() en el fragmento establece a qué páginas (técnicamente a qué consultas) se aplica el ordenamiento. Habías mencionado páginas de categorías, así que me basé en eso. Puedes usar la mayoría de las otras condicionales allí sin problema. Deja las dos últimas cosas como están para evitar estropear otras partes de WordPress. Si realmente quieres entender esto, lee la página del Codex enlazada e incluso mira la charla de Nacin "You Don't Know Query" en WordPress.tv.

mrwweb mrwweb
8 abr 2015 19:37:43

Una advertencia es que si el campo personalizado no está asignado, la publicación no aparece. ¿Alguna sugerencia sobre cómo hacer que las publicaciones sin el campo personalizado se agreguen al final?

Wes Modes Wes Modes
12 nov 2019 01:54:32
Mostrar los 1 comentarios restantes