2011-09-19 100 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