
開啟「留言必須經過人工核准」之後,訪客送出留言只會看到「留言正在等待審核」,然後就離開了。等你幾天後按下核准,對方根本不知道,當然也不會回來看。
WordPress 內建會寄信通知站長有新留言,卻不會通知留言的人。這篇用程式碼補上兩個通知:
- 留言審核通過時,寄信告訴留言者「你的留言已經公開了」
- 有人回覆他的留言時,寄信提醒他回來看
開始之前
- 程式碼放在哪裡:加到子主題的
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,第二個參數是這則留言有沒有直接通過審核。- 回覆一定要是已公開的狀態才寄信,避免把還沒審核、甚至是垃圾留言的內容寄給別人。
怎麼測試
- 用無痕視窗(不要登入)到任一篇文章留言,電子郵件填你自己的另一個信箱。
- 到後台「留言」頁面,把這則留言按「核准」。
- 幾分鐘內應該會收到信。沒收到的話先看垃圾信件匣,再用 SMTP 外掛裡的「寄送測試信」功能,確認網站本身寄得出信。
注意事項
- 隱私權:留言者的電子郵件只拿來寄這類跟他留言有關的通知,建議在隱私權政策寫一句「留言通過審核或有人回覆時,會寄信通知你」。不要把留言者的信箱拿去寄電子報,那需要對方另外同意。
- 一次核准很多則:批次核准幾十則留言時,會一次寄出幾十封信。有些主機限制每小時可以寄出的信件數量,留言量大的網站要留意。
- 沒有取消訂閱的功能:這段程式碼不會讓留言者選擇「不要再通知我」。留言很多、回覆很熱絡的網站,建議改用有「訂閱/取消訂閱留言」功能的外掛。
延伸閱讀
- 用 Gmail 收發公司企業信箱:寄件(SMTP)設定與 Gmail 停用 POP 後的收信方式
- WordPress 防垃圾留言總整理:外掛、留言設定、蜜罐與字數限制
- WordPress 悄悄話留言:讓訪客勾選「只給站長看」的私密留言
讓留言的人願意再回來,網站才會慢慢累積互動。正威網路行銷是基隆在地、25 年經驗的基隆網頁設計工作室,也服務台北與全台客戶,想替網站加上這類貼心的小功能,歡迎來聊聊。







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