как случайным образом перечислить 5 авторов с не менее чем 3 опубликованными сообщениями

Немного новичок здесь …

Как говорится в заголовке, я пытаюсь создать список из 5 случайных пользователей (взятых у авторов, редакторов и администраторов), которые опубликовали по крайней мере по 3 сообщения в каждом. (Кроме того, я хотел бы исключить автора, чей идентификатор пользователя равен 4.)

Я думаю, мне удалось все это сделать (взломать различные решения, с благодарностью взятые из полезных предыдущих сообщений здесь, в wordpress.stackexchange!), Но я не уверен, что это лучшее решение или если оно правильно закодировано. Я использую эту функцию на многих страницах на своем веб-сайте, и я беспокоюсь, что это может быть слишком интенсивным.

<?php global $wpdb; $min_posts = 3; $user_ids = $wpdb->get_col(" SELECT `post_author` FROM (SELECT `post_author`, COUNT(*) AS `count` FROM {$wpdb->posts} WHERE `post_status`='publish' GROUP BY `post_author`) AS `stats` WHERE `count` >= {$min_posts} AND post_author !=4;"); shuffle($user_ids); for($someNumber = 1; $someNumber <= 5; $someNumber++) { $user = get_userdata($user_ids[$someNumber]); ?> <?php echo get_avatar( $user->ID, '60' );?> <h7><a href="<?php echo get_author_posts_url( $user->ID ); ?>"> <?php echo $user->display_name ;?></a></h7> <hr> <?php } unset($user_ids); ?> 

Любая помощь по-настоящему ценится, большое спасибо!

Solutions Collecting From Web of "как случайным образом перечислить 5 авторов с не менее чем 3 опубликованными сообщениями"

Вы можете использовать count_many_users_posts() .

 $args = array( 'exclude' => array( 4, ), 'fields' => 'ID', ); $users = get_users( $args ); $user_posts = count_many_users_posts( $users ); foreach( $user_posts as $user => $posts ) { if( $posts < 3 ) { unset( $user_posts[$user] ); } } $user_ids = array_keys( $user_posts ); shuffle( $user_ids ); for( $i = 0; $i <=4; $i++ ) { $user = get_userdata( $user_ids[$i] ); // display your user info here } 

Справка

  • count_many_users_posts()
  • get_users()
  • array_keys()

Основной запрос

Следующий запрос даст вам пять пользователей с наибольшим количеством сообщений на сайте. Использование HAVING и COUNT будет намного быстрее, чем другие запросы. Особенно быстрее, чем встроенные многопроцессорные WP-запросы.

 global $wpdb; $postCountSQL = <<<SQL SELECT post_author, COUNT( * ) AS count FROM {$wpdb->posts} GROUP BY post_author HAVING COUNT( * ) > 3 ORDER BY count DESC LIMIT 0 , 5 SQL; $postCount = $wpdb->get_results( $postCountSQL ); 

Случайные результаты

Теперь, когда вы хотите, чтобы они были случайными. На самом деле это довольно просто, используя функцию MySQL RAND() :

 SELECT post_author, COUNT( * ) AS count FROM {$wpdb->posts} GROUP BY post_author HAVING COUNT( * ) > 3 ORDER BY RAND() DESC LIMIT 0 , 5 

Без учета

Чтобы исключить конкретного пользователя по идентификатору, мы можем использовать инструкцию NOT :

 SELECT post_author, COUNT( * ) AS count FROM {$wpdb->posts} GROUP BY post_author HAVING COUNT( * ) > 3 AND NOT post_author = {$id} ORDER BY RAND( ) DESC LIMIT 0 , 5 

Плагин

Чтобы вызвать это в небольшом mu-plugin (поэтому он доступен по умолчанию для каждого сайта):

 <?php /** * Plugin Name: (#115930) Random User Post Count * Plugin URI: http://wordpress.stackexchange.com/questions/115930/how-to-randomly-list-5-authors-with-at-least-3-published-posts * Description: Lists five random users and their posts count. Can exclude users by ID. * Author: Franz Josef Kaiser <wecodemore@gmail.com> * Author URI: http://unserkaiser.com */ defined( 'ABSPATH' ) OR exit; function wpse115930UserPostCountRand( $minCount = 3, $userIDs = array(), $limit = 5 ) { ! is_array( $userIDs ) AND $userIDs = array( $userIDs ); global $wpdb; $sql = <<<SQL SELECT post_author, COUNT( * ) AS count FROM {$wpdb->posts} GROUP BY post_author HAVING COUNT( * ) > %d %s ORDER BY RAND( ) DESC LIMIT 0 , %d SQL; $exclude = ""; ! empty( $userIDs ) AND $exclude = $wpdb->prepare( " AND NOT post_author IN ( %s ) ", join( ",", $userIDs ) ); return $wpdb->get_results( $wpdb->prepare( $sql, $minCount, $exclude, $limit ) ); } 

Теперь вы можете просто вызвать wpse115930UserPostCountRand( 3, array( 4 ), 5 ); в любом месте ваших шаблонов, чтобы получить пользователей, которые имеют минимум 5 сообщений, не имеют идентификатора 4 и ограничивают результат до 3 пользователей. Как вы можете видеть, вторым аргументом является массив, поэтому расширение результатов, чтобы исключить больше пользователей, легко. То же самое касается разных пользователей или минимальных сообщений.

Результаты кэширования

Как уже упоминалось, вы можете использовать API Transients. Другой и, возможно, даже лучший вариант – использовать WP Object Cache в вышеописанном плагине. В случае использования какого-либо постоянного кеша, такого как OpCode или MEMcache, он также будет кэшировать его на диск.

Повеселись 🙂

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

На самом деле все, что я делаю, если мне не нужны данные «в реальном времени», я использую переходные процессы для кэширования вызовов XML, JSON и базы данных. Проверьте API переходного процесса .