Consulta de publicações em um pedido predefinido

4

Estou usando a função query_posts para listar 10 postagens específicas que procuram por ID de postagem.

Eu tenho uma matriz que se parece com isso ..

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

Gostaria de consultar as postagens que mostrem essa ordem específica, mas, com meu código, elas são exibidas em uma ordem aleatória própria.

Aqui está o argumento que uso para postagens de consulta:

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

$ post_ids é o array que eu postei acima.

Como posso alterar meu código para consultar as postagens e mostrá-las na ordem da matriz?

    
por Imran 10.10.2012 / 23:37

5 respostas

4

Se a consulta for apenas para um pequeno número de postagens, então, como vinculado por Alex, você pode classificar em php. No entanto, isso não escala bem.

Como sugerido por Kovshenin - uma alternativa melhor é 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 +

O WordPress 3.5 verá um valor adicional aceito por WP_Query para orderby : 'post__in'. Veja este bilhete do trac: enlace

    
por Stephen Harris 11.10.2012 / 01:50
1

Você precisará seqüestrar a consulta SQL resultante durante posts_orderby e usar a função ORDER BY FIELD() do MySQL com uma lista separada por vírgulas de sua matriz. Veja mais informações sobre a função FIELD : enlace

Eu fiz isso há algum tempo quando fiz o Sphinx retornar uma lista de IDs postados por relevância, então eu tive que selecioná-los com WP_Query na mesma ordem. FIELD() durante o filtro posts_orderby funcionou como um encanto.

Além disso, se você estiver usando query_posts para alterar a consulta principal, não é a melhor maneira de fazer isso. @Alex mencionou WP_Query , o que não é realmente diferente de query_posts e também é uma maneira ruim de (fazer parecer com você) alterar a consulta principal.

A maneira correta seria usar a ação pre_get_posts e alterar o passado pelo objeto $query de referência. Você pode saber mais sobre pre_get_posts aqui: enlace

Espero que isso seja útil. Felicidades!

    
por kovshenin 10.10.2012 / 23:51
0

Antes de mais nada, não use query_posts() , use WP_Query() .

Em segundo lugar, altere sua matriz para apenas os IDs dos posts.

de:

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

para

array( 17983, 17932 )

EDITAR : Procure AQUI como referência .

    
por Xhynk 10.10.2012 / 23:40
0

Aqui está uma solução mais simples para conseguir isso, basta criar um campo personalizado para cada uma dessas postagens com o mesmo nome e definir seu pedido desejado, ex:

  • para postagem com id = 17983, defina um campo personalizado chamado my_custom_order = 1
  • para postagem com id = 18030, defina um campo personalizado chamado my_custom_order = 2
  • para postagem com id = 18016, defina um campo personalizado chamado my_custom_order = 3
  • você começa o ponto

em seguida, na sua consulta, simplesmente ordene por esse 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: Depois de fazer isso (defina o campo personalizado para essas postagens), você pode remover o parâmetro 'post__in' => $post_ids, , já que somente postagens com o campo personalizado de my_custom_order serão consultadas no banco de dados.

    
por Bainternet 11.10.2012 / 21:48
0

Com base na resposta do @Stephen Harris, para o Wordpress 3.5+ a opção mais fácil parece estar sendo feita por post__in .

Aqui está o exemplo:

$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

Eu testei isso em um site Wordpress 4.7 e funciona como esperado.

    
por jmarceli 06.04.2017 / 13:42