Я использую функцию 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 является массивом, который я отправил выше.
Как я могу изменить свой код, чтобы запросить сообщения и показать им в порядке массива?
Если запрос только для небольшого количества сообщений, то, как связано с 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);
WordPress 3.5 будет видеть дополнительное значение, принятое WP_Query
для orderby
: 'отправьте __ в'. См. этот trac билет: http://core.trac.wordpress.org/ticket/13729
Необходимо будет угнать получающийся 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
Надежда это полезно.Удачи!
implode
функционируйте для преобразования массива в разделенный запятыми список идентификаторов, которые можно использовать в этом FIELD
:)
– kovshenin
11.10.2012, 00:53
WP_Query
и удаление его снова впоследствии.
– Stephen Harris
11.10.2012, 02:32
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 )
Править: ЗДЕСЬ ищите ссылку.
[0] => 17983, ...
отличающийся от array( 17983, ... )
:) Первый просто a print_r
из последнего.
– kovshenin
11.10.2012, 00:53
Вот более простое Обходное решение для достижения, это, просто для создания пользовательского поля для каждого из этих сообщений с тем же ответом имени установило желаемый порядок, исключая:
затем в Вашем запросе просто заказывают тем пользовательским полем:
$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
будет запрошен от базы данных.