1. Code
  2. WordPress

Membangun Plugin WordPress "Pencarian Berdasarkan Kategori" Kustom

Dengan semakin meningkatnya jumlah konten yang membangun di situs Wordpress Anda, pengguna Anda pasti akan perlu untuk mencari situs Anda untuk menemukan artikel bermanfaat tertentu dari perjalanan kembali. Untuk membantu mempersempit hasil pencarian, saya akan menunjukkan cara mengkode plugin yang memungkinkan pengguna untuk mencari berdasarkan kategori.
Scroll to top

Indonesian (Bahasa Indonesia) translation by ⚡ Rova Rindrata (you can also view the original English article)

Dengan semakin meningkatnya jumlah konten yang membangun di situs Wordpress Anda, pengguna Anda pasti akan perlu untuk mencari situs Anda untuk menemukan artikel bermanfaat tertentu dari perjalanan kembali. Untuk membantu mempersempit hasil pencarian, saya akan menunjukkan cara mengkode plugin yang memungkinkan pengguna untuk mencari berdasarkan kategori.

Tutorial ini termasuk screencast yang tersedia untuk anggota Tuts+ Premium.

Langkah pertama dalam pengembangan plugin kita adalah menentukan set fitur yang akan dimiliki, ditambah jumlah penyesuaian yang tersedia. Kami ingin plugin kita memiliki fitur berikut dan memungkinkan kustomisasi pengguna yang lengkap:

  1. Konfigurasi ulang pencarian berdasarkan kategori yang dipilih
  2. Daftar drop-down kategori
  3. Kemampuan untuk menyembunyikan kategori tanpa posting dari daftar
  4. Kemampuan untuk mengecualikan kategori anak dari daftar
  5. Opsi untuk menonaktifkan styling bawaan kita
  6. Kemampuan untuk mengecualikan kategori tertentu dari daftar
  7. Kemampuan untuk menggunakan nilai kustom di kotak pencarian
  8. Kemampuan untuk menggunakan nilai kustom untuk pemilihan "Di semua kategori"

Membuat Kerangka untuk Plugin

Sebelum kita bisa melakukan apapun ke plugin kita, pertama kita perlu membangun kerangka plugin agar bisa bekerja. Kita akan mulai dengan membuat folder baru di direktori "plugins" wordpress (/wp-content/plugins) dan memberi judul "search-by-category" (dengan konvensi, semua folder plugin harus semua huruf kecil dan gunakan tanda hubung pengganti spasi sehingga saat menautkan ke file di folder URL akan mudah dibaca oleh manusia). Buat file PHP baru di folder berjudul "sbc.php", file ini akan dijadikan dasar bagi keseluruhan struktur plugin kita. Isi selanjutnya, di plugin dengan info Wordpress yang dibutuhkan agar bisa tampil di panel WP-Admin kita.

1
 
2
<?php 
3
/* 

4
Plugin Name: Search By Category Tutorial 

5
Plugin URI: https://fire-studios.com/blog/search-by-category/ 

6
Description: Reconfigures search results to display results based on category of posts. 

7
Version: 1.0.0 

8
Author: Fire G 

9
Author URI: http://fire-studios.com/blog/ 

10
*/ 
11
 
12
?>


Set-up halaman Options

Sekarang WordPress sedang mengenali plugin kita, kita bisa memulai perkembangan kita. Hal pertama yang perlu kita lakukan adalah mengatur sebuah halaman Options agar kita bisa membiarkan pengguna mengkonfigurasi plugin kita sesuai dengan keinginannya. Cara kerjanya adalah proses tiga langkah:

pertama kita membuat kelas untuk semua konfigurasi kita untuk beroperasi di dalam.

1
 
2
if ( ! class_exists( 'SBC_Admin' ) ) { 
3
  class SBC_Admin { 
4
		 
5
	} 
6
}

Kedua kita menjalankan fungsi untuk membuat halaman config.

1
 
2
// prep options page insertion 

3
function add_config_page() { 
4
	if ( function_exists('add_submenu_page') ) { 
5
		add_options_page('Search By Category Options', 'Search By Category', 10, basename(__FILE__), array('SBC_Admin','config_page')); 
6
	} 
7
}

Menyiapkan Personalisasi

Setelah kita mempersiapkan halaman konfigurasi kita, kita bisa mulai menambahkan di opsi konfigurasi kita untuk diterapkan nanti di plugin. Untuk menampilkan halaman konfigurasi kita, kita harus membuat fungsi baru yang disebut "config_page()" yang akan kita isi dengan kode bagian admin kita. Pertama kita akan melanjutkan dan menulis HTML untuk semua bagian kita.

1
 
2
<div class="wrap"> 
3
	<hr /><h2>Seach By Category Options</h2> 
4
	<form action="" method="post" id="sbc-config"> 
5
		<table class="form-table"> 
6
			<?php if (function_exists('wp_nonce_field')) { wp_nonce_field('sbc-updatesettings'); } ?> 
7
			<tr> 
8
				<th scope="row" valign="top"><label for="search-text">Display text in the search box:</label></th> 
9
				<td><input type="text" name="search-text" id="search-text" class="regular-text" value="<?php echo $search_text; ?>"/></td> 
