Php 如何使用此代码防止随机帖子/条目出现两次?

Php 如何使用此代码防止随机帖子/条目出现两次?,php,wordpress,Php,Wordpress,我使用这个函数重定向到一个随机帖子。我试图找到一种机制来防止相同的随机帖子连续出现两次。有人能给个提示吗 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; } /

我使用这个函数重定向到一个随机帖子。我试图找到一种机制来防止相同的随机帖子连续出现两次。有人能给个提示吗

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并将它们放入数组。我随机化数组以获得一个值。但不确定如何防止触发相同的值。

将以前的结果存储在会话中,并确保不再拾取该结果:

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;
}
使用。将最后使用的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;

}

这将使一篇文章只显示一次——我认为OP只想确保没有一篇文章连续显示两次。我为我造成的混乱感到抱歉。我的意思是,当用户请求一篇随机文章时,一篇文章不能连续显示两次。@nickb您是对的。请参见上面的编辑-我更喜欢这个方法,因为它不会构建完整的数组并强制ID选择,而只是从可能的选择中省略最后一个ID。它可能可以忽略不计,但我确实喜欢这两种方法,因此它当然会得到+1。但是,您也可以使用
$array[$p-ID]=$p->ID
并去掉循环内部的
if()
,在循环外部执行一个简单的
unset($array[$\u SESSION['last\u post'])。我猜这将是最有效/最优的算法。