網站 / 使用 jQuery UI API -Autocomplete Widget 自動完成關鍵字輸入

很多網站都有輸入框自動完成的功能

例如:google的搜尋

這樣可以很方便找出關鍵字

後來發現網站可以透過 jQuery UI API -Autocomplete Widget來做到相同的功能

首先,要在網頁載入必要的函式庫

<link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.9.1.js"></script>
<script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>

基本的操作如下

$( ".selector" ).autocomplete({ source: [ "c++", "java", "php", "coldfusion", "javascript", "asp", "ruby" ] });

而我想要讓網站內建的搜尋輸入框,也能夠自動完成與顯示網站內的文章分類

例如:輸入 V的時候,能夠帶出VBA…

因此就必須利用wordpress內建函式get_terms()來取得所有的分類

再配合autocomplete()的設定,將結果輸出成字串,加入到 source :[  ]內

以下的程式碼利用「程式碼片段」加在網頁的footer

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$taxonomies = get_terms( array(
	'taxonomy' => 'category', 
	'hide_empty' => false
) );
	
if ( !empty($taxonomies) ) :
    foreach( $taxonomies as $category ) {
        if( $category->parent == 0 ) {
             
            //remove uncategorized from loop
            if( $category->slug == 'uncategorized' ){
                continue;
            }
 
            //Parent category information
            //echo esc_html__($category->name, 'text-domain');
            
 
            //Sub category information
			
            foreach( $taxonomies as $subcategory ) {
                if($subcategory->parent == $category->term_id) {
                    //echo esc_html__($subcategory->name, 'text-domain')."</BR>";
					$s1 .= '"'.esc_html__($subcategory->name, 'text-domain').'"'.",";   //.= 字串累加
					//$s1 .= '"'.$subcategory->name.'"'.",";
					//echo $s1;
                }
            }
         }
    }
endif;
$s1=substr($s1,0,-1); //移除最後一個字元 ,
$s2= str_replace("amp;", "",  $s1); //移除amp;
//$s3= str_replace(" ", "",  $s2);  
?>

<script>
jQuery("#gsc-i-id1").autocomplete({
  appendTo: "#custom_html-2",
  source: [ <?php echo $s2;  ?> ]
});	
	
jQuery("#ocean-search-form-1").autocomplete({
  source: [ <?php echo $s2;  ?> ]
});

jQuery("#ocean-search-form-2").autocomplete({
  source: [ <?php echo $s2;  ?> ]
});	

</script>

 

get_terms( )會回傳陣列型態的資料

在參考範例中,原作者用了兩次foreach

第一次的foreach先取出所有的分類$category 

再透過第二次的foreach來比對出那些是子分類$subcategory 

最後我改用字串累加的方式串接內容並儲存在$s1

由於字串累加的關係,最後面會多出一個 ,

所以用 substr( )來移除

但是在實際輸出到javascript的時候

發現會多出 amp;

可能是因為轉譯的關係,但應該不是esc_html__( )造成的,因為移除之後還是一樣

所以直接用str_replace( )取代移除

最後將處理過的字串輸出在javasctipt裡

這樣就可以在內建的搜尋功能自動完成與顯示文章分類的關鍵字了

 

後記:

本來也想在google的網頁工具生成「站內搜尋」加上這個功能

但是這個區塊的內容是透過javascript生成程式碼

在網頁原始碼中並不會出現,因此就會抓不到DOM

只能在google的設定頁面中增加
 

參考資料:

jQuery UI API – 自动完成部件(Autocomplete Widget)

get_terms( array|string $args = array(), array|string $deprecated = ” )

【前端HTML】&amp;&amp;&nbsp在html里是什么意思

PHP中.=和+=是什么意思详解

PHP 去除字串最後一個字元

如何在 PHP 中刪除字串中的所有空格