Intereting Posts
первый отрывок штраф, последующие выдержки из выдержек сдвигаются вправо, а не отображаются вертикально Должны ли плагины WordPress придерживаться стиля панели администратора WordPress? Переадресация страниц на главную страницу Добавлен пользовательский тип сообщения и параметр просмотра не работает Слишком много виджетов Отображение имени архива Список категорий случайной таксономии Удалить верхний и нижний колонтитулы в iframe Добавление события onchange в настраиваемое раскрывающееся меню в WordPress Кажется, что у стандартного импортера WordPress отсутствуют изображения блога Как загружать скрипты / стили, специфичные для страницы как изменить количество сообщений, возвращаемых в конкретном цикле, не делая их глобальными? Попытка избежать включения wp-load.php Могу ли я применить тему WP к определенному шаблону пользовательской страницы? Стандартная проблема с кодировкой администратора

Получение списка 10 лучших пользователей и сортировка по фамилии

Я хотел бы отобразить список 10 лучших авторов на основе количества сообщений, которые у них есть, а затем отсортировать их по фамилии. Насколько мне известно, это не тривиально, поскольку последнее имя пользователя находится в метатеге пользователя.

Я добился успеха в написании кода для достижения того, что я ищу, см. Код ниже. Мне, однако, интересно, можно ли оптимизировать этот код, поэтому он использует меньше запросов db. У кого-нибудь есть предложения?

<?php /* 1. Get list of 10 users with the most posts, sorted by post count. */ ?> <?php $blogusers = get_users('exclude=1,2&order=DESC&orderby=post_count&number=10'); ?> <?php /* 2. Set up array with author ID's and user last names from the user meta table */ ?> <?php foreach($blogusers as $t){ $user_info = get_userdata($t->ID); // Sanitises connecting words in last names to enable proper sorting $lastname = $user_info->user_lastname; $patterns = array(); $patterns[0] = '/van /'; $patterns[1] = '/het /'; $patterns[2] = '/de /'; $patterns[3] = '/der /'; $patterns[4] = '/\'t /'; $replacements = array(); $replacements[0] = ''; $replacements[1] = ''; $replacements[2] = ''; $replacements[3] = ''; $replacements[4] = ''; $cleaned_lastname = preg_replace($patterns, $replacements, $lastname); // Store cleaned last name with author ID key in array $poep[$t->ID] = $cleaned_lastname; } ?> <?php /* 4. Sort array based on last name */ ?> <?php asort($poep); ?> <?php /* 5. Display tiles */ ?> <?php $count =1;?> <?php foreach ( $poep as $key => $val ) : ?> <?php $user = get_user_meta($key); ?> <a href="<?php echo get_author_posts_url($key); ?>" class="tile author_tile_link author_tile<?php if ($count % 5 == 0) { echo ' last'; } ?>"> <?php echo get_wp_user_avatar($key, 'thumbnail'); ?> <div class='tile_content'> <h2><?php echo get_the_author_meta('first_name',$key).' '.get_the_author_meta('last_name',$key); ?></h2> <span class="button">Zie alle artikelen</span> </div> </a> <?php $count++; ?> <?php endforeach; ?> 

Вы упорядочиваете пользователей внутри блока foreach. Почему бы вам не организовать их сначала, а затем пойти с петлей для отображения информации. Если вы это сделаете, вам понадобится только один запрос.

Сделайте это в этом порядке –
1. Сделайте запрос с помощью get_users . Вы можете добавить дополнительный параметр who=author . Это заставит искать только авторов. Я считаю, что ответ будет лучше. Это вернет массив объекта WP_user .
2. Используйте цикл foreach для очистки имени
3. Сортируйте массив объектов на основе их lastname . Вы можете использовать usort () для этого
4. Наконец, используйте другой foreach для отображения всего.

 $data = $wpdb->get->results("SELECT * FROM (SELECT wp_users.ID, display_name, user_login, user_nicename, count(wp_posts.ID) AS n, substring_index(display_name,' ',-1) AS lastname FROM wp_users JOIN wp_posts ON wp_posts.post_author = wp_users.ID GROUP BY wp_posts.post_author ORDER BY n DESC LIMIT 10 ) AS SortedByCount ORDER BY lastname"); 

Теперь у вас есть все в массиве $ data. Правильно сортируется по количеству сообщений, а затем правильно сортируется по имени (автоматически рассчитывается)

Вот запрос с первого взгляда

SELECT * FROM (SELECT wp_users.ID, display_name, user_login, user_nicename, count (wp_posts.ID) AS n, substring_index (display_name, '', -1) AS lastname FROM wp_users JOIN wp_posts ON wp_posts.post_author = wp_users.ID GROUP BY wp_posts.post_author ORDER BY n DESC LIMIT 10) AS SortedByCount ORDER BY lastname

Лучший