當(dāng)前位置:首頁>WordPress建站>WordPress開發(fā)>WordPress通過Cookie記錄用戶的搜索歷史

WordPress通過Cookie記錄用戶的搜索歷史

最近項(xiàng)目需要記錄每個(gè)用戶在WordPress網(wǎng)站上的搜索歷史,考慮到需求比較簡單,倡萌決定采用Cookies來實(shí)現(xiàn)。在這里簡單分享下方法,有些細(xì)節(jié)就需要自己去修改和完善了。

如上圖加框部分所示,我們要記錄并輸出用戶的搜索記錄,還要添加一個(gè)清空搜索歷史的功能。

將用戶搜索記錄寫入Cookie

/**
 * 通過Cookie記錄用戶搜索記錄
 */
function wpkj_set_recently_searches(){

    //僅在前端搜索頁面執(zhí)行
    if ( is_search() && !is_admin() ) {

        $search_term = get_search_query();

        if( $search_term ) $search_term = trim( $search_term );
        //如果搜索字段不存在或?yàn)榭眨焕^續(xù)
        if( !$search_term || $search_term === '') return;

        //檢查并設(shè)置搜索歷史數(shù)組
        $recently_searches = array();
        if(isset($_COOKIE['wpkj_recently_searches'])) {
            $recently_searches = explode(',', $_COOKIE['wpkj_recently_searches'], 20);
        }
        if(!in_array( $search_term, $recently_searches)){
            $recently_searches[] = $search_term;
        }
        //設(shè)置cookie為30天
        setcookie('wpkj_recently_searches', implode(',', $recently_searches), current_time('timestamp') + (86400*30), "/");
    }
}
add_action( 'wp', 'wpkj_set_recently_searches', 20 );

在上面的代碼中,我們封裝了一個(gè) wpkj_set_recently_searches 函數(shù),然后將該函數(shù)掛載到 wp 鉤子中執(zhí)行。

獲取并輸出用戶的搜索記錄

/**
 * 獲取用戶最近搜索記錄
 */
function wpkj_get_recently_searches( $limit = 10, $title = false ){

    $recently_searches = array();
    if(isset($_COOKIE['wpkj_recently_searches'])) {
        $recently_searches = explode(',', $_COOKIE['wpkj_recently_searches']);
        //將搜索記錄倒序
        $recently_searches = array_reverse($recently_searches);
        if( !empty($recently_searches) ) {
            $html = '<div class="recently-searches">';
            if( $title ) $html .= '<h2 class="searches-title recently-searches-title">'. htmlspecialchars($title) .'</h2>';
            $html .= '<ul class="recently-searches-ul">';
            $home_url_slash = get_option('home') . '/';
            $i = 1;
            foreach( $recently_searches as $result ) {

                $html .= '<li class="search-item"><a href="'. $home_url_slash . '?s=' . $result . '">'. htmlspecialchars($result) .'</a></li>';
                $i++;
            }
            $html .= '</ul>';

            $html .= '<div class="recently-searches-del">'.__( 'Clear search history', THEME_SLUG ).'</div>';

            $html .= '</div>';

            return $html;
        }
    }
}

wpkj_get_recently_searches 函數(shù)有兩個(gè)參數(shù),第一個(gè)為調(diào)用的個(gè)數(shù),第二個(gè)為標(biāo)題。然后我們可以在需要輸出搜索記錄的地方,使用下面的代碼即可:

if(function_exists('wpkj_get_recently_searches')) {
    echo wpkj_get_recently_searches( 10, '搜索歷史');
}

清空當(dāng)前用戶搜索歷史

這里通過js方式實(shí)現(xiàn):

//獲取cookie
function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1);
        if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
    }
    return "";
}

//添加一個(gè)js函數(shù)用于刪除cookie
function delCookie(name) {
    var exp = new Date();
    exp.setTime(exp.getTime() - 1);
    var cval = getCookie(name);
    if (cval != null) document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}

//很抱歉,這里采用的是jquery操作
jQuery(document).ready(function($) {
    $(".recently-searches-del").on("click", function() {
        //刪除cookie
        delCookie("wpkj_recently_searches");
        //隱去搜索歷史部分的內(nèi)容
        $(".recently-searches").fadeOut();
    });
});

你可以將上面的js代碼添加到一個(gè)js文件中,比如命名為 recently-searches.js,然后可以通過下面的代碼引入:

//引入搜索歷史js
function wpkj_recently_searches_scripts() {
    wp_enqueue_script( 'recently_searches', get_template_directory_uri() . '/assets/js/recently-searches.js', array( 'jquery' ), '', true );
}
add_action( 'wp_enqueue_scripts', 'wpkj_recently_searches_scripts' );

