Ordenar publicaciones por campo personalizado
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;
}

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

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í?

@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.

¿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).

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.

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.
