Сообщения запроса в предопределенном порядке

Я использую функцию query_posts для списка 10 определенные сообщения который поиск идентификатором сообщения.

У меня есть массив, который похож на это..

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

Я хотел бы запросить сообщения, показывающие его в том определенном порядке, однако с моим кодом, который это показывает им в собственном произвольном порядке.

Вот аргумент, который я использую для сообщений запроса:

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

$post_ids является массивом, который я отправил выше.

Как я могу изменить свой код, чтобы запросить сообщения и показать им в порядке массива?

5
11.10.2012, 01:17
4 ответа

Если запрос только для небольшого количества сообщений, то, как связано с Alex можно отсортировать в php. Однако это не масштабируется хорошо.

Как предложено Kovshenin - лучшая альтернатива должна использовать posts_orderby фильтр:

$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 будет видеть дополнительное значение, принятое WP_Query для orderby: 'отправьте __ в'. См. этот trac билет: http://core.trac.wordpress.org/ticket/13729

5
19.02.2020, 22:08
  • 1
    Спасибо за код, хотя я попробовал его и также сделал редактирования к нему, я не могу добраться, это для запросов сообщений в порядке массива (Извините, что были болью), –  Imran 11.10.2012, 03:25
  • 2
    я отредактировал свой ответ, вышеупомянутые работы для меня. –  Stephen Harris 11.10.2012, 04:24
  • 3
    Просто протестированный снова теперь, это действительно работает :D Я думаю, что это была проблема с, в то время как statment я имел. Спасибо за справку Stephen! –  Imran 12.10.2012, 03:08

Необходимо будет угнать получающийся SQL-запрос во время posts_orderby и используйте MySQL ORDER BY FIELD() функция с разделенным запятыми списком от Вашего массива. Вот больше информации о FIELD функция: http://www.electrictoolbox.com/mysql-order-specific-field-values/

Я сделал это некоторое время назад, когда у меня был возврат Сфинкса список идентификаторов сообщения, заказанных уместностью, таким образом, я должен был выбрать их с WP_Query в том точно том же порядке. FIELD() во время posts_orderby фильтр работал как очарование.

Кроме того, если Вы используете query_posts для изменения основного запроса это не лучший способ сделать это. @Alex упоминается WP_Query, который не действительно отличается от query_posts и также плохой путь к (заставьте его походить на Вас), измените основной запрос.

Корректный путь состоял бы в том, чтобы использовать pre_get_posts действие и изменение переданный в ссылкой $query объект. Можно узнать больше о pre_get_posts здесь: http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

Надежда это полезно.Удачи!

1
19.02.2020, 22:08
  • 1
    О, и можно использовать php implode функционируйте для преобразования массива в разделенный запятыми список идентификаторов, которые можно использовать в этом FIELD :) –  kovshenin 11.10.2012, 00:53
  • 2
    Запрос не является основным запросом, ее используемым для системы построения диаграммы на боковой панели. Я взглянул на codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby. Путем добавления этой функции, хотя ее попытка изменить основной запрос, а не запрос боковой панели не так ли? –  Imran 11.10.2012, 01:05
  • 3
    @Imran, можно быть нацелены на определенный запрос путем добавления фильтра сразу перед WP_Query и удаление его снова впоследствии. –  Stephen Harris 11.10.2012, 02:32
  • 4
    @StephenHarris: можно ли показать мне пример этого? –  Imran 11.10.2012, 02:46
  • 5
    @Imran, если Вам действительно нужен вторичный цикл, затем new WP_Query или get_posts будет работать лучше всего. posts_orderby обращен каждый запрос. Как предложенный Stephen, можно добавить фильтр прежде, чем выполнить запрос и удалить его вскоре после. –  kovshenin 11.10.2012, 10:28

В первую очередь, не использовать query_posts(), использовать WP_Query().

Во-вторых, измените свой массив на просто идентификаторы сообщения.

от:

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

кому:

array( 17983, 17932 )

Править: ЗДЕСЬ ищите ссылку.

-1
19.02.2020, 22:08
  • 1
    Ха? Как точно [0] => 17983, ... отличающийся от array( 17983, ... ) :) Первый просто a print_r из последнего. –  kovshenin 11.10.2012, 00:53

Вот более простое Обходное решение для достижения, это, просто для создания пользовательского поля для каждого из этих сообщений с тем же ответом имени установило желаемый порядок, исключая:

  • для сообщения с идентификатором = 17983 устанавливает пользовательское поле, названное my_custom_order = 1
  • для сообщения с идентификатором = 18030 устанавливает пользовательское поле, названное my_custom_order = 2
  • для сообщения с идентификатором = 18016 устанавливает пользовательское поле, названное my_custom_order = 3
  • Вы понимаете

затем в Вашем запросе просто заказывают тем пользовательским полем:

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

Примечание: После того как Вы делаете это (установите пользовательское поле для этих сообщений), можно удалить 'post__in' => $post_ids, параметр с тех пор только сообщения с пользовательским полем my_custom_order будет запрошен от базы данных.

0
19.02.2020, 22:08

Теги

Похожие вопросы