2011-09-19 101 views
4

我创造了这个非常简单的功能的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); 
} 

如果您知道任何其他解决方案或如何解决所有的答案都非常赞赏这个特定的一个 ...如果我错过了一些东西只是告诉我,我会添加该信息。

+1

问题是什么?代码是否按预期工作,或者您是否想知道是否有不同/更好/更常见的解决方案? –

+0

是的,它不能正常工作,能够一次又一次地看到相同的帖子 – Breezer

+1

你是否正确使用'session_start();'开始你的会话? - http://php.net/manual/en/function.session-start.php – polarblau

回答

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'); 

如果这样做没有帮助(我其实怀疑),这个问题显然与后IDS的存储会话。

两件事情浮现在脑海中:

  • 可以$_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

这不能与$_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选择需要重写。

只是为了向你展示你需要去的方向。

+0

只是哇! :) xaxaxa:D 我认为最好的解决方案;) –

+0

坦率地说,变量“未链接”怎么样!?它正在被传入。 – vzwick

+0

......甚至没有谈到你将一大堆会话信息存储在数据库中而没有清理它的事实。 – vzwick