2

我正在使用此功能重定向到随机帖子。我试图找到一种机制来防止相同的随机帖子连续出现两次。谁能给个提示?

function sofa_view_random_post() {

    // make array of all posts IDs
    $q = get_posts('numberposts=-1');
    $array = array();
    foreach($q as $p) {
        $array[] = $p->ID;
    }

    // randomize array to get random post
    $k = array_rand($array);
    $v = $array[$k];
    wp_redirect( get_permalink( $v ) ); exit;

}

我首先获取所有帖子 ID 并将它们放入数组中。我随机化数组以获得一个值。但不确定如何防止触发相同的值。

4

2 回答 2

1

将先前的结果存储在会话中,并确保您不再选择该结果:

if( !isset( $_SESSION['last_random_post'])) {
    $_SESSION['last_random_post'] = -1;
}

do {
    $k = array_rand( $array);
} while( $k == $_SESSION['last_random_post']);

$_SESSION['last_random_post'] = $k;

我不确定这如何特别适用于 wordpress,但它应该很容易适应:

为了完整起见,这里是包含上述代码的函数:

function sofa_view_random_post() {

    if( !isset( $_SESSION['last_random_post'])) {
        $_SESSION['last_random_post'] = -1; // Or null, as long as its an invalid ID
    }

    // make array of all posts IDs
    $q = get_posts('numberposts=-1');
    $array = array();
    foreach($q as $p) {
        $array[] = $p->ID;
    }

    // randomize array to get random post
    do {
        $k = array_rand( $array);
    } while( $k == $_SESSION['last_random_post']);

    $_SESSION['last_random_post'] = $k;

    $v = $array[$k];
    wp_redirect( get_permalink( $v ) ); exit;
}
于 2012-06-27T19:11:11.327 回答
1

使用会话。将上次使用的 ID 存储在会话数据中,并在构建可能的帖子列表时,从列表中省略该帖子。

像这样:

function sofa_view_random_post() {

    // Initialise last post value as NULL if missing    
    if (!isset($_SESSION['last_post'])) {
        $_SESSION['last_post'] = NULL;
    }

    // Make array of all posts IDs except last viewed
    $q = get_posts('numberposts=-1');
    $array = array();
    foreach ($q as $p) {
        if ($p->ID !== $_SESSION['last_post']) {
            // Only add this ID if it's not the last viewed post
            $array[] = $p->ID;
        }
    }

    // Get random post ID and store it in the session
    $k = array_rand($array);
    $_SESSION['last_post'] = $v = $array[$k];

    // Redirect user
    wp_redirect( get_permalink( $v ) );
    exit;

}
于 2012-06-27T19:13:15.640 回答