0%

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

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

WordPress 留言審核通過自動寄信通知留言者(含回覆通知程式碼)

一手拿咖啡、一手用筆電寫程式

開啟「留言必須經過人工核准」之後,訪客送出留言只會看到「留言正在等待審核」,然後就離開了。等你幾天後按下核准,對方根本不知道,當然也不會回來看。

WordPress 內建會寄信通知站長有新留言,卻不會通知留言的人。這篇用程式碼補上兩個通知:

  1. 留言審核通過時,寄信告訴留言者「你的留言已經公開了」
  2. 有人回覆他的留言時,寄信提醒他回來看

開始之前

  • 程式碼放在哪裡:加到子主題的 functions.php,或用 Code Snippets 外掛新增,不要直接改主題本身的檔案,主題一更新就會被覆蓋。
  • 先確認網站寄得出信:WordPress 預設用主機的 PHP 寄信功能,很多主機寄出的信會被當成垃圾信,甚至根本寄不出去。建議先裝一個 SMTP 外掛(例如 WP Mail SMTP),改用正式的信箱帳號寄信。信箱的 SMTP 設定可以參考用 Gmail 收發公司企業信箱。

步驟一:共用的寄信函式

兩種通知信的格式一樣,先寫一個共用的函式:

PHP
/**
 * 寄出 HTML 格式的留言通知信
 */
function ahwei_send_comment_mail( $to, $subject, $html ) {
    $site_name = wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES );
    $html     .= '<p style="color:#888;">此信件由系統自動發送,請勿直接回覆。</p>';

    return wp_mail(
        $to,
        '【' . $site_name . '】' . $subject,
        $html,
        array( 'Content-Type: text/html; charset=UTF-8' )
    );
}

/**
 * 只處理一般留言(不含 Pingback、Trackback)
 */
function ahwei_is_normal_comment( $comment ) {
    return in_array( $comment->comment_type, array( '', 'comment' ), true );
}

步驟二:審核通過時通知留言者

留言的狀態改變時(例如從「待審核」變成「已核准」),WordPress 會執行 transition_comment_status 這個 hook,並告訴我們新舊狀態。我們只在「待審核 → 已核准」的時候寄信:

PHP
add_action( 'transition_comment_status', function ( $new_status, $old_status, $comment ) {
    // 只在「待審核 → 已核准」時寄信
    if ( 'approved' !== $new_status || 'unapproved' !== $old_status ) {
        return;
    }
    if ( ! ahwei_is_normal_comment( $comment ) || ! is_email( $comment->comment_author_email ) ) {
        return;
    }

    $html  = '<p>' . esc_html( $comment->comment_author ) . ' 您好:</p>';
    $html .= '<p>您在〈' . esc_html( get_the_title( $comment->comment_post_ID ) ) . '〉的留言已經通過審核,現在大家都看得到了。</p>';
    $html .= '<blockquote style="border-left:3px solid #ccc;padding-left:12px;color:#555;">'
           . nl2br( esc_html( $comment->comment_content ) ) . '</blockquote>';
    $html .= '<p><a href="' . esc_url( get_comment_link( $comment ) ) . '">查看您的留言</a></p>';

    ahwei_send_comment_mail( $comment->comment_author_email, '您的留言已通過審核', $html );
}, 10, 3 );

幾個重點:

  • 不管是在「留言」頁面按核准、用批次動作核准,還是點通知信裡的核准連結,都會觸發這段。
  • 送出後直接公開的留言(例如先前已經核准過的留言者)不會寄信,因為對方送出時就已經看到自己的留言了。
  • 名稱、文章標題、留言內容都經過 esc_html() 處理,避免有人在留言裡夾帶程式碼,讓信件內容變形。

步驟三:有人回覆時,通知原本的留言者

這段是加分功能:只要有人回覆某則留言,就寄信給原本留言的人。

PHP
/**
 * 這則留言如果是回覆別人,就通知被回覆的人
 */
function ahwei_notify_parent_author( $comment ) {
    $comment = get_comment( $comment );
    if ( ! $comment || ! $comment->comment_parent || ! ahwei_is_normal_comment( $comment ) ) {
        return;
    }
    $parent = get_comment( $comment->comment_parent );
    if ( ! $parent || '1' !== $parent->comment_approved || ! is_email( $parent->comment_author_email ) ) {
        return;
    }
    // 自己回覆自己,不用通知
    if ( 0 === strcasecmp( $parent->comment_author_email, $comment->comment_author_email ) ) {
        return;
    }

    $html  = '<p>' . esc_html( $parent->comment_author ) . ' 您好:</p>';
    $html .= '<p>' . esc_html( $comment->comment_author ) . ' 回覆了您在〈' . esc_html( get_the_title( $comment->comment_post_ID ) ) . '〉的留言:</p>';
    $html .= '<blockquote style="border-left:3px solid #ccc;padding-left:12px;color:#555;">'
           . nl2br( esc_html( $comment->comment_content ) ) . '</blockquote>';
    $html .= '<p><a href="' . esc_url( get_comment_link( $comment ) ) . '">查看回覆</a></p>';

    ahwei_send_comment_mail( $parent->comment_author_email, '您的留言有新的回覆', $html );
}

// 情況一:回覆送出後直接公開(例如站長在後台回覆)
add_action( 'comment_post', function ( $comment_id, $comment_approved ) {
    if ( 1 === (int) $comment_approved ) {
        ahwei_notify_parent_author( $comment_id );
    }
}, 10, 2 );

// 情況二:回覆原本在待審核,後來才核准
add_action( 'transition_comment_status', function ( $new_status, $old_status, $comment ) {
    if ( 'approved' === $new_status && 'unapproved' === $old_status ) {
        ahwei_notify_parent_author( $comment );
    }
}, 10, 3 );
  • comment_post 是新留言存進資料庫後執行的 hook,第二個參數是這則留言有沒有直接通過審核。
  • 回覆一定要是已公開的狀態才寄信,避免把還沒審核、甚至是垃圾留言的內容寄給別人。

怎麼測試

  1. 用無痕視窗(不要登入)到任一篇文章留言,電子郵件填你自己的另一個信箱。
  2. 到後台「留言」頁面,把這則留言按「核准」。
  3. 幾分鐘內應該會收到信。沒收到的話先看垃圾信件匣,再用 SMTP 外掛裡的「寄送測試信」功能,確認網站本身寄得出信。

注意事項

  • 隱私權:留言者的電子郵件只拿來寄這類跟他留言有關的通知,建議在隱私權政策寫一句「留言通過審核或有人回覆時,會寄信通知你」。不要把留言者的信箱拿去寄電子報,那需要對方另外同意。
  • 一次核准很多則:批次核准幾十則留言時,會一次寄出幾十封信。有些主機限制每小時可以寄出的信件數量,留言量大的網站要留意。
  • 沒有取消訂閱的功能:這段程式碼不會讓留言者選擇「不要再通知我」。留言很多、回覆很熱絡的網站,建議改用有「訂閱/取消訂閱留言」功能的外掛。

延伸閱讀

讓留言的人願意再回來,網站才會慢慢累積互動。正威網路行銷是基隆在地、25 年經驗的基隆網頁設計工作室,也服務台北與全台客戶,想替網站加上這類貼心的小功能,歡迎來聊聊。

分享這篇文章

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

發表留言

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

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