隨機展示一篇文章/隨便看看-限定作者和發佈時間

最近在測試wordpress的時候偶然發現了一個「隨便看看」的功能,通過建立一個頁面模板的方式實現(傳送),實現起來挺簡單。後來又發現了另外一種方式,直接在主題functions.php里添加代碼(傳送),也很方便就可以完成。

可是這個時候就在想,怎麼樣讓顯示的文章只屬於某幾個分類,而且發佈的時間不能超過一定的範圍。先去找有沒有現成的,中文網站和英文網站用各種關鍵詞搜索了一圈,沒有……不僅沒有代碼連插件都沒有,在發佈/轉發該功能代碼的博文中也留了言,不過也不一定能收到回復吧。看來得自己動手了,需要在where語句里增加兩個條件,一個是分類,一個是發佈時間。由於php已經幾乎忘光了,SQL的那幾句話當初就糊裡糊塗的,所以折騰了好幾個小時,失敗中有了一點點的成功。要感謝很多博文和帖子,在其中找到了有用的信息。

首先想實現限制分類的功能,嘗試過很多博文里提供的信息、群裏面問其他人(沈大佬表示他/她明天開發個插件),沒搞定。後來和「榆木」大佬小窗,首先教我怎麼「打印」:print_r($query);exit(); 加到query定義後面。網頁執行出來的語句結果輸入到SQL執行,然後通過提示信息找問題。後來才想起來以前好像是學過print哦……下次就不會傻傻地輸入CTRL+P還想着打印預覽能看到什麼了……

操作了一會兒數據庫,沒有找到分類的字段,以前wordpress可能是分類有單獨的表,現在好像是term_id再通過一些聯繫進行的。雖然分類的限制沒搞定,但是對作者的限制倒是簡單,posts表裡直接就有這個字段,加入 AND post_author = 『2』 試了試,可以,至少驗證了加到where的方式是對的。

後來嘗試了很多次限制分類的條件,轉而去看限制時間能不能先實現。posts表裡就有post_date這個字段,於是嘗試寫到代碼的where里去,然而,文法錯誤的情況下自然執行不出正確的結果。這時候我想,找一下實現其他功能時限制發佈時間的代碼(wordpress發佈多少天的過濾條件代碼),開始也失敗,不過找到了一個「wordpress獲取一定天數內發表的文章代碼」,非常接近,於是就把where裏面的部分copy了進來,限制文章發佈時間的代碼終於也生效。

// 隨便看看開始-限定作者和發佈時間
function random_postlite() {
global $wpdb;
$query = "SELECT ID FROM $wpdb->posts WHERE post_type = 'post' AND post_password = '' AND post_author in (作者id) AND post_date > '" . date('Y-m-d', strtotime('-天數 days')) . "' AND post_status = 'publish' ORDER BY RAND() LIMIT 1";
if ( isset( $_GET['random_cat_id'] ) ) {
$random_cat_id = (int) $_GET['random_cat_id'];
$query = "SELECT DISTINCT ID FROM $wpdb->posts AS p INNER JOIN $wpdb->term_relationships AS tr ON (p.ID = tr.object_id AND tr.term_taxonomy_id = $random_cat_id) INNER JOIN $wpdb->term_taxonomy AS tt ON(tr.term_taxonomy_id = tt.term_taxonomy_id AND taxonomy = 'category') WHERE post_type = 'post' AND post_password = '' AND post_author in (2,5,6) AND post_date > '" . date('Y-m-d', strtotime('-100 days')) . "' AND post_status = 'publish' ORDER BY RAND() LIMIT 1";
}
if ( isset( $_GET['random_post_type'] ) ) {
$post_type = preg_replace( '|[^a-z]|i', '', $_GET['random_post_type'] );
$query = "SELECT ID FROM $wpdb->posts WHERE post_type = '$post_type' AND post_password = '' AND post_author in (2,5,6) AND post_date > '" . date('Y-m-d', strtotime('-100 days')) . "' AND post_status = 'publish' ORDER BY RAND() LIMIT 1";
}
$random_id = $wpdb->get_var( $query );
wp_redirect( get_permalink( $random_id ) );
exit;
}
if ( isset( $_GET['random'] ) )
add_action( 'template_redirect', 'random_postlite' );
// 隨便看看結束

以上為修改之後的代碼(主題functions.php),點擊導航欄「Cat. 勿聽」即可隨機展示一篇文章。

限制分類的條件有朋友比較熟悉的話歡迎留言告知。

附一些參考過程中比較有用的博文:

如何讓WordPress一個頁面顯示全部(幾個)分類的文章
WordPress數據庫中的表、字段、類型及說明 (現在的wp已經有不同)
WordPress 中分類、標籤在數據庫中是如何和文章關聯的?
給 wordpress Category (分類)添加字段
WordPress為分類添加自定義字段
wordpress 給分類目錄加自定義字段
WordPress 限定用戶更新或刪除文章的時間期限

作者: 椰林物語

博士,摩托車手。發佈內容為:生活、站點、其他。

《隨機展示一篇文章/隨便看看-限定作者和發佈時間》有8個想法

  1. 加個in_category即可。
    例子: https://zmingcx.com/wordpress-only-allows-viewing-of-specific-posts.html
    比如你這個,在第一個query處,簡單的在isset後面,比如限定為旅遊,則加上 && if ( in_category( ‘travel’ ))
    為防止取不到對應cat的id,後面再加上一段else 再來一次rand取到合適的隨機id

    另外還有種笨思路,在第二個query里sql加上判斷 where category = xxx 也行。

    ps 頁面不讓拷貝代碼真是要差評!!!

    1. 滿懷激動的試了試,不行……
      AND in_category( array( 1,2 ) ) / AND in_category( 1,2 ) / AND in_category = ‘1’ / AND category = ‘1’ 都試了
      我現在正在把內容重新遷移到新搭建的wp里。最近發現響應時間總是很長,用現在的代碼和新wp的數據庫/現在的代碼和新wp數據庫加上把文章內容導入後/現在的數據庫和新wp代碼……還有包括把數據庫用插件清理,大概嘗試了五六種組合,發現插件即便多,新數據庫導入站點內容後響應時間也挺快……所以想着重新搭建一個wp,把現在應用的插件安裝上,然後把內容遷移進去看看怎麼樣。昨天隨便試一試的時候導入的內容稍微有些問題,個別文章的評論消失了……

      1. 不好意思昨天腦子不好,忽略了一段重要的代碼。
        $query那段sql取到了ID後,應該:
        $cat = get_the_category( 取到的文章ID )
        再把cat數組loop到 in_category 去遍歷……

        1. $cat = get_the_category( 取到的文章ID )的這個方式我其實最開始試過……也許是哪裡沒寫對……回頭再試一下。

回復 FDship 取消回復

您的郵箱地址不會被公開。 必填項已用 * 標註