0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

WordPress 悄悄話留言:讓訪客勾選「只給站長看」的私密留言

網站DNS尚未生效,學習設定 hosts 對應 IP 的教學

有些訪客的留言會提到電話、訂單編號,或是比較私人的問題,不適合公開在文章下面。這時可以讓訪客在留言時勾選「悄悄話」,內容只有站長看得到,其他人只會看到一行提示文字。

先想想:真的需要悄悄話嗎?

  • 需要留下聯絡方式、詢問報價:放一個聯絡表單比較適合,內容不會出現在文章頁,也比較好整理。
  • 偶爾才有一兩則私人留言:最簡單的做法是不要核准那則留言,它就只會留在後台。但要注意,在後台用「核准並回覆」的方式回覆它,那則留言就會被核准公開。
  • 想讓訪客自己在文章下選擇要不要公開:用下面的程式碼。

程式碼

加到子主題的 functions.php,或用 Code Snippets 外掛新增:

PHP
/**
 * 1) 留言表單加上「悄悄話」勾選框(放在送出按鈕上方)
 */
add_filter( 'comment_form_submit_field', function ( $submit_field ) {
    $checkbox = '<p class="comment-form-private">'
        . '<input type="checkbox" id="ahwei-private" name="ahwei_private" value="1"> '
        . '<label for="ahwei-private">悄悄話(只有站長看得到)</label>'
        . '</p>';
    return $checkbox . $submit_field;
} );

/**
 * 2) 留言送出時,記錄這則是悄悄話
 */
add_action( 'comment_post', function ( $comment_id ) {
    if ( ! empty( $_POST['ahwei_private'] ) ) {
        add_comment_meta( $comment_id, 'ahwei_private', 1, true );
    }
} );

/**
 * 3) 判斷這則是不是悄悄話、目前的人能不能看
 */
function ahwei_is_private_comment( $comment ) {
    return $comment instanceof WP_Comment
        && (bool) get_comment_meta( $comment->comment_ID, 'ahwei_private', true );
}

function ahwei_can_read_private_comment( $comment ) {
    if ( current_user_can( 'moderate_comments' ) ) {
        return true;
    }
    $user_id = get_current_user_id();
    return $user_id > 0 && (int) $comment->user_id === $user_id;
}

/**
 * 4) 沒有權限的人,只看到提示文字(文章頁、RSS)
 */
function ahwei_hide_private_comment( $text, $comment = null ) {
    if ( ahwei_is_private_comment( $comment ) && ! ahwei_can_read_private_comment( $comment ) ) {
        return '這是一則悄悄話,只有站長看得到。';
    }
    return $text;
}
add_filter( 'get_comment_text', 'ahwei_hide_private_comment', 10, 2 );
add_filter( 'comment_text', 'ahwei_hide_private_comment', 10, 2 );

/**
 * 5) 「最新留言」這類只顯示摘要的地方也要隱藏
 */
add_filter( 'get_comment_excerpt', function ( $excerpt, $comment_id, $comment = null ) {
    return ahwei_hide_private_comment( $excerpt, $comment );
}, 10, 3 );

/**
 * 6) 站長看到的悄悄話,前面加上標示,回覆時才不會忘記
 */
add_filter( 'comment_text', function ( $text, $comment = null ) {
    if ( ahwei_is_private_comment( $comment ) && ahwei_can_read_private_comment( $comment ) ) {
        $text = '<p><strong>【悄悄話】</strong></p>' . $text;
    }
    return $text;
}, 20, 2 );

程式碼在做什麼?

  1. 用 comment_form_submit_field 在送出按鈕上方加一個勾選框,傳統主題與區塊主題的留言表單都適用。
  2. 訪客勾選後送出,comment_post 會在這則留言的自訂欄位(comment meta)記下 ahwei_private。
  3. 顯示留言內容時,先判斷是不是悄悄話、看的人有沒有權限,沒有權限就把內容換成提示文字。get_comment_text 和 comment_text 兩個過濾器都要掛,因為 WordPress 不同地方讀取留言內容的方式不一樣,有的只會經過其中一個(例如 RSS 只經過 get_comment_text)。
  4. 「最新留言」區塊如果設定顯示留言摘要,用的是 get_comment_excerpt,也要一起處理。

誰看得到悄悄話?

  • 管理員、編輯(有審核留言權限的人):看得到完整內容,前台和後台都會標示「【悄悄話】」。
  • 留言者本人:如果是登入會員留言,登入後自己看得到。
  • 其他所有人:只看到「這是一則悄悄話,只有站長看得到。」沒登入的訪客就算是留言者本人,送出後也只會看到這行字。

注意事項

  • 你的回覆是公開的:在前台或後台回覆悄悄話,回覆本身會公開顯示,不要在回覆裡引用對方的私人內容。需要私下聯絡,直接寄信給對方比較好。
  • 內容還是存在資料庫裡:這段程式碼是在「顯示」的時候把內容換掉。如果網站有其他外掛或主題功能直接讀取資料庫欄位來顯示留言,可能會繞過這段。加好之後,用無痕視窗檢查文章頁,以及網站的留言 RSS(網址後面加 /comments/feed/),確認內容真的被隱藏。
  • 快取外掛不影響:沒登入的訪客看到的本來就是隱藏後的版本,快取起來也一樣。
  • 站長收到的新留言通知信:WordPress 寄給站長的通知信仍然會有完整內容,這是正常的。

舊版寫法的安全問題

這篇文章舊版的做法,是讓訪客在留言裡用簡碼把私密內容包起來,並加上一行讓留言內容也能執行簡碼的設定:

PHP
add_filter( 'comment_text', 'do_shortcode' );

請不要這樣做。這行會讓所有訪客都能在留言裡執行網站上任何一個簡碼,而很多外掛的簡碼可以顯示表單、會員限定內容,甚至讀取網站資料,等於把後台才能用的功能開放給陌生人。另外,舊程式碼裡用到一個沒有定義的變數,在 PHP 8 會一直產生警告訊息;訪客也要記得簡碼的寫法才能使用,不如一個勾選框直覺。

如果你之前加過這段,建議換成上面的新寫法,並把 do_shortcode 那一行刪掉。

延伸閱讀

留言區該公開什麼、不該公開什麼,事先規劃好就少很多麻煩。正威網路行銷是基隆在地的基隆網頁設計工作室,有 25 年網站設計經驗,也服務台北與全台客戶,歡迎來聊聊。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。

讓我們一起打造
您的專屬網站!