Un peu novice ici ...
Comme le titre l'indique, j'essaie de générer une liste de 5 utilisateurs aléatoires (issus d'auteurs, d'éditeurs et d'administrateurs) ayant publié au moins 3 publications chacune. (Aussi, je voudrais exclure l'auteur dont l'ID utilisateur est 4.)
Je pense avoir réussi à faire tout cela (pirater ensemble diverses solutions avec beaucoup de reconnaissance tirées de précédents posts utiles ici dans wordpress.stackexchange!), Mais je ne suis pas sûr que ce soit la meilleure solution ou si elle est codée correctement. J'utilise cette fonctionnalité sur de nombreuses pages de mon site Web et je crains que la requête ne soit trop intensive.
<?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);
?>
Toute aide vraiment appréciée, merci beaucoup!
Vous pouvez utiliser 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
}
La requête suivante vous donnera les cinq utilisateurs avec le plus de publications sur un site. L'utilisation de HAVING
et COUNT
sera beaucoup plus rapide que les autres requêtes. Particulièrement plus rapide que les requêtes multifonctions WP intégrées.
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 );
Maintenant que vous voulez les avoir au hasard. C'est en fait assez simple d'utiliser la fonction 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
Pour exclure un utilisateur spécifique par ID, nous pouvons utiliser l'instruction 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
Pour invoquer cela dans un petit plug-in mu (il est donc disponible par défaut sur chaque site):
<?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 <[email protected]>
* 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 ) );
}
Vous pouvez désormais appeler simplement wpse115930UserPostCountRand( 3, array( 4 ), 5 );
n'importe où dans vos modèles pour que les utilisateurs qui ont au moins 5 messages n'aient pas l'ID de 4
et limitent le résultat à 3
utilisateurs. Comme vous pouvez le constater, le second argument est un tableau. Il est donc facile de développer les résultats pour exclure plus d'utilisateurs. La même chose vaut pour un nombre différent d'utilisateurs ou un minimum de publications.
Comme déjà mentionné, vous pouvez utiliser l'API Transients. Une autre option, peut-être même meilleure, serait d'utiliser le cache d'objets WP dans le plugin ci-dessus. Dans le cas où une sorte de cache persistant tel que OpCode ou MEMcache est impliqué, il le mettra également en cache sur le disque.
S'amuser :)
J'utilise cette fonctionnalité sur de nombreuses pages de mon site Web et je crains que la requête ne soit trop intensive.
Sur à peu près tout ce que je fais, si je n'ai pas besoin de données "en temps réel", j'utilise des transitoires pour mettre en cache mes appels XML, JSON et de base de données. Découvrez l'API transitoire .