10
			</tr> 
11
			<tr> 
12
				<th scope="row" valign="top"><label for="focus">Display text in drop-down selection:</label></th> 
13
				<td><input type="text" name="focus" id="focus" class="regular-text" value="<?php echo $focus; ?>"/></td> 
14
			</tr> 
15
			<tr> 
16
				<th scope="row" valign="top"><label for="hide-empty">Hide categories with no posts?</label></th> 
17
				<td><input type="checkbox" name="hide-empty" id="hide-empty" value="1" <?php if ($hide_empty == '1') echo 'checked="checked"'; ?> /></td> 
18
			</tr> 
19
			<tr> 
20
				<th scope="row" valign="top"><label for="exclude-child">Exclude Child categories from list?</label></th> 
21
				<td><input type="checkbox" name="exclude-child" id="exclude-child" value="1" <?php if ($exclude_child == '1') echo 'checked="checked"'; ?> /></td> 
22
			</tr> 
23
			<tr> 
24
				<th scope="row" valign="top"><label for="sbc-style">Use the SBC Form styling?</label></th> 
25
				<td><input type="checkbox" name="sbc-style" id="sbc-style" value="1" <?php if ($sbc_style == '1') echo 'checked="checked"'; ?> /> <em>* Styling doesn't display correctly in IE7 and earlier *</em></td> 
26
			</tr> 
27
			<tr> 
28
				<th scope="row" valign="top"><label for="focus">Categories to exclude:</label></th> 
29
				<td><ul><?php wp_category_checklist(0,0,$raw_excluded_cats); ?></ul></td> 
30
			</tr> 
31
		</table> 
32
		<br/> 
33
		<span class="submit" style="border: 0;"><input type="submit" name="submit" value="Save Settings" /></span> 
34
	</form> 
35
</div>

Anda akan melihat bahwa kita telah menggunakan PHP untuk referensi variabelnya: $search_text, $focus, $hide_empty, $exclude_child, $sbc_style, dan $raw_excluded_cats (dalam fungsi "wp_category_checklist"). Kita akan membuat dan memperluas variabel-variabel ini pada langkah selanjutnya.



Screencast Penuh



Menambahkan Opsi Kita ke Database

Setelah halaman admin selesai dan berjalan kita bisa mulai menggunakannya untuk menambahkan opsi ke Database. Untuk melakukan ini, kita hanya akan membuat variabel sebelum "if( !class_exists('SBC_Admin' ) ) {" dan kemudian menggunakan fungsi Wordpress "add_option('entry-title', 'value')" untuk memasukkan ke dalam tabel wp_options dari DB. Berikut daftar variabel yang akan kami gunakan di plugin kita:

  • $focus - Teks default yang dilihat pemirsa dalam drop-down pilihan
  • $hide_empty - true atau false, menghapus kategori dengan 0 posting dari drop-down
  • $excluded_cats - array terpisah koma dari kategori yang dikecualikan
  • $raw_excluded_cats - array kategori yang dikecualikan
  • $search_text - Teks default di kotak pencarian dalam form
  • $exclude_child - true atau false, menghapus kategori anak dari drop-down
  • $sbc_style - true atau false, menggunakan stylesheet SBC kustom
1
 
2
// Some Defaults 

3
$focus					= 'In All Categories'; 
4
$hide_empty				= '1'; // 1 means true 

5
$excluded_cats			= array(); 
6
$search_text			= 'Search For...'; 
7
$exclude_child			= '0'; // 0 means false 

8
$raw_excluded_cats		= array(); 
9
$sbc_style				= '1'; 
10
 
11
// Put our defaults in the "wp-options" table 

12
add_option("sbc-focus", $focus); 
13
add_option("sbc-hide-empty", $hide_empty); 
14
add_option("sbc-excluded-cats", $excluded_cats); 
15
add_option("sbc-search-text", $search_text); 
16
add_option("sbc-selected-excluded", $raw_excluded_cats); 
17
add_option("sbc-exclude-child", $exclude_child); 
18
add_option("sbc-style", $sbc_style);

Setelah kita mengatur default dan menambahkan ke database, kita bisa menggunakan fungsi Wordpress ''get_option('entry-title')" di fungsi config_page kita sehingga nilai-nilai kita tercermin di dalam form.

1
 
