WordPress.org

Ready to get started?Download WordPress

Forums

Retrieve the url of a random post several times (10 posts)

  1. su1
    Member
    Posted 2 years ago #

    Hi,

    I'm trying to retrieve several times the url of a random published post, but I want to limit the number of Mysql queries. So my idea was to retrieve all the published posts at the beginning of the script and then pick a random post ID from this when I need it. I tried:

    $request = "SELECT ID, post_title, post_excerpt FROM $wpdb->posts WHERE post_status = 'publish' ";
    $request .= "AND post_date_gmt < '$now' ORDER BY RAND()";
    $posts = $wpdb->get_results($request);

    and the end of my script would be something like

    $url = get_permalink($post_id);

    but I don't know how to get the random post ID $post_id from the data I've retrieved. Can someone help me?

    Thanks.

  2. esmi
    Forum Moderator
    Posted 2 years ago #

    Why not use WP_Query to grab x posts with 'orderby' = 'rand'.
    http://codex.wordpress.org/Function_Reference/WP_Query#Order_.26_Orderby_Parameters

  3. su1
    Member
    Posted 2 years ago #

    Thanks for your help.

    I'm fine with that but how do I get a specific url from the x random posts I've grabbed? So the beginning of my code would be:

    $count_posts = wp_count_posts();
    $query = new WP_Query( array ( 'orderby' => 'rand', 'posts_per_page' => $count_posts ) );

    then how do i get a random url from $query (or the id of the post)?

  4. esmi
    Forum Moderator
    Posted 2 years ago #

    You're over-thinking it. Let WP_Query do all of the work. Try something like:

    <?php
    $args = array(
    	 'orderby' => 'rand',
    	 'posts_per_page' => 1
    );
    $rand_posts = new WP_Query( $args );
    while ( $rand_posts->have_posts() ) : $rand_posts->the_post();?>
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    <?php endwhile;
    wp_reset_postdata();
    ?>
  5. su1
    Member
    Posted 2 years ago #

    I have two concerns with your solution:

    - I don't need to display anything at all. My plugin is using the urls for something completely different than creating links for example. The structure would be something like:

    instructions 1
    for () {
    // get the url of a random post
    // use that url
    }
    instructions 2

    - Knowing the above structure, if I use your solution, I will make a query at every step in my loop. As it will be a very long loop (thousands of steps), I wanted to put the query out of the loop (in instructions 1).

    So if you think the best way is still to keep the query into the for loop, I'll do that and use:

    <?php
    $args = array(
    	 'orderby' => 'rand',
    	 'posts_per_page' => 1
    );
    $rand_posts = new WP_Query( $args );
    while ( $rand_posts->have_posts() ) {
        $rand_posts->the_post();
        $url = the_permalink();
    }
    wp_reset_postdata();
    ?>

    but maybe it would be best to grab x posts before the loop and then grab 1 random permalink at a time from these posts inside the loop? In this case I still don't know how to do that.

  6. esmi
    Forum Moderator
    Posted 2 years ago #

    If you want to use $count_posts = wp_count_posts(), then you'll need to set posts_per_page to $count_posts->publish. Or just set posts_per_page to -1 which will grab all of your published Posts. You'll get an object returned which you can use like any other array - dipping into it as needed.

  7. su1
    Member
    Posted 2 years ago #

    OK thanks! But I'm just not clear how to "use it like any other array".

    When I have my $query

    $query = new WP_Query( array ( 'orderby' => 'rand', 'posts_per_page' => $count_posts ) );

    how do I grab a random permalink from there? All I know is manipulate the whole content of the array with a loop, but I don't know how to select a single row. We're almost there...

    [No bumping. If it's that urgent, consider hiring someone.]

  8. esmi
    Forum Moderator
    Posted 2 years ago #

    The post are already random, so you could just look at $rand_posts[0]. Try adding :

    echo '<pre>';
    print_r($rand_posts);
    echo '</pre>';

    to see what you are being returned.

  9. su1
    Member
    Posted 2 years ago #

    I see nothing when I add this (just after $query, right?).

    I also tried to use $query as an array but I got the message:

    "Cannot use object of type WP_Query as array"

  10. esmi
    Forum Moderator
    Posted 2 years ago #

    I see nothing when I add this (just after $query, right?).

    Add it right after $rand_posts = new WP_Query( $args );. That works for me.

Topic Closed

This topic has been closed to new replies.

About this Topic