web-dev-qa-db-fra.com

Afficher un auteur aléatoire avec des détails dans la barre latérale

PHP débutant ici, a récemment décidé de tenter de concocter une petite fonctionnalité bizarre "Spotlight Author Spotlight" dans mon thème WordPress actuel. J'ai presque terminé, mais j'ai un problème: je dois le faire de sorte que mon "projecteur" ne sélectionne que les utilisateurs ayant un message ou plus.

Tout le monde qui s'inscrit sur mon blog devient immédiatement un abonné et est capable de poster des nouvelles directement sur la page d'accueil, mais la plupart se contentent d'être juste des membres réguliers et post-moins.

Je ne pourrai incorporer le "projecteur" dans mon thème que si je parviens à le faire sélectionner de manière aléatoire un utilisateur ayant soumis un message ou plus.

Voici le code jusqu'à présent:

<section id="sidebarAuthorSpotlight">
    <?php $users = get_users(); $id = array_Rand( $users, 1 ); $user = $users[$id]; ?>
    Hey, have you met...
    <h3><a class="" href="<?php echo the_permalink(); ?>"><?php echo $user->display_name; ?></a></h3>
    <div><?php echo get_avatar( $user->ID, '60' ); ?></div>
    Mods: <?php echo count_user_posts($user->ID); ?>
    <?php echo $register_date = date("F d, Y", strtotime(get_the_author_meta('user_registered'))); ?>
    <div class="clear"></div>
    <ol class="sidebarPosts">
        <?php $random_author_box = new WP_Query(array('author' => $user->ID,'posts_per_page' => '5')); if ($random_author_box->have_posts() ) : while ($random_author_box->have_posts() ) : $random_author_box->the_post(); ?>
            <li>
                <a class="sidebarPostTitle" href="<?php echo the_permalink(); ?>"><?php echo the_title(); ?></a>
            </li>
        <?php endwhile; endif; ?>
    </ol>
    <div class="clear"></div>
</section>

Idéalement, j'aimerais aussi pouvoir ajuster la date d'enregistrement à un "X enregistré il y a Y jours", mais je suis heureux de traverser ce pont plus tard. Pour le moment, j'ai désespérément besoin d'obtenir le code ci-dessus pour filtrer les utilisateurs avec 0 message et uniquement en extraire les utilisateurs - ou plutôt a utilisateur - avec 1 ou plusieurs messages.

Si quelqu'un pouvait m'aider, je vous en serais éternellement reconnaissant. En tant que personne qui commence tout juste à apprendre les bases de PHP, je peux honnêtement dire que je suis dépassée par la tête à ce stade. Je suis impatient de vous entendre et je vous remercie tous d'avoir lu et examiné ma situation critique. Malheur à moi!

Edit: Je suis si bête! Je devrais probablement expliquer ce que le code ci-dessus fait fait: le code ci-dessus affiche effectivement un utilisateur aléatoire et lui fournit une zone "Spotlight" dans la barre latérale, mais il tirera les utilisateurs même avec un nombre de publications égal à 0. Comme expliqué précédemment: s'il ne tirait que sur les utilisateurs ayant un compte de 1 ou plus, le résultat serait presque sans faille.

6
Steve

Votre meilleure option est d’obtenir un auteur de publication aléatoire qui est un ID utilisateur. Voici donc une fonction permettant de le faire:

function get_random_author_wpa91320(){
    global $wpdb;
    $id = $wpdb->get_var("
        SELECT post_author
        FROM $wpdb->posts
        WHERE post_type = 'post'
        AND post_status = 'publish'
        ORDER BY Rand()
        LIMIT 1
        ");
    return $id;
}

Et une fois que vous avez cette fonction dans le fichier functions.php de votre thème, vous pouvez remplacer cette ligne:

<?php $users = get_users(); $id = array_Rand( $users, 1 ); $user = $users[$id]; ?>

avec

<?php $user = get_user_by('id', get_random_author_wpa91320() ); ?>

Mettre à jour

voici une version modifiée pour obtenir tous les utilisateurs de la base de données qui ont au moins une publication et qui utilisent PHP Rand pour renvoyer un identifiant aléatoire.

function get_random_author_wpa91320_2(){
    global $wpdb;
    //this will get all users with posts
    $ids = $wpdb->get_col("
        SELECT DISTINCT post_author
        FROM $wpdb->posts
        WHERE post_type = 'post'
        AND post_status = 'publish'
        "
    );
    return $ids[Rand(0,count($ids) -1)];
}

Cette méthode revient à compter chaque utilisateur une fois et non en fonction du numéro de message qu’il a.

6
Bainternet