サポート » 使い方全般 » ランダムに記事を返す関数を作りたい

  • 解決済 sar_rai

    (@sar_rai)


    全ての記事の中からランダムで1件の記事(のデータ)を返す関数を作り、その返り値をjavascriptで受け取りたいと考えています。

    このフォーラムを参考に下記のコードをfunction.phpに書き加え実行してみましたが、何度実行しても最新の1件の記事しか返してもらえません。
    $numpostsを10などにしても最新の記事1件が10個並ぶだけです。
    header.phpの<head>~</head>部分に直接書き込んでも、functionを外してjavascript内に埋め込んでも同様です。

    functionを外して<body>~</body>内に書きこむと期待通りの動作をしますが、それではjavascriptの方でデータが受け取れません。

    何か解決法があればご教授願えませんでしょうか。

    function get_random_post() {
    global $wpdb;
    $numposts = 1;
    $rand_posts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY RAND() LIMIT $numposts");
    foreach($rand_posts as $post) {
    setup_postdata($post);
    the_title();
    }
    }
6件の返信を表示中 - 1 - 6件目 (全6件中)
  • モデレーター jim912

    (@jim912)

    sar_raiさん、こんにちは。

    global 宣言に $post が必要になります。

    トピック投稿者 sar_rai

    (@sar_rai)

    動作しました。ありがとうございます!

    しかし、この関数はページ内のボタンを押すたびに実行したいのですが、ページを再読込しないとランダムの結果が変わらないという問題が出てきてしまいました。

    $numpostsの数を増やして、
    $post = $rand_posts[rand(0,9)];
    などともしてみましたが、randで生成される数もやはり変わらないようです。
    ページを再読込せずに乱数を得る方法はありませんでしょうか?

    完全にあてずっぽうですが・・・

    乱数のシード値をPHPのmicrotimeなどで毎回与えてはどうでしょう?

    そういう問題ではないのかな・・・

    あ、なんかわかったような気がする。

    >ページ内のボタンを押すたびに実行

    これなんですが、やりたいのはページをロード後(初回はランダムで表示しておいて)、ボタン(トリガーとなる部分)をクリックしたら表示している記事の部分だけをぐるぐる違う記事に変えて行きたい、ということじゃないかな。

    もしかしたらご存知かもしれませんが、phpはページがロード中に評価されるので、ページロードが完全に終了してから実行されるJavaScriptと違って「次の動作」をすることが出来ません。だから、上のコードの中で
    $numposts = 1;
    となっている部分を、ページで表示したい数、例えば10個とかにしておき(既に試されていますね)、取得したデータをあらかじめJavaScriptに渡しておいて、JavaScript内で適宜切り替える…という方法なら可能かと。

    ボタンをクリックしてページをリロードしない限り、phpのコードは走らない…ということが原因なんじゃないかな。

    的外れだったらごめんなさい。

    それと余談ですが、ランダムなポストを取得するには
    $rand_posts = get_posts('posts_per_page=5&orderby=rand');
    とget_posts()を使った方がスマートかと思います(好みですが…)。

    モデレーター jim912

    (@jim912)

    あとは、ajaxで読み込むとかですね。

    トピック投稿者 sar_rai

    (@sar_rai)

    返信大変遅れて申し訳ありません。
    >V.J.Catkickさんの書いているように、予め多くの記事を取得しておいてそれをjavascriptで処理させることで解決しました。
    ありがとうございます。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「ランダムに記事を返す関数を作りたい」には新たに返信することはできません。