这不能与$_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选择需要重写。
只是为了向你展示你需要去的方向。
问题是什么?代码是否按预期工作,或者您是否想知道是否有不同/更好/更常见的解决方案? –
是的,它不能正常工作,能够一次又一次地看到相同的帖子 – Breezer
你是否正确使用'session_start();'开始你的会话? - http://php.net/manual/en/function.session-start.php – polarblau