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:
- Konfigurasi ulang pencarian berdasarkan kategori yang dipilih
- Daftar drop-down kategori
- Kemampuan untuk menyembunyikan kategori tanpa posting dari daftar
- Kemampuan untuk mengecualikan kategori anak dari daftar
- Opsi untuk menonaktifkan styling bawaan kita
- Kemampuan untuk mengecualikan kategori tertentu dari daftar
- Kemampuan untuk menggunakan nilai kustom di kotak pencarian
- 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.
<?php /* Plugin Name: Search By Category Tutorial Plugin URI: https://fire-studios.com/blog/search-by-category/ Description: Reconfigures search results to display results based on category of posts. Version: 1.0.0 Author: Fire G Author URI: http://fire-studios.com/blog/ */ ?>



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.
if ( ! class_exists( 'SBC_Admin' ) ) { class SBC_Admin { } }
Kedua kita menjalankan fungsi untuk membuat halaman config.
// prep options page insertion function add_config_page() { if ( function_exists('add_submenu_page') ) { add_options_page('Search By Category Options', 'Search By Category', 10, basename(__FILE__), array('SBC_Admin','config_page')); } }
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.
<div class="wrap"> <hr /><h2>Seach By Category Options</h2> <form action="" method="post" id="sbc-config"> <table class="form-table"> <?php if (function_exists('wp_nonce_field')) { wp_nonce_field('sbc-updatesettings'); } ?> <tr> <th scope="row" valign="top"><label for="search-text">Display text in the search box:</label></th> <td><input type="text" name="search-text" id="search-text" class="regular-text" value="<?php echo $search_text; ?>"/></td> </tr> <tr> <th scope="row" valign="top"><label for="focus">Display text in drop-down selection:</label></th> <td><input type="text" name="focus" id="focus" class="regular-text" value="<?php echo $focus; ?>"/></td> </tr> <tr> <th scope="row" valign="top"><label for="hide-empty">Hide categories with no posts?</label></th> <td><input type="checkbox" name="hide-empty" id="hide-empty" value="1" <?php if ($hide_empty == '1') echo 'checked="checked"'; ?> /></td> </tr> <tr> <th scope="row" valign="top"><label for="exclude-child">Exclude Child categories from list?</label></th> <td><input type="checkbox" name="exclude-child" id="exclude-child" value="1" <?php if ($exclude_child == '1') echo 'checked="checked"'; ?> /></td> </tr> <tr> <th scope="row" valign="top"><label for="sbc-style">Use the SBC Form styling?</label></th> <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> </tr> <tr> <th scope="row" valign="top"><label for="focus">Categories to exclude:</label></th> <td><ul><?php wp_category_checklist(0,0,$raw_excluded_cats); ?></ul></td> </tr> </table> <br/> <span class="submit" style="border: 0;"><input type="submit" name="submit" value="Save Settings" /></span> </form> </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
// Some Defaults $focus = 'In All Categories'; $hide_empty = '1'; // 1 means true $excluded_cats = array(); $search_text = 'Search For...'; $exclude_child = '0'; // 0 means false $raw_excluded_cats = array(); $sbc_style = '1'; // Put our defaults in the "wp-options" table add_option("sbc-focus", $focus); add_option("sbc-hide-empty", $hide_empty); add_option("sbc-excluded-cats", $excluded_cats); add_option("sbc-search-text", $search_text); add_option("sbc-selected-excluded", $raw_excluded_cats); add_option("sbc-exclude-child", $exclude_child); 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.
function config_page(){ $focus = get_option("sbc-focus"); $hide_empty = get_option("sbc-hide-empty"); $search_text = get_option("sbc-search-text"); $excluded_cats = get_option("sbc-excluded-cats"); $exclude_child = get_option("sbc-exclude-child"); $raw_excluded_cats = get_option("sbc-selected-excluded"); // For Checklist $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.
if ( isset($_POST['submit']) ) { $nonce = $_REQUEST['_wpnonce']; if (! wp_verify_nonce($nonce, 'sbc-updatesettings') ) die('Security check failed'); if (!current_user_can('manage_options')) die(__('You cannot edit the search-by-category options.')); check_admin_referer('sbc-updatesettings'); }
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.
// Get our new option values $focus = $_POST['focus']; $hide_empty = $_POST['hide-empty']; $search_text = $_POST['search-text']; $exclude_child = $_POST['exclude-child']; $sbc_style = $_POST['sbc-style']; if(isset($_POST['post_category'])){ $raw_excluded_cats = $_POST['post_category']; // Fix our excluded category return values $fix = $raw_excluded_cats; array_unshift($fix, "1"); $excluded_cats = implode(',',$fix); }
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).
// Make sure "$hide_empty" & "$exclude_child" are set right if (empty($hide_empty)) $hide_empty = '0'; // 0 means false if (empty($exclude_child)) $exclude_child = '0'; // 0 means false 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.
// Update the DB with the new option values update_option("sbc-focus", mysql_real_escape_string($focus)); update_option("sbc-hide-empty", mysql_real_escape_string($hide_empty)); update_option("sbc-selected-excluded", mysql_real_escape_string($raw_excluded_cats)); update_option("sbc-excluded-cats", mysql_real_escape_string($excluded_cats)); update_option("sbc-search-text", mysql_real_escape_string($search_text)); update_option("sbc-exclude-child", mysql_real_escape_string($exclude_child)); update_option("sbc-style", mysql_real_escape_string($sbc_style));
Kode kita sejauh ini:
<?php /* Plugin Name: Search By Category Tutorial Plugin URI: http://fire-studios.com/blog/search-by-category/ Description: Reconfigures search results to display results based on category of posts. Version: 1.0.0 Author: Fire G Author URI: http://fire-studios.com/blog/ */ // Some Defaults $focus = 'In All Categories'; $hide_empty = '1'; // 1 means true $excluded_cats = array(); $search_text = 'Search For...'; $exclude_child = '0'; // 0 means false $raw_excluded_cats = array(); $sbc_style = '1'; // Put our defaults in the "wp-options" table add_option("sbc-focus", $focus); add_option("sbc-hide-empty", $hide_empty); add_option("sbc-excluded-cats", $excluded_cats); add_option("sbc-search-text", $search_text); add_option("sbc-selected-excluded", $raw_excluded_cats); add_option("sbc-exclude-child", $exclude_child); add_option("sbc-style", $sbc_style); if ( ! class_exists( 'SBC_Admin' ) ) { class SBC_Admin { // prep options page insertion function add_config_page() { if ( function_exists('add_submenu_page') ) { add_options_page('Search By Category Options', 'Search By Category', 10, basename(__FILE__), array('SBC_Admin','config_page')); } } function config_page() { if ( isset($_POST['submit']) ) { $nonce = $_REQUEST['_wpnonce']; if (! wp_verify_nonce($nonce, 'sbc-updatesettings') ) die('Security check failed'); if (!current_user_can('manage_options')) die(__('You cannot edit the search-by-category options.')); check_admin_referer('sbc-updatesettings'); // Get our new option values $focus = $_POST['focus']; $hide_empty = $_POST['hide-empty']; $search_text = $_POST['search-text']; $exclude_child = $_POST['exclude-child']; $sbc_style = $_POST['sbc-style']; if(isset($_POST['post_category'])){ $raw_excluded_cats = $_POST['post_category']; // Fix our excluded category return values $fix = $raw_excluded_cats; array_unshift($fix, "1"); $excluded_cats = implode(',',$fix); } // Make sure "$hide_empty" & "$exclude_child" are set right if (empty($hide_empty)) $hide_empty = '0'; // 0 means false if (empty($exclude_child)) $exclude_child = '0'; // 0 means false if (empty($sbc_style)) $sbc_style = '0'; // 0 means false // Update the DB with the new option values update_option("sbc-focus", mysql_real_escape_string($focus)); update_option("sbc-hide-empty", mysql_real_escape_string($hide_empty)); update_option("sbc-selected-excluded", mysql_real_escape_string($raw_excluded_cats)); update_option("sbc-excluded-cats", mysql_real_escape_string($excluded_cats)); update_option("sbc-search-text", mysql_real_escape_string($search_text)); update_option("sbc-exclude-child", mysql_real_escape_string($exclude_child)); update_option("sbc-style", mysql_real_escape_string($sbc_style)); } $focus = get_option("sbc-focus"); $hide_empty = get_option("sbc-hide-empty"); $search_text = get_option("sbc-search-text"); $excluded_cats = get_option("sbc-excluded-cats"); $exclude_child = get_option("sbc-exclude-child"); $raw_excluded_cats = get_option("sbc-selected-excluded"); // For Admin Checklist $sbc_style = get_option("sbc-style"); ?> <div class="wrap"> <hr /><h2>Seach By Category Options</h2> <form action="" method="post" id="sbc-config"> <table class="form-table"> <?php if (function_exists('wp_nonce_field')) { wp_nonce_field('sbc-updatesettings'); } ?> <tr> <th scope="row" valign="top"><label for="search-text">Display text in the search box:</label></th> <td><input type="text" name="search-text" id="search-text" class="regular-text" value="<?php echo $search_text; ?>"/></td> </tr> <tr> <th scope="row" valign="top"><label for="focus">Display text in drop-down selection:</label></th> <td><input type="text" name="focus" id="focus" class="regular-text" value="<?php echo $focus; ?>"/></td> </tr> <tr> <th scope="row" valign="top"><label for="hide-empty">Hide categories with no posts?</label></th> <td><input type="checkbox" name="hide-empty" id="hide-empty" value="1" <?php if ($hide_empty == '1') echo 'checked="checked"'; ?> /></td> </tr> <tr> <th scope="row" valign="top"><label for="exclude-child">Exclude Child categories from list?</label></th> <td><input type="checkbox" name="exclude-child" id="exclude-child" value="1" <?php if ($exclude_child == '1') echo 'checked="checked"'; ?> /></td> </tr> <tr> <th scope="row" valign="top"><label for="sbc-style">Use the SBC Form styling?</label></th> <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> </tr> <tr> <th scope="row" valign="top"><label for="focus">Categories to exclude:</label></th> <td><ul><?php wp_category_checklist(0,0,$raw_excluded_cats); ?></ul></td> </tr> </table> <br/> <span class="submit" style="border: 0;"><input type="submit" name="submit" value="Save Settings" /></span> </form> </div> <?php } // Config page } // Class } // If class exists // insert into admin panel add_action('admin_menu', array('SBC_Admin','add_config_page')); ?>
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.
// Base function function sbc() { $focus = get_option("sbc-focus"); $hide_empty = get_option("sbc-hide-empty"); $excluded_cats = get_option("sbc-excluded-cats"); $search_text = get_option("sbc-search-text"); $exclude_child = get_option("sbc-exclude-child"); }
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.
$settings = array('show_option_all' => $focus, 'show_option_none' => '', 'orderby' => 'name', 'order' => 'ASC', 'show_last_update' => 0, 'show_count' => 0, 'hide_empty' => $hide_empty, 'child_of' => 0, 'exclude' => "'".$excluded_cats."'", 'echo' => 0, 'selected' => 0, 'hierarchical' => 1, 'name' => 'cat', 'class' => 'postform', 'depth' => $exclude_child); $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.
$blog_url = get_bloginfo("url"); $form = <<< EOH <div id="sbc"> <form method="get" id="sbc-search" action="{$blog_url}"> <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 = '';}" /> {$list} <input type="submit" id="sbc-submit" value="Search" /> </form> </div> EOH; 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.
if($sbc_style == '1'){ // Add our styling function style_insert() { $current_path = get_option('siteurl') . '/wp-content/plugins/' . basename(dirname(__FILE__)); ?> <link href="<?php echo $current_path; ?>/sbc-style.css" type="text/css" rel="stylesheet" /> <?php } // insert custom stylesheet add_action('wp_head','style_insert'); }
Sedangkan untuk styling kita, buat file baru bernama sbc-style.css isilah dengan:
form#sbc-search {clear: both;} form#sbc-search * {margin: 0px;} form#sbc-search input#s {background: #f5f5f5; border: 1px solid #bbbbbb; padding: 4px 10px; width: 80%; margin-bottom: 10px;} form#sbc-search select#cat {display: block; background: #fbfbfb; height: 30px; width: 63%; border: 1px solid #bbbbbb; float: left; padding: 4px 20px; border-right: none; -khtml-appearance: none; /* fix default safai styling */ border-radius: 15px 0px 0px 15px; -webkit-border-bottom-left-radius: 15px; -webkit-border-top-left-radius: 15px; -moz-border-radius: 15px 0px 0px 15px;} form#sbc-search select#cat option {padding: 2px 4px;} form#sbc-search input#sbc-submit {display: block; height: 30px; width: 37%; border: 1px solid #bbbbbb; f loat: right; border-radius: 0px 15px 15px 0px; -webkit-border-bottom-right-radius: 15px; -webkit-border-top-right-radius: 15px; -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.
$settings = array('show_option_all' => $focus.' ∇', 'show_option_none' => '', 'orderby' => 'name', 'order' => 'ASC', 'show_last_update' => 0, 'show_count' => 0, 'hide_empty' => $hide_empty, 'child_of' => 0, 'exclude' => "'".$excluded_cats."'", 'echo' => 0, 'selected' => 0, 'hierarchical' => 1, 'name' => 'cat', 'class' => 'postform', '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 "".
// Get results only from selected category function return_only_selected_category() { if (isset($_POST['sbc-submit'])){ global $wp_query; $desired_cat = $_POST['cat']; if ($desired_cat == '*') $desired_cat = ''; } }
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.
$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).
$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.
// Highjack the search add_filter('pre_get_posts', 'return_only_selected_category');
Cara Memasukkan Form Kita
<?php if(function_exists('sbc')){ sbc(); } else { ?> ...your standard form code here... <?php } ?>
Kode Akhir Kita
<?php /* Plugin Name: Search By Category Plugin URI: http://fire-studios.com/blog/search-by-category/ Description: Reconfigures search results to display results based on category of posts. Version: 1.1 Author: Fire G Author URI: http://fire-studios.com/blog/ */ /* Change log 1.1 - Added security fixes - Removed some excess code 1.0.0 - Default text - Custom styling Beta 3 - Search Text - Exclude Child categories - search box auto empties and refills if nothing entered Beta 2 - First complete working version - Hide Empty - Focus - Exclude Categories Beta 1 - First working version - Category exclustion from drop-down list isn't functional Alpha 1 - All functions are present but independent */ // Some Defaults $focus = 'In All Categories'; $hide_empty = '1'; // 1 means true $excluded_cats = array(); $search_text = 'Search For...'; $exclude_child = '0'; // 0 means false $raw_excluded_cats = array(); $sbc_style = '1'; // Put our defaults in the "wp-options" table add_option("sbc-focus", $focus); add_option("sbc-hide-empty", $hide_empty); add_option("sbc-excluded-cats", $excluded_cats); add_option("sbc-search-text", $search_text); add_option("sbc-selected-excluded", $raw_excluded_cats); add_option("sbc-exclude-child", $exclude_child); add_option("sbc-style", $sbc_style); // Start the plugin if ( ! class_exists( 'SBC_Admin' ) ) { class SBC_Admin { // prep options page insertion function add_config_page() { if ( function_exists('add_submenu_page') ) { add_options_page('Search By Category Options', 'Search By Category', 10, basename(__FILE__), array('SBC_Admin','config_page')); } } // Options/Settings page in WP-Admin function config_page() { if ( isset($_POST['submit']) ) { $nonce = $_REQUEST['_wpnonce']; if (! wp_verify_nonce($nonce, 'sbc-updatesettings') ) die('Security check failed'); if (!current_user_can('manage_options')) die(__('You cannot edit the search-by-category options.')); check_admin_referer('sbc-updatesettings'); // Get our new option values $focus = $_POST['focus']; $hide_empty = $_POST['hide-empty']; $search_text = $_POST['search-text']; $exclude_child = $_POST['exclude-child']; $sbc_style = $_POST['sbc-style']; if(isset($_POST['post_category'])){ $raw_excluded_cats = $_POST['post_category']; // Fix our excluded category return values $fix = $raw_excluded_cats; array_unshift($fix, "1"); $excluded_cats = implode(',',$fix); } // Make sure "$hide_empty" & "$exclude_child" are set right if (empty($hide_empty)) $hide_empty = '0'; // 0 means false if (empty($exclude_child)) $exclude_child = '0'; // 0 means false if (empty($sbc_style)) $sbc_style = '0'; // 0 means false // Update the DB with the new option values update_option("sbc-focus", mysql_real_escape_string($focus)); update_option("sbc-hide-empty", mysql_real_escape_string($hide_empty)); update_option("sbc-selected-excluded", mysql_real_escape_string($raw_excluded_cats)); update_option("sbc-excluded-cats", mysql_real_escape_string($excluded_cats)); update_option("sbc-search-text", mysql_real_escape_string($search_text)); update_option("sbc-exclude-child", mysql_real_escape_string($exclude_child)); update_option("sbc-style", mysql_real_escape_string($sbc_style)); } $focus = get_option("sbc-focus"); $hide_empty = get_option("sbc-hide-empty"); $search_text = get_option("sbc-search-text"); $excluded_cats = get_option("sbc-excluded-cats"); $exclude_child = get_option("sbc-exclude-child"); $raw_excluded_cats = get_option("sbc-selected-excluded"); // For Admin Checklist $sbc_style = get_option("sbc-style"); ?> <div class="wrap"> <hr /><h2>Seach By Category Options</h2> <form action="" method="post" id="sbc-config"> <table class="form-table"> <?php if (function_exists('wp_nonce_field')) { wp_nonce_field('sbc-updatesettings'); } ?> <tr> <th scope="row" valign="top"><label for="search-text">Display text in the search box:</label></th> <td><input type="text" name="search-text" id="search-text" class="regular-text" value="<?php echo $search_text; ?>"/></td> </tr> <tr> <th scope="row" valign="top"><label for="focus">Display text in drop-down selection:</label></th> <td><input type="text" name="focus" id="focus" class="regular-text" value="<?php echo $focus; ?>"/></td> </tr> <tr> <th scope="row" valign="top"><label for="hide-empty">Hide categories with no posts?</label></th> <td><input type="checkbox" name="hide-empty" id="hide-empty" value="1" <?php if ($hide_empty == '1') echo 'checked="checked"'; ?> /></td> </tr> <tr> <th scope="row" valign="top"><label for="exclude-child">Exclude Child categories from list?</label></th> <td><input type="checkbox" name="exclude-child" id="exclude-child" value="1" <?php if ($exclude_child == '1') echo 'checked="checked"'; ?> /></td> </tr> <tr> <th scope="row" valign="top"><label for="sbc-style">Use the SBC Form styling?</label></th> <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> </tr> <tr> <th scope="row" valign="top"><label for="focus">Categories to exclude:</label></th> <td><ul><?php wp_category_checklist(0,0,$raw_excluded_cats); ?></ul></td> </tr> </table> <br/> <span class="submit" style="border: 0;"><input type="submit" name="submit" value="Save Settings" /></span> </form> </div> <?php } } } // Base function function sbc() { $focus = get_option("sbc-focus"); $hide_empty = get_option("sbc-hide-empty"); $excluded_cats = get_option("sbc-excluded-cats"); $search_text = get_option("sbc-search-text"); $exclude_child = get_option("sbc-exclude-child"); $settings = array('show_option_all' => $focus.' ∇', 'show_option_none' => '', 'orderby' => 'name', 'order' => 'ASC', 'show_last_update' => 0, 'show_count' => 0, 'hide_empty' => $hide_empty, 'child_of' => 0, 'exclude' => "'".$excluded_cats."'", 'echo' => 0, 'selected' => 0, 'hierarchical' => 1, 'name' => 'cat', 'class' => 'postform', 'depth' => $exclude_child); $list = wp_dropdown_categories($settings); $blog_url = get_bloginfo("url"); $form = <<< EOH <div id="sbc"> <form method="get" id="sbc-search" action="{$blog_url}"> <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 = '';}" /> {$list} <input type="submit" id="sbc-submit" value="Search" /> </form> </div> EOH; echo $form; } // Get results only from selected category function return_only_selected_category() { if (isset($_POST['sbc-submit'])){ global $wp_query; $desired_cat = $_POST['cat']; if ($desired_cat == '*') $desired_cat = ''; $excluded = get_categories('hide_empty=false&exclude={$desired_cat}'); $wp_query->query_vars['cat'] = '-' . $excluded; } } if($sbc_style == '1'){ // Add our styling function style_insert() { $current_path = get_option('siteurl').'/wp-content/plugins/'.basename(dirname(__FILE__)); echo '<link href="'.$current_path.'/sbc-style.css" type="text/css" rel="stylesheet" />'; } // insert custom stylesheet add_action('wp_head','style_insert'); } // Highjack the search add_filter('pre_get_posts', 'return_only_selected_category'); // insert into admin panel add_action('admin_menu', array('SBC_Admin','add_config_page')); ?>
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weekly