2
function config_page(){ 
3
	$focus					= get_option("sbc-focus"); 
4
	$hide_empty				= get_option("sbc-hide-empty"); 
5
	$search_text			= get_option("sbc-search-text"); 
6
	$excluded_cats			= get_option("sbc-excluded-cats"); 
7
	$exclude_child			= get_option("sbc-exclude-child"); 
8
	$raw_excluded_cats 		= get_option("sbc-selected-excluded"); // For Checklist 

9
	$sbc_style				= get_option("sbc-style");

Sekarang halaman Options kita menggunakan data dari database, mari kita setup proses pembaruan. Untuk mulai kita akan memulai pernyataan if yang memeriksa apakah tombol kirim kita diset. Selanjutnya kita akan membandingkan wpnonce untuk memverifikasi bahwa pengguna mengunjungi halaman tersebut sebelum mencoba memperbarui opsi. Kemudian kita akan menjalankan pernyataan if yang lain untuk memeriksa dan memastikan saat ini diperbolehkan untuk mengubah setting dengan menjalankan fungsi WP "current_user_can('manage_options')", jika tidak bisa, maka kita akan mematikan skripnya.

1
 
2
if ( isset($_POST['submit']) ) { 
3
	$nonce = $_REQUEST['_wpnonce']; 
4
	if (! wp_verify_nonce($nonce, 'sbc-updatesettings') ) die('Security check failed'); 
5
	if (!current_user_can('manage_options')) die(__('You cannot edit the search-by-category options.')); 
6
	check_admin_referer('sbc-updatesettings'); 
7
}

Sekarang kita akan memperbarui variabel yang kita definisikan tadi dengan nilai input dari form. Karena kita menggunakan kotak centang untuk daftar kategori yang dikecualikan, cara terbaik untuk mendapatkan pengembalian yang kita inginkan darinya adalah dengan menyatakan pernyataan if lainnya dan memeriksa bahwa "post_category" (id yang diberikan ke daftar oleh fungsi WP) telah ditetapkan. Jika ada, maka kita akan mengambil bentuk mentahnya dan meletakkan kembali ke variabel "$raw_excluded_cats" dari sebelumnya sehingga kotak centang akan tetap dicentang. Kita juga akan menggunakan nilai pengembalian yang sama untuk membuat array terpisah koma untuk digunakan nanti dengan menambahkan satu nilai ekstra ke awal array (Ini adalah perbaikan untuk kesalahan di lain waktu di fungsi lain) dan kemudian implode array-nya.

1
 
2
// Get our new option values 

3
$focus					= $_POST['focus']; 
4
$hide_empty				= $_POST['hide-empty']; 
5
$search_text			= $_POST['search-text']; 
6
$exclude_child			= $_POST['exclude-child']; 
7
$sbc_style				= $_POST['sbc-style']; 
8
 
9
if(isset($_POST['post_category'])){ 
10
	$raw_excluded_cats 		= $_POST['post_category']; 
11
 
12
	// Fix our excluded category return values 

13
	$fix					= $raw_excluded_cats; 
14
	array_unshift($fix, "1"); 
15
	$excluded_cats			= implode(',',$fix); 
16
}

Karena sifat kotak centang, mereka hanya memiliki nilai pengembalian jika dicentang, jadi kita perlu menulis tangkapan saat tidak dicentang. Untuk melakukan ini, kita akan menggunakan pernyataan if sederhana yang memeriksa apakah variabel kita kosong (karena tidak ada nilai pengembalian dari form untuk mengisinya) jika kosong, kita akan menetapkan nilainya ke "0" (false).

1
 
2
// Make sure "$hide_empty" & "$exclude_child" are set right 

3
if (empty($hide_empty)) $hide_empty = '0'; // 0 means false 

4
if (empty($exclude_child)) $exclude_child = '0'; // 0 means false 

5
if (empty($sbc_style)) $sbc_style = '0'; // 0 means false

Sekarang langkah terakhir kita adalah memperbarui database dengan nilai baru kita menggunakan fungsi Wordpress "update_option('entry-title', 'new-value')". Kita juga akan membungkus nilai yang kita masukkan ke dalam DB dengan fungsi mysql_real_escape_string() untuk membantu mencegah injeksi SQL.

1
 
2
// Update the DB with the new option values 

3
update_option("sbc-focus", mysql_real_escape_string($focus)); 
4
update_option("sbc-hide-empty", mysql_real_escape_string($hide_empty)); 
5
update_option("sbc-selected-excluded", mysql_real_escape_string($raw_excluded_cats)); 
6
update_option("sbc-excluded-cats", mysql_real_escape_string($excluded_cats)); 
7
update_option("sbc-search-text", mysql_real_escape_string($search_text)); 
8
update_option("sbc-exclude-child", mysql_real_escape_string($exclude_child)); 
9
update_option("sbc-style", mysql_real_escape_string($sbc_style));

Kode kita sejauh ini:

1
 
2
<?php 
3
/* 

4
Plugin Name: Search By Category Tutorial 

5
Plugin URI: http://fire-studios.com/blog/search-by-category/ 

6
Description: Reconfigures search results to display results based on category of posts. 

7
Version: 1.0.0 

8
Author: Fire G 

9
Author URI: http://fire-studios.com/blog/ 

10
*/ 
11
 
12
// Some Defaults 

13
$focus					= 'In All Categories'; 
14
$hide_empty				= '1'; // 1 means true 

15
$excluded_cats			= array(); 
16
$search_text			= 'Search For...'; 
17
$exclude_child			= '0'; // 0 means false 

18
$raw_excluded_cats		= array(); 
19
$sbc_style				= '1'; 
20
 
21
// Put our defaults in the "wp-options" table 

22
add_option("sbc-focus", $focus); 
23
add_option("sbc-hide-empty", $hide_empty); 
24
add_option("sbc-excluded-cats", $excluded_cats); 
25
add_option("sbc-search-text", $search_text); 
26
add_option("sbc-selected-excluded", $raw_excluded_cats); 
27
add_option("sbc-exclude-child", $exclude_child); 
28
add_option("sbc-style", $sbc_style); 
29
 
30
if ( ! class_exists( 'SBC_Admin' ) ) { 
31
 
32
	class SBC_Admin { 
33
 
34
		// prep options page insertion 

35
		function add_config_page() { 
36
			if ( function_exists('add_submenu_page') ) { 
37
				add_options_page('Search By Category Options', 'Search By Category', 10, basename(__FILE__), array('SBC_Admin','config_page')); 
38
			} 
39
		} 
40
 
41
		function config_page() { 
42
			if ( isset($_POST['submit']) ) { 
43
				$nonce = $_REQUEST['_wpnonce']; 
44
				if (! wp_verify_nonce($nonce, 'sbc-updatesettings') ) die('Security check failed'); 
45
				if (!current_user_can('manage_options')) die(__('You cannot edit the search-by-category options.')); 
46
				check_admin_referer('sbc-updatesettings'); 
47
 
48
				// Get our new option values 

49
				$focus					= $_POST['focus']; 
50
				$hide_empty				= $_POST['hide-empty']; 
51
				$search_text			= $_POST['search-text']; 
52
				$exclude_child			= $_POST['exclude-child']; 
53
				$sbc_style				= $_POST['sbc-style']; 
54
 
55
				if(isset($_POST['post_category'])){ 
56
					$raw_excluded_cats 		= $_POST['post_category']; 
57
 
58
					// Fix our excluded category return values 

59
					$fix					= $raw_excluded_cats; 
60
					array_unshift($fix, "1"); 
61
					$excluded_cats			= implode(',',$fix); 
62
				} 
63
 
64
				// Make sure "$hide_empty" & "$exclude_child" are set right 

65
				if (empty($hide_empty)) $hide_empty = '0'; // 0 means false 

66
				if (empty($exclude_child)) $exclude_child = '0'; // 0 means false 

67
				if (empty($sbc_style)) $sbc_style = '0'; // 0 means false  

68
 
69
				// Update the DB with the new option values 

70
				update_option("sbc-focus", mysql_real_escape_string($focus)); 
71
				update_option("sbc-hide-empty", mysql_real_escape_string($hide_empty)); 
72
				update_option("sbc-selected-excluded", mysql_real_escape_string($raw_excluded_cats)); 
73
				update_option("sbc-excluded-cats", mysql_real_escape_string($excluded_cats)); 
74
				update_option("sbc-search-text", mysql_real_escape_string($search_text)); 
75
				update_option("sbc-exclude-child", mysql_real_escape_string($exclude_child)); 
76
				update_option("sbc-style", mysql_real_escape_string($sbc_style)); 
77
			} 
78
 
79
			$focus					= get_option("sbc-focus"); 
80
			$hide_empty				= get_option("sbc-hide-empty"); 
81
			$search_text			= get_option("sbc-search-text"); 
82
			$excluded_cats			= get_option("sbc-excluded-cats"); 
83
			$exclude_child			= get_option("sbc-exclude-child"); 
84
			$raw_excluded_cats 		= get_option("sbc-selected-excluded"); // For Admin Checklist 

85
			$sbc_style				= get_option("sbc-style"); 
86
 
87
			?> 
88
			<div class="wrap"> 
89
				<hr /><h2>Seach By Category Options</h2> 
90
				<form action="" method="post" id="sbc-config"> 
91
					<table class="form-table"> 
92
						<?php if (function_exists('wp_nonce_field')) { wp_nonce_field('sbc-updatesettings'); } ?> 
93
						<tr> 
94
							<th scope="row" valign="top"><label for="search-text">Display text in the search box:</label></th> 
95
							<td><input type="text" name="search-text" id="search-text" class="regular-text" value="<?php echo $search_text; ?>"/></td> 
96
						</tr> 
97
						<tr> 
98
							<th scope="row" valign="top"><label for="focus">Display text in drop-down selection:</label></th> 
99
							<td><input type="text" name="focus" id="focus" class="regular-text" value="<?php echo $focus; ?>"/></td> 
100
						</tr> 
101
						<tr> 
102
							<th scope="row" valign="top"><label for="hide-empty">Hide categories with no posts?</label></th> 
103
							<td><input type="checkbox" name="hide-empty" id="hide-empty" value="1" <?php if ($hide_empty == '1') echo 'checked="checked"'; ?> /></td> 
104
						</tr> 
105
						<tr> 
106
							<th scope="row" valign="top"><label for="exclude-child">Exclude Child categories from list?</label></th> 
107
							<td><input type="checkbox" name="exclude-child" id="exclude-child" value="1" <?php if ($exclude_child == '1') echo 'checked="checked"'; ?> /></td> 
108
						</tr> 
109
						<tr> 
110
							<th scope="row" valign="top"><label for="sbc-style">Use the SBC Form styling?</label></th> 
111
							<td><input type="checkbox" name="sbc-style" id="sbc-style" value="1" <?php if ($sbc_style == '1') echo 'checked="checked"'; ?> /> <em>* Styling doesn't display correctly in IE7 and earlier *</em></td> 
112
						</tr> 
113
						<tr> 
114
							<th scope="row" valign="top"><label for="focus">Categories to exclude:</label></th> 
115
							<td><ul><?php wp_category_checklist(0,0,$raw_excluded_cats); ?></ul></td> 
116
						</tr> 
117
					</table> 
118
					<br/> 
119
					<span class="submit" style="border: 0;"><input type="submit" name="submit" value="Save Settings" /></span> 
120
				</form> 
121
			</div> 
122
		<?php 
123
		} // Config page 

124
	} // Class 

125
} // If class exists 

126
 
127
// insert into admin panel 

128
add_action('admin_menu', array('SBC_Admin','add_config_page')); 
129
 
130
?>

Membuat Form

Kini setelah kita menyelesaikan semua back end dan siap untuk dikerahkan, saatnya untuk mulai menulis form front-end yang akan dilihat dan digunakan oleh semua pengunjung. Agar pengguna kita dapat menempatkan form kita di manapun di situsnya yang dia inginkan, kita akan membungkus form kita dalam fungsi baru yang berjudul "sbc()" yang ditempatkan tepat di luar deklarasi kelas kita. Byte pertama dari kode yang perlu kita tambahkan adalah menyatakan sebuah global $wp_query dan $post sehingga kita dapat memiliki akses ke fungsi tersebut jika kita menginginkannya nanti, namun untuk tujuan kita, kita tidak membutuhkannya. Langkah selanjutnya adalah untuk mendapatkan kembali nilai variabel kita dari database.

1
 
2
// Base function 

3
function sbc() { 
4
 
5
	$focus					= get_option("sbc-focus"); 
6
	$hide_empty				= get_option("sbc-hide-empty"); 
7
	$excluded_cats			= get_option("sbc-excluded-cats"); 
8
	$search_text			= get_option("sbc-search-text"); 
9
	$exclude_child			= get_option("sbc-exclude-child"); 
10
 
11
}

Setelah kita melakukannya, kita dapat membuat variabel lain yang disebut "$list" dengan nilainya menjadi fungsi WP wp_dropdown_categories($settings) (baca lebih lanjut tentang fungsi ini di sini). Variabel "$settings" adalah tempat sebagian besar penyesuaian kita diterapkan.

1
 
2
$settings = array('show_option_all' => $focus, 
3
					'show_option_none' => '', 
4
					'orderby' => 'name', 
5
					'order' => 'ASC', 
6
					'show_last_update' => 0, 
7
					'show_count' => 0, 
8
					'hide_empty' => $hide_empty, 
9
					'child_of' => 0, 
10
					'exclude' => "'".$excluded_cats."'", 
11
					'echo' => 0, 
12
					'selected' => 0, 
13
					'hierarchical' => 1, 
14
					'name' => 'cat', 
15
					'class' => 'postform', 
16
					'depth' => $exclude_child); 
17
$list = wp_dropdown_categories($settings);

Sekarang dropdown form sudah dikonfigurasi, kita bisa membuat variabel lain, "$form" yang akan menyimpan HTML form kita melalui hypertext preprocessor. kemudian kita akan meng-echo variabel $form baru kita.

1
 
2
$blog_url = get_bloginfo("url"); 
3
 
4
$form = <<< EOH 
5
<div id="sbc"> 
6
	<form method="get" id="sbc-search" action="{$blog_url}"> 
7
		<input type="text" value="{$search_text}" name="s" id="s" onblur="if (this.value == '') {this.value = '{$search_text}';}"  onfocus="if (this.value == '{$search_text}') {this.value = '';}" /> 
8
		{$list} 
9
		<input type="submit" id="sbc-submit" value="Search" /> 
10
	</form> 
11
</div> 
12
EOH; 
13
 
14
echo $form;

Menambahkan Styling Kustom

Sebelumnya kita memberikan pengguna sebuah pilihan untuk menggunakan styling kustom kita untuk form ini. Jika mereka membiarkan opsi ini diaktifkan di menu pengaturan, kita perlu menambahkan stylesheet ke header. Cara termudah untuk melakukannya adalah dengan membuat pernyataan if baru yang memeriksa variabel "$sbc_style" kita menjadi true (dalam kode kita: 1). Di dalam pemeriksaan itu, kita akan menambahkan fungsi baru "style_insert()" yang meng-echo URL ke stylesheet kita. Juga di dalam if (tapi di luar fungsinya), kita akan menulis dalam tindakan baru untuk "wp_head" untuk menambahkan ke fungsi "style_insert()" kita.

1
 
2
if($sbc_style == '1'){ 
3
	// Add our styling 

4
	function style_insert() { 
5
		$current_path = get_option('siteurl') . '/wp-content/plugins/' . basename(dirname(__FILE__)); 
6
		?> 
7
		<link href="<?php echo $current_path; ?>/sbc-style.css" type="text/css" rel="stylesheet" /> 
8
		<?php 
9
	} 
10
 
11
	// insert custom stylesheet 

12
	add_action('wp_head','style_insert'); 
13
}

Sedangkan untuk styling kita, buat file baru bernama sbc-style.css isilah dengan:

1
 
2
form#sbc-search {clear: both;} 
3
form#sbc-search * {margin: 0px;} 
4
 
5
form#sbc-search input#s {background: #f5f5f5; 
6
						border: 1px solid #bbbbbb; 
7
						padding: 4px 10px; 
8
						width: 80%; 
9
						margin-bottom: 10px;} 
