這款typecho插件可以增強Typecho的搜索功能,很是實用,還可以根據分類來搜索,很方便,是一款值得tupecho主題開發者一試的typecho插件
功能介紹
搜索模式:有常規搜索和僅搜索文章標題兩種模式。
搜索過濾:可以設置一些分類,讓其不被搜索到。
搜索高亮:搜索結果頁面,文章標題和縮略內容中的關鍵字高亮顯示。
注意:縮略內容使用<?php $this->excerpt(140, '...'); ?>
來截取的并不會高亮,因為這個地方沒有插件接口,可以將這個函數換成插件內置的方法<?php $this->excerpts($this); ?>
,并且在插件設置里設置截取長度。也可以這樣寫個判斷
<?php $all = Typecho_Plugin::export(); if(array_key_exists('Soso', $all['activated'])): ?> <?php $this->excerpts($this); ?>//插件啟動就調用插件的這個方法 <?php else: ?> <?php $this->excerpt(140, '...'); ?>//插件沒啟動就調用默認方法 <?php endif; ?>
使用說明
下載后將soso文件夾傳到typecho目錄下,然后啟動插件,打開插件設置,根據文字提示設置即可。
插件升級操作說明
禁用舊版插件,刪除舊版插件文件夾,然后上傳最新版插件,啟動插件設置插件即可
高級玩法
typecho按分類搜索文章

之前我寫的soso搜索增強插件其實已經能夠根據分類進行搜索內容了,不過需要模板上進行配合,比如我們搜索分類id
為2620
下關于typecho
的文章,需要傳遞分類id
的參數給cat
,讓插件獲取,比如這個鏈接https://qqdie.com/search/typecho/?cat=2620
,插件會獲取到2620
,然后根據它來按分類搜索文章內容。
那么問題來了,模板搜索表單怎么傳遞cat
參數
typecho默認的搜索結構直接加個input
進行傳遞,如下:
<form method="post" action="<?php $this->options->siteUrl(); ?>" role="search">
<input type="hidden" name="cat" value="2620">
<input type="text" name="s" placeholder="Search...">
<button type="submit">Search</button>
</form>
HTML
經過測試并沒有用,因為在處理搜索的過程中,typecho
的默認只接受name="s"
傳遞的內容。
我的解決方案就是跳過typecho
默認的搜索處理函數,然后自己寫。
1,跳過默認搜索處理
把上述代碼中的name="s"
改成name="ss"
,跳過typecho默認的搜索處理函數。代碼如:
<form method="post" action="<?php $this->options->siteUrl(); ?>" role="search">
<input type="hidden" name="cat" value="2620">
<input type="text" name="ss" placeholder="Search...">
<button type="submit">Search</button>
</form>
HTML
2,自己寫搜索處理函數
在functions.php
模板文件里加入
function themeInit($archive)
{
if($archive->request->isPost() && isset($archive->request->ss)){
so($archive);//判斷為post請求,并且有參數ss,啟用so函數
}}
function so($obj){
$url=$obj->options->index;
if (Helper::options()->rewrite==0){$url=Helper::options()->rootUrl.'/index.php/';}
/** 處理搜索結果跳轉 */
if (isset($obj->request->ss)) {
$filterKeywords = $obj->request->filter('search')->ss;//獲取搜索詞
$cat = $obj->request->filter('search')->cat;//獲取分類id
/** 跳轉到搜索頁 */
if (NULL != $filterKeywords) {
$obj->response->redirect(Typecho_Router::url('search',
array('keywords' => urlencode($filterKeywords)),$url)."?cat=".$cat);//設置跳轉地址
}
}
}
PHP
3,啟動soso插件
下載soso
插件并啟用插件,測試效果,有效果就可以進行下一步驟了。
4,重寫翻頁按鈕地址
上面的操作完成后,你會發現翻頁按鈕的鏈接并不攜帶cat
參數,也就是說一旦翻頁了,這個按分類搜索就失效了。所以我們需要給翻頁按鈕追加參數,我最初采用的是js追加參數,后來發現可以直接重寫分類按鈕的鏈接,所以就采用php修改按鈕鏈接的方式追加參數了。
在搜索結果的模板文件中增加以下代碼即可:
<?php
global $can;//定義全局變量,方便下面獲取
$cat=intval($this->request->cat);//獲取cat
if($cat>0){$can='?cat='.$cat;}else{$can="";}
class Typecho_Widget_Helper_PageNavigator_Classic extends Typecho_Widget_Helper_PageNavigator
{
public function prev($prevWord = 'PREV')
{
//輸出上一頁
if ($this->_total > 0 && $this->_currentPage > 1) {
echo '<a class="prev" href="' . str_replace($this->_pageHolder, $this->_currentPage - 1, $this->_pageTemplate) . $this->_anchor . $GLOBALS['can'] . '">'
. $prevWord . '</a>';
}
}
public function next($nextWord = 'NEXT')
{
//輸出下一頁
if ($this->_total > 0 && $this->_currentPage < $this->_totalPage) {
echo '<a class="next" title="" href="' . str_replace($this->_pageHolder, $this->_currentPage + 1, $this->_pageTemplate) . $this->_anchor . $GLOBALS['can'] . '">'
. $nextWord . '</a>';
}
}
}
?>
PHP
上述代碼就是在上一頁/下一頁的翻頁按鈕后面追加cat
參數,追加好了,就完美了。
5,完善
步驟1中的代碼只是簡單的傳遞了一個分類id,并不適合實際中使用,可以改為如下:
<form method="post" action="<?php $this->options->siteUrl(); ?>" role="search">
<select name="cat">
<option value="0" selected>全部</option>
<option value="2619">Typecho全部</option>
<option value="2620">Typecho主題</option>
<option value="2621">Typecho插件</option>
<option value="2626">Typecho教程</option>
<option value="2618">博客文章</option>
</select>
<input type="text" name="ss" placeholder="Search...">
<button type="submit">Search</button>
</form>
HTML
使用select
能夠比較方便的選擇分類進行搜索,根據需要select
里面的內容可以使用循環輸出所有分類。