我按照WordPress的纪录片创建了这个非常简单的功能,据我所知,这段代码应该可以正常工作
query_posts(array('orderby' => 'rand', 'post__not_in' => $_SESSION['watched'], 'showposts' => 1));
并且会话的代码不再高于此
if(!in_array($post->ID, $_SESSION['watched'])){
array_push($_SESSION['watched'],$post->ID);
}
如果您知道任何其他解决方案或如何解决此特定解决方案 我非常感谢所有的答案......如果我错过了什么,请告诉我,我会添加这些信息。
答案 0 :(得分:2)
This topic on wordpress.org似乎与您的问题相关 - post__not_in
显然存在一些相当奇怪的问题。
试试这个:
function removeSeenPosts ($where) {
global $wpdb;
if (count($_SESSION['watched']) > 0) {
$where .= ' AND ' . $wpdb->posts . '.ID NOT IN(' . implode (',', $_SESSION['watched']) . ') ';
}
return $where;
}
add_filter('posts_where', 'removeSeenPosts');
query_posts(array('orderby' => 'rand', 'showposts' => 1));
remove_filter('posts_where', 'removeSeenPosts');
如果这没有帮助(我实际上怀疑),问题显然与会话中的帖子ID存储有关。
我想到了两件事:
$_SESSION
吗?我不记得...... 作为插件的未经测试的实现:
function setViewedPostCookies() {
if (is_single())
{
global $wp_query;
if (!isset($_COOKIE['watched']))
{
$excluded_posts = array();
}
else
{
$excluded_posts = implode(',', $_COOKIE['watched']);
}
$excluded_posts[] = $wp_query->post->ID;
$excluded_posts = array_unique($excluded_posts);
setcookie('watched', explode(',', $excluded_posts), time() + 3600000, '/');
}
}
add_action( 'get_header', 'setViewedPostCookies' );
答案 1 :(得分:1)
这不适用于$_SESSION['watched']
数组,因为$_SESSION
变量没有链接到MySQL表,结果格式化查询不知道应该返回多少帖子。
我只看到一个正确解决此任务的解决方案:
您需要在数据库中再创建一个可以存储session_id
和post_id
变量的表。例如,我们将此表命名为wp_watched
。
例如我们表的结构将是:
CREATE TABLE wp_watched (
`watched_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`watched_SID` varchar(255) DEFAULT NULL,
`watched_POST_ID` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`watched_ID`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
数据将存储在我们的表格中:
`watched_ID` | `watched_SID` | `watched_POST_ID`
---------------------------------------------------------------------------------
1 | 098f6bcd4621d373cade4e832627b4f6 | 345
2 | 88578edf8458ce06fbc5bb76a58c5ca4 | 123
3 | 1a36591bceec49c832079e270d7e8b73 | 5
4 | 2b1d3a6249c2d223c620393fa6420868 | 98
5 | 793560d7e4ef27db84dfe776fed9cea5 | 12
...
然后使用custom queries:
,您需要使用此类代码重写您的会话代码$watchedrows = $wpdb->get_row("SELECT watched_ID FROM wp_watched WHERE watched_SID = " . session_id() . " AND watched_POST_ID = " . $post->ID);
if(!$watchedrows->watched_ID) {
$wpdb->insert('wp_watched', array('watched_SID' => session_id(), 'watched_POST_ID' => $post->ID), array('%s', '%d'));
}
然后,您需要创建自己的custom query以根据wp_posts
表和wp_watched
表之间的关联获取帖子:
$querystr = "
SELECT
$wpdb->posts.*
FROM
$wpdb->posts,
wp_watched
WHERE
$wpdb->posts.post_status = 'publish'
AND $wpdb->posts.post_type = 'post'
AND $wpdb->posts.post_date < NOW()
AND wp_watched.watched_SID = " . session_id() . "
AND $wpdb->posts.ID != wp_watched.watched_POST_ID
ORDER BY RAND()
LIMIT 1";
$randompost = $wpdb->get_row($querystr, OBJECT);
如果一切正常,变量$randompost
将包含您的随机帖子。
不确定我提供的代码是否有效,我没有测试它。也许有些SQL选择需要重写。
向您展示您需要前往的方向。