wordpress显示之前未显示的随机帖子

时间:2011-09-19 14:43:12

标签: php wordpress

我按照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);
}

如果您知道任何其他解决方案或如何解决此特定解决方案 我非常感谢所有的答案......如果我错过了什么,请告诉我,我会添加这些信息。

2 个答案:

答案 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吗?我不记得......
  • 将帖子存储在适当的cookie中似乎是一种可行的替代方案,并且作为额外的奖励,可以使存储在会话中保持不变。

作为插件的未经测试的实现:

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_idpost_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选择需要重写。

向您展示您需要前往的方向。