Intereting Posts
Любая причина, по которой wp_cache_set не работает? Конечная точка WordPress REST с интеграцией JSON для мобильных приложений Страница плагинов и возможности Должен ли я устанавливать html-базовый url при использовании wordpress? Как предотвратить дублирование пули для wp_insert_post? Невозможно обновить мои параметры, используя wp_ajax Изменить URL-адрес меню администратора плагина Пользовательский CSS при появлении> Редактировать CSS отсутствует после обновления Как подключиться после отправки электронной почты пользователя? Подкатегории с тем же именем Как показать комментарии Disqus и pingbacks? 404 Страница не найдена на странице / Страница / 2 / на странице тега Изменение раздела комментариев через плагин независимо от темы Изменить пароль для возврата пароля, возвращенный wp_lostpassword_url () через плагин Перечислите пользовательскую таксономию, специфичную для одного типа пользовательских сообщений.

Как упорядочить результаты WP_User_Query в соответствии с порядком массива идентификаторов пользователей?

Я использую WP_User_Query чтобы получить список пользователей из моей базы данных. Я показываю конкретных пользователей только с использованием параметра include . Например:

 $args = array( 'include' => array( 1, 3, 5, 99, 61, 24, 12 ), 'count_total' => true, 'search' => sanitize_text_field( $_GET['phrase'] ) ); $query = new WP_User_Query( $args ); foreach( $query->results as $user ) { echo $user->ID . '<br />'; } 

Результаты в настоящее время упорядочены по user_login . Моя цель – упорядочить результаты по идентификаторам пользователей, используемым в параметре include . Например, если нужно вернуть 5 пользователей (скажем, идентификаторы пользователей 1, 5, 99, 61 и 12), мне нужен цикл foreach для вывода результатов в следующем порядке:

 1 5 99 61 12 

Обратите внимание, что я попытался использовать usort() после выполнения запроса (см. Здесь ), но теперь мне нужны фактические результаты запроса, которые нужно заказать. Я не хочу заказывать результаты запроса после выполнения запроса.

Ссылка: http://codex.wordpress.org/Class_Reference/WP_User_Query

Solutions Collecting From Web of "Как упорядочить результаты WP_User_Query в соответствии с порядком массива идентификаторов пользователей?"

Обновлено:

Класс WP_User_Query в WordPress 4.1+ поддерживает его с помощью:

 'orderby' => 'include' 

Поскольку WordPress 4.7 также поддерживает:

 'orderby' => 'login__in' 

а также

 'orderby' => 'nicename__in' 

Поэтому нам больше не нужно реализовывать его через фильтр, как мы здесь делали ниже.

Предыдущий ответ:

Интересно, работает ли это для вас:

 add_action( 'pre_user_query', 'wpse_order_by_include_values' ) $query = new WP_User_Query( $args ); remove_action( 'pre_user_query', 'wpse_order_by_include_values' ) 

где

 function wpse_order_by_include_values( $q ) { if( isset( $q->query_vars['include'] ) ) { $values = join( ',', $q->query_vars['include'] ); $q->query_orderby = 'ORDER BY FIELD( ID,' . $values . ' )'; } } 

используя функцию FIELD() в MySQL. В комментариях к странице doc MySQL есть примеры использования.

Обновить:

Чтобы сделать его более гибким, мы могли бы использовать этот мини-плагин:

 /** * Support the 'orderby' => '_include' parameter for the WP_User_Query * to order by the values in the include array. * * @see http://wordpress.stackexchange.com/a/167095/26350 */ add_action( 'pre_user_query', function( $q ) { if( isset( $q->query_vars['orderby'] ) && '_include' === $q->query_vars['orderby'] && isset( $q->query_vars['include'] ) && count( $q->query_vars['include'] ) > 0 ) { global $wpdb; $users_in = join( ',', array_map( 'absint', $q->query_vars['include'] ) ); $q->query_orderby = 'ORDER BY FIELD( {$wpdb->users}.ID,' . $users_in . ' )'; } }); 

где мы используем префикс подчеркивания _include , на всякий случай, когда ядро ​​будет использовать значение include в будущем. Обновление . Я скорректировал это так, теперь он более или менее похож на post__in заказа WP_Query класса WP_Query .

Теперь вы можете просто использовать:

 $args = array( 'include' => array( 1, 3, 5, 99, 61, 24, 12 ), 'count_total' => true, 'search' => sanitize_text_field( $_GET['phrase'] ) 'orderby' => '_include', //<-- our new value ); $query = new WP_User_Query( $args ); 

для заказа по массиву include .

Один из вариантов, предложенный вышеприведенным ответом, заключается в добавлении столбца (мета-ключа) с мета-значениями, которые можно легко отсортировать с помощью 'orderby' => 'meta_value' в args.

Вот функция, которую я написал, чтобы добавить мета значения для каждого пользователя. Я $my_order_ids = array( 3, 4, 6, 2, 5 ); его здесь, потому что $my_order_ids = array( 3, 4, 6, 2, 5 ); определяет по возрастанию порядок сортировки пользователей по вашему запросу.

 function my_order_column() { // Defines the user IDs to be updated. // Use the desired order when you define this. $my_order_ids = array( 3, 4, 6, 2, 5 ); // Runs only when $my_order_ids has changed by comparing // it to _transient_my_order_column. if (false === get_transient('my_order_column') || get_transient('my_order_column') !== $my_order_ids) { // Updates _transient_my_order_column set_transient('my_order_column', $my_order_ids); // The first user $order_id = 1; // Add an integer value for each user foreach ($my_order_ids as $user_id) { // Sets/updates the value of my_user_order update_user_meta( $user_id, 'my_user_order', $order_id ); // Confirms that the new value of my_user_order matches the // current value of $order_id if ( get_user_meta($user_id, 'my_user_order', true ) != $order_id ) wp_die('An error occurred'); $order_id++; } ?><div class="updated"> <p><?php echo var_dump($my_order_ids) . '<br />Updated!'; ?></p> </div><?php } } add_action( 'admin_notices', 'my_order_column' ); 

Это использует цикл foreach для добавления нового целочисленного значения в ключ пользователя my_user_order каждого пользователя, каждый раз увеличивая на 1. Все, что вам нужно сделать, это определить $my_order_ids в том порядке, в котором вы хотите, чтобы они были отсортированы позже.

Переходный процесс существует именно так, что обновления будут выполняться только при изменении значений $my_order_ids (другими словами, только обновлять пользователей один раз). Вы можете захотеть прокомментировать add_action( 'admin_notices', 'my_order_column' ); чтобы предотвратить его неожиданное выполнение, если переходный процесс потерян.

Теперь, когда установлены наши новые мета-ключи и метазначения, у нас не должно возникнуть проблемы с запросом на их заказ.

 function my_user_query() { $args = array( 'orderby' => 'meta_value', /***************************************/ 'order' => 'ASC', /***Added orderby, order and meta_key***/ 'meta_key' => 'my_user_order', /***************************************/ // Note: 'include' does not affect how output will be ordered. // array( 6, 5, 3, 2, 4 ) would still be ordered by meta_value. 'include' => array( 3, 4, 6, 2, 5 ), 'count_total' => true, 'search' => sanitize_text_field( $_GET['phrase'] ) ); $query = new WP_User_Query( $args ); ?> <div class="updated"> <p><?php foreach( $query->results as $user ) { echo $user->ID . '<br />'; } ?></p> </div> <?php wp_reset_query(); } add_action( 'admin_notices', 'my_user_query' ); 

В приведенном выше примере в качестве уведомления администратора отображается следующий вывод:

 3 4 6 2 5