10
 
11
form#sbc-search select#cat {display: block; 
12
							background: #fbfbfb; 
13
							height: 30px; 
14
							width: 63%; 
15
							border: 1px solid #bbbbbb; 
16
							float: left; 
17
							padding: 4px 20px; 
18
							border-right: none; 
19
							-khtml-appearance: none; /* fix default safai styling */ 
20
							border-radius: 15px 0px 0px 15px; 
21
							-webkit-border-bottom-left-radius: 15px; 
22
							-webkit-border-top-left-radius: 15px; 
23
							-moz-border-radius: 15px 0px 0px 15px;} 
24
 
25
form#sbc-search select#cat option {padding: 2px 4px;} 
26
 
27
form#sbc-search input#sbc-submit {display: block; 
28
									height: 30px; 
29
									width: 37%; 
30
									border: 1px solid #bbbbbb; f 
31
									loat: right; 
32
									border-radius: 0px 15px 15px 0px; 
33
									-webkit-border-bottom-right-radius: 15px; 
34
									-webkit-border-top-right-radius: 15px; 
35
									-moz-border-radius: 0px 15px 15px 0px;}

Di Safari Anda akan melihat bahwa segitiga standar di bawah hilang dari kotak dropdown kita, ini karena kita menggunakan -khtml-appearance: none di dropdown untuk menghentikan safari dari memaksakan tema "snow" kepadanya. cara untuk memperbaikinya adalah dengan menggunakan karakter HTML untuk mensimulasikan segitiga, dan kebetulan ada yang sangat mirip yang disebut "∇  Nabla". Kita akan menggunakan kombinasi spasi, non-breaking-spaces, dan nabla ini dalam pengaturan drop-down untuk memperbaiki masalah ini.

