web-dev-qa-db-fra.com

comment lister au hasard 5 auteurs avec au moins 3 posts publiés

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!

1
user10331

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
}

Référence

2
Pat J

Requête de base

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 );

Résultats aléatoires

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

À l'exclusion

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

Le plugin

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.

Résultats de la mise en cache

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 :)

1
kaiser

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 .

0
Dave Navarro