Intereting Posts
Как отключить поля в быстром редактировании продукта woocommerce? Сомнения в использовании метаданных и то, как это может повлиять на производительность на WordPress Расширение wp.media.model, запрос медиа из разных блога в сети и просмотр обновления Чудовищная таксономия в wordpress Переопределить вход «Родительский» для пользовательской таксономии Не удается ввести «:: before» для тега li при редактировании страницы WordPress get_post_thumbnail_id / set_post_thumbnail не работает Могут ли добавляться /% year% /% monthnum% /% day% / struct tags в постоянные константы пользовательских сообщений? Структура Redux как-то добавлена ​​на мой сайт, не может найти в плагинах Добавить javascript в окно сведений о мультимедиа? Использовать AJAX для получения опции из базы данных и использовать ее в настройках jquery или есть альтернатива для рассмотрения? Как хранить или кэшировать пользовательские данные корзины покупок для сеанса каждого пользователя Почему страница пользовательского таксономического архива перенаправляет меня на один пост? как удалить репликацию тега внутри цикла? Проблема с миграцией – домашняя страница блога пуста

Как упорядочить результаты 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