1
 
2
$settings = array('show_option_all' => $focus.'       ∇', 
3
						'show_option_none' => '', 
4
						'orderby' => 'name', 
5
						'order' => 'ASC', 
6
						'show_last_update' => 0, 
7
						'show_count' => 0, 
8
						'hide_empty' => $hide_empty, 
9
						'child_of' => 0, 
10
						'exclude' => "'".$excluded_cats."'", 
11
						'echo' => 0, 
12
						'selected' => 0, 
13
						'hierarchical' => 1, 
14
						'name' => 'cat', 
15
						'class' => 'postform', 
16
						'depth' => $exclude_child);


Mengembalikan Hasil Pencarian

Begitu form kita siap, kita akhirnya bisa mulai mendapatkan hasil pencarian yang ingin kita berikan kepada pengunjung kita. Untuk memulai, kita akan membuat fungsi baru yang disebut return_only_selected_category(), dimana kita akan membuat pernyataan if baru yang memeriksa bahwa tombol submit pencarian kita telah ditetapkan. Di dalamnya kita perlu menciptakan $wp_query global baru. Selanjutnya kita akan mengambil pengembalian kategori yang dipilih dan memasukkannya ke dalam variabel yang disebut $desired_cat. Jika pengguna memilih opsi untuk semua kategori, kita perlu menjalankan pemeriksaan untuk nilai "*" dan mengatur ulang ke "".