請注意下js文件的路徑,上面的代碼表示我將 recently-searches.js 放在了當(dāng)前主題的 /assets/js 目錄下,你需要根據(jù)自己的實(shí)際修改這個(gè)路徑。

到這里就OK了。代碼還是有可以優(yōu)化的空間,就靠大家自己折騰了。

最后,如果你想實(shí)現(xiàn)上圖的“熱搜”部分的功能,可以看文章《WordPress搜索統(tǒng)計(jì)分析插件 Search Analytics(已漢化)

聲明:本站所有文章,如無特殊說明或標(biāo)注,均為本站原創(chuàng)發(fā)布。任何個(gè)人或組織,在未征得本站同意時(shí),禁止復(fù)制、盜用、采集、發(fā)布本站內(nèi)容到任何網(wǎng)站、書籍等各類媒體平臺(tái)。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。

給TA打賞
共{{data.count}}人
人已打賞
歡迎關(guān)注WordPress大學(xué)公眾號 WPDAXUE
WordPress開發(fā)

WordPress添加自定義字段到菜單項(xiàng)

2020-4-20 18:32:28

WordPress開發(fā)

WordPress自定義首頁、搜索、作者存檔、Feed訂閱輸出的文章類型

2020-4-24 10:49:38

13 條回復(fù) A文章作者 M管理員
  1. 一個(gè)簡單人

    清除歷史搜索這個(gè)js一直報(bào)錯(cuò)是什么原因呢?其他都按照教程更改正常,清除歷史搜索無法生效

    • 網(wǎng)站編輯

      需要jQuery庫依賴,如果你的主題不規(guī)范,可能造成多個(gè)版本的jQuery庫,或者缺少jQuery庫

    • 一個(gè)簡單人

      jQ庫應(yīng)該沒問題,因?yàn)槠渌膉q效果都無異常,需要什么版本的jq呢?目前使用的是jQuery v1.11.0

    • 網(wǎng)站編輯

      對版本應(yīng)該沒什么要求,而且我開發(fā)測試的時(shí)候,這個(gè)都是沒有報(bào)錯(cuò)的,請你自己再好好看看到底什么原因報(bào)錯(cuò)吧,可以百度下報(bào)錯(cuò)的代碼

    • 一個(gè)簡單人

      錯(cuò)誤出現(xiàn)在這一行var cval = getCookie(name);
      報(bào)錯(cuò)代碼為:Uncaught ReferenceError: getCookie is not defined

    • 一個(gè)簡單人

      添加一個(gè)js函數(shù)用于刪除cookie這個(gè)地方需要添加在主題的function文件嗎?

    • 網(wǎng)站編輯

      感謝反饋報(bào)錯(cuò)的代碼,已經(jīng)補(bǔ)充了一個(gè)缺失的js函數(shù),具體請看文章的js代碼部分

  2. Wesley

    用戶搜索的時(shí)間怎么加呢??

  3. 拓拓

    不應(yīng)該用cookie記錄,cookie在每次請求中都會(huì)發(fā)送到服務(wù)器。應(yīng)該用瀏覽器的本地存儲(chǔ)。本地存儲(chǔ)可以儲(chǔ)存好幾兆的數(shù)據(jù)。

    • 網(wǎng)站編輯

      在這方面的確不是很了解,感謝提醒,抽時(shí)間去試試

    • 拓拓

      我碰巧做過類似的東西,這個(gè)功能,應(yīng)該可以做成一個(gè)純前端的功能。大致思路:js讀取url GET參數(shù)(已確定可行),存儲(chǔ)到本地存儲(chǔ),然后在需要的地方,還是js讀取本地存儲(chǔ),并拼接搜索鏈接。生成列表即可。

?
個(gè)人中心
購物車
優(yōu)惠劵
今日簽到
有新私信 私信列表
搜索

恩平市| 正宁县| 万盛区| 临汾市| 文化| 英山县| 桂阳县| 翼城县| 商丘市| 利津县| 留坝县| 龙门县| 伊吾县| 汾西县| 库车县| 西畴县| 深州市| 西林县| 伊川县| 武汉市| 河间市| 郑州市| 阳信县| 纳雍县| 元朗区| 永川市| 霍山县| 聂拉木县| 枣阳市| 革吉县| 藁城市| 肥城市| 龙泉市| 高台县| 南涧| 仪征市| 湛江市| 读书| 新民市| 舞阳县| 麦盖提县|