web-dev-qa-db-ja.com

サイドバーに詳細付きのランダム投稿者を表示する

ここPHP初心者は、最近、私の現在のWordPressテーマに、ちょっと変わった「ランダム作者スポットライト」機能をまとめることに固執することに決めました。私はほとんどやっています、しかし私はちょっとした問題にぶつかりました:私の「スポットライト」が1ポスト以上のユーザーだけを選ぶようにどうにかする必要があります。

私のブログに登録した人はだれでもすぐに購読者になり、フロントページに直接ニュースを投稿することができますが、ほとんどは正規のポストレス会員であるだけのコンテンツです。

1つ以上の投稿を送信したユーザーをランダムに選択できるようにすることができるのであれば、「スポットライト」をテーマに組み込むことしかできません。

これまでのコードはこれです:

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

理想的には、登録日を「Y日前に登録されたX」に微調整できるようにしたいのですが、後でこの橋を渡ることができて嬉しいです。現時点では、私は0の投稿を持つユーザーを除外し、ユーザーを引っ張るためだけに上記のコードを取得する必要があります - またはむしろaユーザー - 1件以上の投稿。

誰かが手助けできれば、私は永遠に感謝するでしょう。たった今PHPの基本を学び始めている誰かとして、私はこの時点で私は私の頭の上にいると正直に言うことができます。皆さんからのお便りを楽しみにしていて、私の窮状を読んで調べてくれてありがとう。私は悲惨です!

編集:私はとてもばかげている!私はおそらく上記のコードが何をするのかを説明するべきです:上記のコードは確かにランダムなユーザーを表示し、サイドバーに 'スポットライト'領域を提供します。ただし、投稿数が0でもユーザー数は増えます。前に説明したように、投稿数が1以上のユーザーのみを抽出した場合は、ほとんど問題ありません。

6
Steve

あなたの最善の選択肢は、ユーザーIDであるランダムな投稿者を取得することです。

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

そして、あなたがあなたのテーマのfunctions.phpファイルにその関数を持っていたら、あなたはこの行を置き換えることができます:

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

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

更新

これはデータベースから少なくとも投稿時に持っているすべてのユーザーを取得し、ランダムなIDを返すためにPHP Randを使うように修正したバージョンです

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

この方法は、すべてのユーザーを1回だけカウントし、そのユーザーの投稿番号に基づいていないようなものです。

6
Bainternet