1
 
2
// Get results only from selected category 

3
function return_only_selected_category() { 
4
	if (isset($_POST['sbc-submit'])){ 
5
		global $wp_query; 
6
 
7
		$desired_cat = $_POST['cat']; 
8
		if ($desired_cat == '*') $desired_cat = ''; 
9
	} 
10
}

Sekarang kita perlu membuat variabel lain, $excluded, yang nilainya adalah fungsi WP get_categories(). Kita akan menambahkan 2 argumen untuk fungsi ini. Pertama adalah "hide_empty=false" agar semua kategori dimasukkan ke dalam daftar, dan yang kedua adalah "exclude={$desired_cat}" sehingga setiap kategori yang kategori pengguna ingin melihat posting darinya dihapus dari daftar.

1
 
2
$excluded = get_categories('hide_empty=false&exclude={$desired_cat}');

Setelah variabel itu ditetapkan, akhirnya kita bisa membuatnya sehingga hanya posting dari kategori yang dipilih akan muncul di hasilnya. Untuk efek ini, kita akan mengubah Query Vars agar Wordpress menghapus posting dari setiap kategori yang kita cantumkan (dan kebetulan saja kita memiliki variabel yang penuh dengan kategori untuk dikecualikan).

1
 
2
$wp_query->query_vars['cat'] = '-' . $excluded;

Dengan menambahkan tanda hubung di depan daftar kategori, kita memberi tahu Wordpress untuk menghapusnya dari kueri. Metode yang sangat efektif untuk kita. Sekarang satu-satunya yang tersisa untuk dilakukan adalah menambahkan filter WP baru untuk "pre_get_posts" menambahkan fungsi baru kita.

1
 
2
// Highjack the search 

3
add_filter('pre_get_posts', 'return_only_selected_category');

Cara Memasukkan Form Kita

1
 
2
<?php if(function_exists('sbc')){ 
3
				sbc(); 
4
			} else { ?> 
5
				...your standard form code here... 
6
			<?php } ?>

Kode Akhir Kita

1
 
