首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 博客智能歡迎提示:來源識別、留言誘導、IE 升級勸導、潛水黨喚醒

     編輯:PHP 相關知識

功能特性

  • 識別訪客來源:直接訪問、搜索引擎 (百度/Google/Yahoo)、RSS 閱讀器 (Google Reader/鮮果/抓蝦/哪吒/有道)、站內跳轉
  • 留言者識別:Cookie comment_author_ 個性化歡迎
  • 潛水黨喚醒:訪問 ≥ 7 次未留言 → 提示誘導
  • IE 升級勸導:IE6/7/8 分級提示,Cookie 控制頻率

核心實現邏輯

1. 歡迎消息主入口

function welcome_msg() {
    // 1. 來源解析
    $referer = $_SERVER['HTTP_REFERER'] ?? '';
    $host = parse_url($referer, PHP_URL_HOST) ?? '';
    if (strpos($host, 'www.') === 0) $host = substr($host, 4);

    // 2. 來源分類輸出
    if (empty($referer)) { ... }
    elseif (preg_match('/baidu/i', $referer)) { ... }
    elseif (preg_match('/google/i', $referer) && !preg_match('/reader/', $referer)) { ... }
    // ... 其他來源
    elseif (isset($_COOKIE["comment_author_".COOKIEHASH])) {
        echo "Howdy, {$_COOKIE[...]} 歡迎回來";
    } else { echo "歡迎來自 {$host} 的朋友"; }

    // 3. 應用過濾器 (插件擴展點)
    echo apply_filters('welcome_msg', '');
}

2. IE 升級勸導 (掛載到 welcome_msg 過濾器)

function killIE($msg) {
    $ua = $_SERVER['HTTP_USER_AGENT'];
    $cookieKey = 'alert_ie_visitor_'.COOKIEHASH;

    if (preg_match('/MSIE\s6/i', $ua) && !isset($_COOKIE[$cookieKey])) {
        $msg .= '您用的是 IE6,不符合標準... 升級 IE8 或換瀏覽器';
        setcookie($cookieKey, 'ie6', time()+20); // 20秒頻繁提示
    }
    elseif (preg_match('/MSIE\s7/i', $ua) && !isset($_COOKIE[$cookieKey])) { ... 3天 }
    elseif (preg_match('/MSIE\s8/i', $ua) && !isset($_COOKIE[$cookieKey])) { ... 100天 推薦 Chrome/Firefox }
    return $msg;
}
add_filter('welcome_msg', 'killIE');

3. 潛水黨喚醒

function alert_commentator($msg) {
    if ($user_ID) return $msg; // 管理員豁免
    $key = 'comment_author_visit_times_'.COOKIEHASH;
    if (!isset($_COOKIE[$key]) || $_COOKIE[$key] < 6) return $msg;

    $name = $_COOKIE['comment_author_'.COOKIEHASH] ?? '';
    $msg = $name ? "嗨 $name 來很多次沒留言!" : "新/老朋友來很多次沒留言!";
    return $msg;
}
add_filter('welcome_msg', 'alert_commentator');

4. 訪問計數器 (init 勾子)

function setcookie_for_alert_commentator() {
    if (is_bot() || $user_ID) return;
    $key = 'comment_author_visit_times_'.COOKIEHASH;
    $times = (int)($_COOKIE[$key] ?? 0) + 1;
    setcookie($key, $times, time()+300*86400, COOKIEPATH, COOKIE_DOMAIN);
    if ($times >= 7) setcookie($key, -2, time()+300*86400, COOKIEPATH, COOKIE_DOMAIN); // 歸零重來
}
add_action('init', 'setcookie_for_alert_commentator');

5. IE Cookie 差異化策略

function setcookie_for_ie() {
    if (isset($_COOKIE['alert_ie_visitor_'.COOKIEHASH])) return;
    $ua = $_SERVER['HTTP_USER_AGENT'];
    if (preg_match('/MSIE\s6/i', $ua)) setcookie(..., time()+20);      // 20秒
    elseif (preg_match('/MSIE\s7/i', $ua)) setcookie(..., time()+3*86400); // 3天
    elseif (preg_match('/MSIE\s8/i', $ua)) setcookie(..., time()+100*86400); // 100天
}
add_action('init', 'setcookie_for_ie');

設計亮點

  • 過濾器模式:核心邏輯 + 多個獨立過濾器組合,開閉原則
  • Cookie 分級:不同行為不同過期時間,平衡體驗與效果
  • 機器人識別:is_bot() 排除爬蟲干擾統計
  • 管理員豁免:避免干擾站長自身操作

現代化遷移建議

  • UA 解析用 ua-parser 庫,正則維護成本高
  • Cookie 策略遵循 SameSite=Lax、Secure、HttpOnly
  • 前端改用 Vue/React 組件化渲染,後端只提供 JSON API
  • RSS 閱讀器列表已過時,現代改為 WebPush / Email 訂閱

這是一個「有溫度」的用戶體驗功能,細節決定成敗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved