Consultas en un orden predefinido

4

Estoy usando la función query_posts para listar 10 publicaciones específicas que buscan por ID de publicación.

Tengo una matriz que se ve así ...

Array
(
    [0] => 17983
    [1] => 17932
    [2] => 18030
    [3] => 18016
    [4] => 17972
    [5] => 18013
    [6] => 18035
    [7] => 17959
    [8] => 18020
    [9] => 18039
)

Me gustaría consultar las publicaciones que lo muestran en ese orden específico, sin embargo, con mi código las muestra en un orden aleatorio propio.

Aquí está el argumento que utilizo para las publicaciones de consulta:

$args = array(
    'post_type' => 'post',
    'post__in' => $post_ids,
    'numberposts'     => 10,
);

$ post_ids es la matriz que he publicado anteriormente.

¿Cómo puedo modificar mi código para consultar las publicaciones y mostrarlas en el orden de la matriz?

    
pregunta Imran 10.10.2012 - 23:37

5 respuestas

4

Si la consulta es solo para un número pequeño de publicaciones, entonces, como vinculado a Alex, puedes clasificar en php. Sin embargo, esto no escala bien.

Según lo sugerido por Kovshenin, una mejor alternativa es usar posts_orderby filter:

$post_ids = array(83,24,106,2283,14);
$args = array(
    'post_type' => 'post',
    'post__in' => $post_ids,
    'numberposts'     => 10,
);

//Callback to filter the ORDER BY part of the query
function wpse67823_orderby_post_in($orderby, $query){
     global $wpdb;

     //Remove it so it doesn't effect future queries
     remove_filter(current_filter(), __FUNCTION__);

     $post__in = implode(',',$query->get('post__in'));

     return "FIELD( {$wpdb->posts}.ID, $post__in )";
 }

//Add filter and perform query
add_filter('posts_orderby','wpse67823_orderby_post_in',10,2);
$wpse67823_query = new WP_Query($args);

3.5+

WordPress 3.5 verá un valor adicional aceptado por WP_Query para orderby : 'post__in'. Consulte este ticket de trac: enlace

    
respondido por el Stephen Harris 11.10.2012 - 01:50
1

Deberá secuestrar la consulta SQL resultante durante posts_orderby y usar la función ORDER BY FIELD() de MySQL con una lista separada por comas de su matriz. Aquí hay más información sobre la función FIELD : enlace

Hice esto hace bastante tiempo cuando hice que Sphinx devolviera una lista de ID de publicaciones ordenadas por relevancia, así que tuve que seleccionarlas con WP_Query en ese mismo orden. FIELD() durante el filtro posts_orderby funcionó como un encanto.

Además, si está utilizando query_posts para alterar la consulta principal, no es la mejor manera de hacerlo. @Alex mencionó a WP_Query , que no es realmente diferente de query_posts y también es una mala manera de (hacer que parezca que usted) altera la consulta principal.

La forma correcta sería utilizar la acción pre_get_posts y cambiar el objeto de referencia $query pasado. Puede obtener más información sobre los pre_get_posts aquí: enlace

Espero que sea útil. ¡Salud!

    
respondido por el kovshenin 10.10.2012 - 23:51
0

En primer lugar, no uses query_posts() , usa WP_Query() .

Segundo, cambie su matriz a solo los ID de publicación.

desde:

[0] => 17983
[1] => 17932

a

array( 17983, 17932 )

EDIT : busque AQUÍ para obtener una referencia .

    
respondido por el Xhynk 10.10.2012 - 23:40
0

Aquí hay una solución alternativa más simple para lograr esto, simplemente cree un campo personalizado para cada una de estas publicaciones con el mismo nombre y establezca el orden deseado, por ejemplo:

  • para publicación con id = 17983 establece un campo personalizado llamado my_custom_order = 1
  • para publicación con id = 18030 establece un campo personalizado llamado my_custom_order = 2
  • para publicación con id = 18016 establece un campo personalizado llamado my_custom_order = 3
  • obtienes el punto

luego en su consulta simplemente ordene por ese campo personalizado:

$args = array(
    'post_type' => 'post',
    'post__in' => $post_ids,
    'posts_per_page' => 10,
    'meta_key' => 'my_custom_order',
    'orderby' => 'meta_value',
    'order' => 'ASC'
);

Nota: Una vez que haga eso (establezca el campo personalizado para estas publicaciones), puede eliminar el parámetro 'post__in' => $post_ids, , ya que solo las publicaciones con el campo personalizado de my_custom_order se consultarán desde la base de datos.

    
respondido por el Bainternet 11.10.2012 - 21:48
0

Según la respuesta de @Stephen Harris, para Wordpress 3.5+, la opción más fácil parece ser ordenar por post__in .

Aquí está el ejemplo:

$post_ids = Array(12, 15, 18, 8, 10, 5);

$args = array(
  'post_type' => 'post',
  'post__in' => $post_ids,
  'numberposts' => 10,
  'orderby' => 'post__in'
);
$posts = WP_Query($args); // or any other method that uses WP_Query args e.g. get_posts()

// as a result you will get posts in order: 12, 15, 18, 8, 10, 5

Lo he probado yo mismo en un sitio de Wordpress 4.7 y funciona como se esperaba.

    
respondido por el jmarceli 06.04.2017 - 13:42

Lea otras preguntas en las etiquetas