2
<?php 
3
/* 

4
Plugin Name: Search By Category 

5
Plugin URI: http://fire-studios.com/blog/search-by-category/ 

6
Description: Reconfigures search results to display results based on category of posts. 

7
Version: 1.1 

8
Author: Fire G 

9
Author URI: http://fire-studios.com/blog/ 

10
*/ 
11
 
12
/* 

13
Change log 

14
 

15
1.1 

16
 - Added security fixes 

17
 - Removed some excess code 

18
 

19
1.0.0 

20
 - Default text 

21
 - Custom styling 

22
 

23
Beta 3 

24
 - Search Text 

25
 - Exclude Child categories 

26
 - search box auto empties and refills if nothing entered 

27
 

28
Beta 2 

29
 - First complete working version 

30
 - Hide Empty 

31
 - Focus 

32
 - Exclude Categories 

33
 

34
Beta 1 

35
 - First working version 

36
 - Category exclustion from drop-down list isn't functional 

37
 

38
Alpha 1 

39
 - All functions are present but independent 

40
 

41
*/ 
42
 
43
// Some Defaults 

44
$focus					= 'In All Categories'; 
45
$hide_empty				= '1'; // 1 means true 

46
$excluded_cats			= array(); 
47
$search_text			= 'Search For...'; 
48
$exclude_child			= '0'; // 0 means false 

49
$raw_excluded_cats		= array(); 
50
$sbc_style				= '1'; 
51
 
52
// Put our defaults in the "wp-options" table 

53
add_option("sbc-focus", $focus); 
54
add_option("sbc-hide-empty", $hide_empty); 
55
add_option("sbc-excluded-cats", $excluded_cats); 
56
add_option("sbc-search-text", $search_text); 
57
add_option("sbc-selected-excluded", $raw_excluded_cats); 
58
add_option("sbc-exclude-child", $exclude_child); 
59
add_option("sbc-style", $sbc_style); 
60
 
61
// Start the plugin 

62
if ( ! class_exists( 'SBC_Admin' ) ) { 
63
 
64
	class SBC_Admin { 
65
 
66
		// prep options page insertion 

67
		function add_config_page() { 
68
			if ( function_exists('add_submenu_page') ) { 
69
				add_options_page('Search By Category Options', 'Search By Category', 10, basename(__FILE__), array('SBC_Admin','config_page')); 
70
			} 
71
		} 
72
 
73
		// Options/Settings page in WP-Admin 

74
		function config_page() { 
75
			if ( isset($_POST['submit']) ) { 
76
				$nonce = $_REQUEST['_wpnonce']; 
77
				if (! wp_verify_nonce($nonce, 'sbc-updatesettings') ) die('Security check failed'); 
78
				if (!current_user_can('manage_options')) die(__('You cannot edit the search-by-category options.')); 
79
				check_admin_referer('sbc-updatesettings'); 
80
 
81
				// Get our new option values 

82
				$focus					= $_POST['focus']; 
83
				$hide_empty				= $_POST['hide-empty']; 
84
				$search_text			= $_POST['search-text']; 
85
				$exclude_child			= $_POST['exclude-child']; 
86
				$sbc_style				= $_POST['sbc-style']; 
87
 
88
				if(isset($_POST['post_category'])){ 
89
					$raw_excluded_cats 		= $_POST['post_category']; 
90
 
91
					// Fix our excluded category return values 

92
					$fix					= $raw_excluded_cats; 
93
					array_unshift($fix, "1"); 
94
					$excluded_cats			= implode(',',$fix); 
95
				} 
96
 
97
				// Make sure "$hide_empty" & "$exclude_child" are set right 

98
				if (empty($hide_empty)) $hide_empty = '0'; // 0 means false 

99
				if (empty($exclude_child)) $exclude_child = '0'; // 0 means false 

100
				if (empty($sbc_style)) $sbc_style = '0'; // 0 means false  

101
 
102
				// Update the DB with the new option values 

103
				update_option("sbc-focus", mysql_real_escape_string($focus)); 
104
				update_option("sbc-hide-empty", mysql_real_escape_string($hide_empty)); 
105
				update_option("sbc-selected-excluded", mysql_real_escape_string($raw_excluded_cats)); 
106
				update_option("sbc-excluded-cats", mysql_real_escape_string($excluded_cats)); 
107
				update_option("sbc-search-text", mysql_real_escape_string($search_text)); 
108
				update_option("sbc-exclude-child", mysql_real_escape_string($exclude_child)); 
109
				update_option("sbc-style", mysql_real_escape_string($sbc_style)); 
110
			} 
111
 
112
			$focus					= get_option("sbc-focus"); 
113
			$hide_empty				= get_option("sbc-hide-empty"); 
114
			$search_text			= get_option("sbc-search-text"); 
115
			$excluded_cats			= get_option("sbc-excluded-cats"); 
116
			$exclude_child			= get_option("sbc-exclude-child"); 
117
			$raw_excluded_cats 		= get_option("sbc-selected-excluded"); // For Admin Checklist 

118
			$sbc_style				= get_option("sbc-style"); 
119
 
120
			?> 
121
			<div class="wrap"> 
122
				<hr /><h2>Seach By Category Options</h2> 
123
				<form action="" method="post" id="sbc-config"> 
124
					<table class="form-table"> 
125
						<?php if (function_exists('wp_nonce_field')) { wp_nonce_field('sbc-updatesettings'); } ?> 
126
						<tr> 
127
							<th scope="row" valign="top"><label for="search-text">Display text in the search box:</label></th> 
128
							<td><input type="text" name="search-text" id="search-text" class="regular-text" value="<?php echo $search_text; ?>"/></td> 
129
						</tr> 
130
						<tr> 
131
							<th scope="row" valign="top"><label for="focus">Display text in drop-down selection:</label></th> 
132
							<td><input type="text" name="focus" id="focus" class="regular-text" value="<?php echo $focus; ?>"/></td> 
133
						</tr> 
134
						<tr> 
135
							<th scope="row" valign="top"><label for="hide-empty">Hide categories with no posts?</label></th> 
136
							<td><input type="checkbox" name="hide-empty" id="hide-empty" value="1" <?php if ($hide_empty == '1') echo 'checked="checked"'; ?> /></td> 
137
						</tr> 
138
						<tr> 
139
							<th scope="row" valign="top"><label for="exclude-child">Exclude Child categories from list?</label></th> 
140
							<td><input type="checkbox" name="exclude-child" id="exclude-child" value="1" <?php if ($exclude_child == '1') echo 'checked="checked"'; ?> /></td> 
141
						</tr> 
142
						<tr> 
143
							<th scope="row" valign="top"><label for="sbc-style">Use the SBC Form styling?</label></th> 
144
							<td><input type="checkbox" name="sbc-style" id="sbc-style" value="1" <?php if ($sbc_style == '1') echo 'checked="checked"'; ?> /> <em>* Styling doesn't display correctly in IE7 and earlier *</em></td> 
145
						</tr> 
146
						<tr> 
147
							<th scope="row" valign="top"><label for="focus">Categories to exclude:</label></th> 
148
							<td><ul><?php wp_category_checklist(0,0,$raw_excluded_cats); ?></ul></td> 
149
						</tr> 
150
					</table> 
151
					<br/> 
152
					<span class="submit" style="border: 0;"><input type="submit" name="submit" value="Save Settings" /></span> 
153
				</form> 
154
			</div> 
155
<?php		} 
156
	} 
157
} 
158
 
