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'])代码>。我猜这将是最有效/最优的算法。