159
// Base function 

160
function sbc() { 
161
	$focus					= get_option("sbc-focus"); 
162
	$hide_empty				= get_option("sbc-hide-empty"); 
163
	$excluded_cats			= get_option("sbc-excluded-cats"); 
164
	$search_text			= get_option("sbc-search-text"); 
165
	$exclude_child			= get_option("sbc-exclude-child"); 
166
 
167
	$settings = array('show_option_all' => $focus.'       ∇', 
168
						'show_option_none' => '', 
169
						'orderby' => 'name', 
170
						'order' => 'ASC', 
171
						'show_last_update' => 0, 
172
						'show_count' => 0, 
173
						'hide_empty' => $hide_empty, 
174
						'child_of' => 0, 
175
						'exclude' => "'".$excluded_cats."'", 
176
						'echo' => 0, 
177
						'selected' => 0, 
178
						'hierarchical' => 1, 
179
						'name' => 'cat', 
180
						'class' => 'postform', 
181
						'depth' => $exclude_child); 
182
	$list = wp_dropdown_categories($settings);  
183
 
184
	$blog_url = get_bloginfo("url"); 
185
 
186
	$form = <<< EOH 
187
	<div id="sbc"> 
188
		<form method="get" id="sbc-search" action="{$blog_url}"> 
189
			<input type="text" value="{$search_text}" name="s" id="s" onblur="if (this.value == '') {this.value = '{$search_text}';}"  onfocus="if (this.value == '{$search_text}') {this.value = '';}" /> 
190
			{$list} 
191
			<input type="submit" id="sbc-submit" value="Search" /> 
192
		</form> 
193
	</div> 
194
EOH; 
195
 
196
	echo $form; 
197
} 
198
 
199
// Get results only from selected category 

200
function return_only_selected_category() { 
201
	if (isset($_POST['sbc-submit'])){ 
202
		global $wp_query; 
203
 
204
		$desired_cat = $_POST['cat']; 
205
		if ($desired_cat == '*') $desired_cat = ''; 
206
 
207
		$excluded = get_categories('hide_empty=false&exclude={$desired_cat}'); 
208
 
209
		$wp_query->query_vars['cat'] = '-' . $excluded; 
210
	} 
211
} 
212
 
213
if($sbc_style == '1'){ 
214
	// Add our styling 

215
	function style_insert() { 
216
		$current_path = get_option('siteurl').'/wp-content/plugins/'.basename(dirname(__FILE__)); 
217
 
218
		echo '<link href="'.$current_path.'/sbc-style.css" type="text/css" rel="stylesheet" />'; 
219
	} 
220
 
221
	// insert custom stylesheet 

222
	add_action('wp_head','style_insert'); 
223
} 
224
 
225
// Highjack the search 

226
add_filter('pre_get_posts', 'return_only_selected_category'); 
227
 
228
// insert into admin panel 

229
add_action('admin_menu', array('SBC_Admin','add_config_page')); 
230
?>