Membuat Plugin WordPress: Form Pencarian AJAX Suggestion

membuat-plugin-wordpress-form-pencarian-ajax-suggestion

Membuat plugin WordPress form pencarian autocomplete atau auto suggestion dapat membantu meningkatkan pengalaman pengguna pada situs web Anda. Ini memungkinkan pengguna untuk dengan cepat menemukan konten yang mereka cari tanpa harus mengetikkan kata kunci pencarian yang panjang. Dalam tutorial ini, kita akan menjelaskan bagaimana cara membuat plugin WordPress untuk autocomplete.

Dalam tutorial ini, kita akan membuat plugin form pencarian auto suggestion dengan langkah-langkah sebagai berikut:

Membuat Plugin WordPress form pencarian autocomplete

1. Buat file search-autocomplete.php

Buat Folder ‘search-autocomplete‘ dan letakkan di dalam folder wp-content/plugins WordPress anda. Kemudian buat sebuah file dengan nama search-autocomplete.php. Pada file tersebut masukkan baris-baris kode berikut sebagai header plugin anda.

<?php
/**
 * Search autocomplete
 *
 * @package       SEARCHAUTO
 * @author        Feri Murdeni
 * @version       1.0.0
 *
 * @wordpress-plugin-murdeni
 * Plugin Name:   Search autocomplete
 * Plugin URI:    https://murdeni.com
 * Description:   Search Autocomplete by Murdeni
 * Version:       1.0.0
 * Author:        Feri Murdeni
 * Author URI:    https://murdeni.com
 * Text Domain:   murdeni
 */

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) exit;

Anda dapat mengubah nama autor dan URL sesuai dengan keinginan anda. File ini berfungsi untuk membuat tampilan pada daftar plugin WordPress anda menjadi seperti berikut:

Membuat plugin WordPress form pencarian autocomplete
Tampilan plugin

Itu artinya anda dapat mengaktifkan plugin ini sekarang agar anda dapat melanjutkan pembuatan plugin ini.

2. Buat file assets berupa file JS dan CSS dengan nama app.js dan style.css.

Pada file style.css nantinya akan kita masukkan code CSS yang berfungsi untuk mengatur tampilan form pencarian auto suggest kita nantinya. Sedangkan file JS berfungsi untuk menyimpan perintah-perintah javascript (jQuery) yang berfungsi untuk mengatur tingkah laku dan kerja form pencarian dan auto suggest nya.

3. Mulai menulis kode PHP

Pada file search-autocomplete.php tadi, kita akan membuat Class PHP baru dengan nama Murdeni_SearchAutoComplete, untuk menampung semua fungsi PHP yang akan kita buat. Kenapa kita menggunakan Class PHP? bukankah dapat menulis kodenya langsung dengan function saja?. Nah alasan kita menggunakan Class PHP adalah untuk alasan keamanan dan kemudahan. Alasan keamanan maksudnya agar tidak terjadi conflict antara nama-nama function yang kita buat dengan function-function lain yang berjalan bersama di dalam WordPress. Sehingga kita lebih mudah dalam pemilihan nama function nantinya.

Sedangkan alasan kemudahan maksudnya agar kita lebih mudah dalam mengembangkannya. Mudah dalam pembacaan baris-baris kodenya, serta mudah bagi developer lain atau kita sendiri untuk memahami maksud dari kode-kode yang kita tulis sekarang jika suatu saat nanti kita kembali.

Membuat kerangka CLASS PHP

Baik, kembali pada Class Murdeni_SearchAutoComplete, akan kita tulis kerangka kode seperti berikut:

class Murdeni_SearchAutoComplete{

    public $plugin_name = 'search-autocomplete';
    public $version = '1.0.0';

    function __construct(){}

}

function run_search_autocomplete(){
    new Murdeni_SearchAutoComplete();
}

// Jalankan
run_search_autocomplete();

Pada kerangka Class PHP diatas, kita akan buat sebuah fungsi baru untuk menjalankan file CSS dan JS yang sudah kita buat tadi. Kode fungsi berikut ini merupakan cara untuk mengirim file CSS dan JS kita ke header atau footer halaman website.

Meng-include-kan file CSS dan JS plugin anda ke halaman website

Langkah selanjutnya dalam Membuat plugin WordPress form pencarian autocomplete adalah melampirkan file-file assets seperti CSS dan JS plugin ke dalam halaman website, agar kode yang akan kita tulis dapat berjalan dengan baik. Caranya adalah dengan memanggil fungsi action hook atau add_action ke wp_enqueue_scripts.

function enqueue_scripts(){
		wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ). 'style.css', array(), $this->version );
		wp_register_script( $this->plugin_name, plugin_dir_url( __FILE__ ). 'app.js', array('jquery'), '1.0', true );
		wp_localize_script( $this->plugin_name, 'murdeni', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );	
}

Nah, code ini kita masukkan ke kerangka Class PHP yang ada di dalam file search-autocomplete.php sehingga menjadi

<?php
/**
 * Search autocomplete
 *
 * @package       SEARCHAUTO
 * @author        Feri Murdeni
 * @version       1.0.0
 *
 * @wordpress-plugin-murdeni
 * Plugin Name:   Search autocomplete
 * Plugin URI:    https://murdeni.com
 * Description:   Search Autocomplete by Murdeni
 * Version:       1.0.0
 * Author:        Feri Murdeni
 * Author URI:    https://murdeni.com
 * Text Domain:   murdeni
 */

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) exit;

class Murdeni_SearchAutoComplete{

    public $plugin_name = 'search-autocomplete';
    public $version = '1.0.0';
    
    function __construct(){
        // Hook 
        add_action('wp_enqueue_scripts', array( $this, 'enqueue_scripts'), 100 );
    }

    // Fungsi baru
    public function enqueue_scripts(){
		   wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ). 'style.css', array(), $this->version );
		   wp_register_script( $this->plugin_name, plugin_dir_url( __FILE__ ). 'app.js', array('jquery'), '1.0', true );
		   wp_localize_script( $this->plugin_name, 'murdeni', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );		
	  }

}

function run_search_autocomplete(){
    new Murdeni_SearchAutoComplete();
}

// Jalankan
run_search_autocomplete();

Kita menambahkan ACTION Hook ‘wp_enqueue_scripts’ pada function construct pada Class

add_action('wp_enqueue_scripts', array( $this, 'enqueue_scripts'), 100 );

lalu menambah sebuah public function baru dengan nama ‘enqueue_scripts’. Dengan demikian, dapat anda pastikan bahwa sekarang file CSS dan JS yang anda buat sudah di include kan pada halaman website anda. Anda dapat memeriksanya melalui source code website dengan menekan tombol CTRL + U.

Menambah Shortcode untuk memanggil form pencarian

Buat sebuah public function baru pada Class, serta tambahkan hook pada function costruct, sehingga menjadi seperti berikut:

class Murdeni_SearchAutoComplete{
    
    public $plugin_name = 'search-autocomplete';
    public $version = '1.0.0';

    function __construct(){
        add_action('wp_enqueue_scripts', array( $this, 'enqueue_scripts'), 100 );        
        add_shortcode( 'search-form-autocomplete', array($this, 'search_form_shortcode' ) );        
    }

    public function enqueue_scripts(){
		    wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ). 'style.css', array(), $this->version );
		    wp_register_script( $this->plugin_name, plugin_dir_url( __FILE__ ). 'app.js', array('jquery'), '1.0', true );
		    wp_localize_script( $this->plugin_name, 'murdeni', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );		
	  }

    public function search_form_shortcode(){
        ob_start();
        
        // Panggil script hanya ketika digunakan
        wp_enqueue_script($this->plugin_name);

        ?>
        <div class="text-search">
			    <form id="murdeni_keyword_search">
				    <div class="search-wrapper">
					    <?php $keyword = isset($_GET['keyword']) ? $_GET['keyword'] : ''; ?>
					    <input type="search" name="q" placeholder="<?php echo __('Cari Post, Produk, dan Halaman', 'murdeni') ?>" value="<?php echo $keyword ?>" autocomplete="off">
					    <input type="submit" value="Cari">
				    </div>
			    </form>				
		   </div>
       <?php
       return ob_get_clean();
    }   

}

Sekarang shortcode anda daftarkan, sehingga anda dapat menjalankan shortcode tersebut pada bagian tertentu pada website anda dengan memanggilnya dengan cara menuliskan [search-form-autocomplete] melalui WordPress editor, atau echo do_shortcode('[search-form-autocomplete]'); jika anda memanggilnya dari file PHP.

Jika anda berhasil memanggil shortcode tersebut, maka tampilan form pencarian anda akan terlihat seperti ini:

Tampilan sebelum styling

Tugas anda sekarang adalah menulis code CSS agar tampilan form pencarian anda terlihat lebih menarik. Saya menulis code CSS berikut, anda mungkin juga dapat menggunakannya serta mengubahnya sesuai selera anda. Copy paste code CSS ini ke dalam file style.css yang telah anda buat tadi.

#murdeni_keyword_search button[type="submit"] {
    width: 48px;
    height: 48px;
    background: #444 url(icon-search.svg) center/24px no-repeat;
    margin-bottom: 0;
    font-size: 0;
    padding: 0;
    -webkit-box-shadow: 0px 0px 0px 1px #0b253e;
    -moz-box-shadow: 0px 0px 0px 1px #0b253e;
    box-shadow: 0px 0px 0px 1px #0b253e;
    border: none;
}

#murdeni_keyword_search .search-wrapper {
    display: flex;
}


#murdeni_keyword_search.loading input[type="search"][type="search"] {
    background: url(loading.gif) center right 16px/15px no-repeat;
}

form.loading input[type="search"]::-webkit-search-decoration,
form.loading input[type="search"]::-webkit-search-cancel-button,
form.loading input[type="search"]::-webkit-search-results-button,
form.loading input[type="search"]::-webkit-search-results-decoration {
    -webkit-appearance: none;
}


#murdeni_keyword_search input[type="search"] {
    margin: 0;
    width: 100%;
    line-height: 1;
    padding: 0 10px;
    height: 48px;
    -webkit-box-shadow: 0px 0px 0px 1px #fff;
    -moz-box-shadow: 0px 0px 0px 1px #fff;
    box-shadow: 0px 0px 0px 1px #2c3338;
    border: none;
    background: #fff url(icon-search.svg) no-repeat;
    background-size: 20px;
    background-position: center right 10px;
}

#murdeni_keyword_search input[type="search"]:focus {
    -webkit-box-shadow: 0px 0px 0px 1px rgb(8 57 130 / 95%);
    -moz-box-shadow: 0px 0px 0px 1px rgb(8 57 130 / 95%);
    box-shadow: 0px 0px 0px 1px rgb(8 57 130 / 95%);
}


ul.murdeni-autocomplete {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    width: 100%;
    height: 220px;
    overflow: hidden;
    overflow-y: scroll;
    background-color: #f0f0f1;
    padding: 0;
    list-style: none;
    font-size: 14px;
    display: none;
    padding: 10px 0;
}

ul.murdeni-autocomplete.active {
    display: block;
}

.text-search {
    position: relative;
}

ul.murdeni-autocomplete.active li>a {
    padding: 0 10px;
    display: flex;
    font-size: 16px;
    text-transform: uppercase;
    justify-content: space-between;
    text-decoration: none;
    color: #313131;
    margin-bottom: 5px;
}

ul.murdeni-autocomplete.active li {
    background: #eee;
}

ul.murdeni-autocomplete .title span {
    font-weight: bold;
}

.murdeni-autocomplete .type {
    color: #fff;
    background: rgb(255 105 0);
    padding: 0 5px;
}

Jika sejauh ini langkah-langkah yang anda ikuti berhasil, maka anda akan melihat tampilan form pencarian anda akan terlihat seperti ini:

Form dengan style

Pada file CSS ini mungkin anda membutuhkan beberapa asset gambar, anda dapat mengunduh gambar nya melalui halaman github di sini, kemudian masukkan ke dalam folder plugin anda.

Membuat Perintah AJAX

Langkah berikutnya adalah menulis perintah AJAX melalui jQuery dan PHP yang akan berfungsi untuk mengambil dan menampilkan hasil melalui suggestion / autocomplete sesuai kata kunci yang diberikan pada form pencarian anda.

Pertama, sediakan terlebih dahulu function PHP pada Class Murdeni_SearchAutoComplete. Jika dilihat secara keseluruhan, file search-autocomplete.php akan terlihat seperti ini:

<?php
/**
 * Search autocomplete
 *
 * @package       SEARCHAUTO
 * @author        Feri Murdeni
 * @version       1.0.0
 *
 * @wordpress-plugin-murdeni
 * Plugin Name:   Search autocomplete
 * Plugin URI:    https://murdeni.com
 * Description:   Search Autocomplete by Murdeni
 * Version:       1.0.0
 * Author:        Feri Murdeni
 * Author URI:    https://murdeni.com
 * Text Domain:   murdeni
 */

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) exit;


class Murdeni_SearchAutoComplete{
    
    public $plugin_name = 'search-autocomplete';
    public $version = '1.0.0';

    function __construct(){
        add_action('wp_enqueue_scripts', array( $this, 'enqueue_scripts'), 100 );        
        add_shortcode( 'search-form-autocomplete', array($this, 'search_form_shortcode' ) );

        // AJAX
		    add_action('wp_ajax_sac_get_posts', array($this, 'ajax_get_posts') );
		    add_action('wp_ajax_nopriv_sac_get_posts', array($this, 'ajax_get_posts') );
    }

    public function enqueue_scripts(){
		wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ). 'style.css', array(), $this->version );
		wp_register_script( $this->plugin_name, plugin_dir_url( __FILE__ ). 'app.js', array('jquery'), '1.0', true );
		wp_localize_script( $this->plugin_name, 'murdeni', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );		
	}

    public function search_form_shortcode(){
        ob_start();
        
        // Panggil script hanya ketika digunakan
        wp_enqueue_script($this->plugin_name);

        ?>
        <div class="text-search">
			<form id="murdeni_keyword_search">
				<div class="search-wrapper">
					<?php $keyword = isset($_GET['keyword']) ? $_GET['keyword'] : ''; ?>
					<input type="search" name="q" placeholder="<?php echo __('Cari Post, Produk, dan Halaman', 'murdeni') ?>" value="<?php echo $keyword ?>" autocomplete="off">
					<input type="submit" value="Cari">
				</div>
			</form>				
		</div>
        <?php
        return ob_get_clean();
    }

    // Fungsi ajax untuk memanggil daftar Post, produk dan halaman
    public function ajax_get_posts(){
		$search_term = $_POST['s'];
		$args = array(
			'post_type' 	=> array('post', 'page', 'product'),
			'post_status'	=> 'publish',
			'numberposts' 	=> 10,
			's'			=> $_POST['s'],
			'orderby'	=> 'post_title',
			'order'		=> 'ASC'
		);
		
		$posts = get_posts($args);		
        $html = '<ul class="murdeni-autocomplete active">';
		if (!empty($posts)) {			
			foreach ($posts as $key => $post) {
				$pattern = "/".$search_term."/i";
				$title = preg_replace($pattern, '<strong style="text-decoration: underline;">'.$search_term.'</strong>', $post->post_title);
				$html .= '<li><a href="'.get_the_permalink($post->ID).'"><span class="title">'.$title.'</span><span class="type">'.$post->post_type.'</span></a></li>';
			}
			
		} else {
            $html .= '<li>Maaf, tidak ada hasil ditemukan.</li>';
        }

        $html .= '</ul>';

		echo $html;

		wp_reset_postdata();

		die();
	}

}

function run_search_autocomplete(){
    new Murdeni_SearchAutoComplete();
}

// Jalankan
run_search_autocomplete();

Terdapat penambahan baris kode pada fungsi construct:

add_action('wp_ajax_sac_get_posts', array($this, 'ajax_get_posts') );
add_action('wp_ajax_nopriv_sac_get_posts', array($this, 'ajax_get_posts') );

dan penambahan public function baru pada CLASS

public function ajax_get_posts(){
		$search_term = $_POST['s'];
		$args = array(
			'post_type' 	=> array('post', 'page', 'product'),
			'post_status'	=> 'publish',
			'numberposts' 	=> 10,
			's'			=> $_POST['s'],
			'orderby'	=> 'post_title',
			'order'		=> 'ASC'
		);
		
		$posts = get_posts($args);		
    $html = '<ul class="murdeni-autocomplete active">';
		if (!empty($posts)) {			
			      foreach ($posts as $key => $post) {
				    $pattern = "/".$search_term."/i";
				    $title = preg_replace($pattern, '<strong style="text-decoration: underline;">'.$search_term.'</strong>', $post->post_title);
				    $html .= '<li><a href="'.get_the_permalink($post->ID).'"><span class="title">'.$title.'</span><span class="type">'.$post->post_type.'</span></a></li>';
		   }			
		} else {
        $html .= '<li>Maaf, tidak ada hasil ditemukan.</li>';
    }
    $html .= '</ul>';
		echo $html;
		wp_reset_postdata();
		die();
}

Pada fungsi ini kita menggunakan get_posts untuk mengambil post lalu di looping menjadi sebuah list. Jika post tidak tersedia, maka akan menampilkan “Maaf, tidak ada hasil ditemukan."

Terakhir kita akan membuat kode JavaScript untuk memanggil AJAX pada file app.js anda.

(function($){
    let xhr;
    $(document).ready(function(){   
        // search filter
		let input = $(document).find('#murdeni_keyword_search [name="q"]');	

		$(document).on("keyup", '#murdeni_keyword_search [name="q"]', function () {
				let value = $(this).val();
				if (value.length > 2) {
					setTimeout(get_suggestion, 200, value, input);
				}
		});

		function get_suggestion(request, input){
			console.log(request);

		  	xhr = $.ajax({
				url: murdeni.ajaxurl,
				type: 'post',
				data: { action: 'sac_get_posts', s: request },
				beforeSend : function()    {           
				    if(xhr) { 
				    	xhr.abort(); 
				    }

				    $(document).find('.murdeni-autocomplete').remove();

				    // Loading
				    input.parents('form').addClass('loading');

				},
				success: function (response) {
					let regex = new RegExp("(" + request + ")", 'g');
					input.parents('form').after(response);

					$(".title:contains('" + request + "')").each(function() {
					  $(this).html($(this).text().replace(regex, '<span style="text-decoration: underline">$1</span>'));
					});

					// remove loading
					input.parents('form').removeClass('loading');
				}
		  	});
		}	
		
    });
})(jQuery)

Pada file ini kita membuat fungsi get_suggestion() untuk mengambil post melalui AJAX. Fungsi ini dipanggil melalui event keyup pada input pencarian pada form dengan ID murdeni_keyword_search. Fungsi get_suggeestion() ini memanggil fungsi PHP melalui action sac_get_posts. Di mana action ajax ini tadi telah kita daftarkan pada Class Murdeni_SearchAutoComplete.

Hasil dari pengambilan daftar post dari ajax ini kemudian dimasukkan ke dalam form setelah kolom pencarian melalui perintah jQuery.

Pengetesan

Setelah menulis code di atas, saatnya kita melakukan pengetesan apakah kode kita berhasil atau tidak. Pastikan plugin anda dapat berjalan seperti ini.

membuat-plugin-wordpress-form-pencarian-ajax-suggestion
Hasil pengetesan plugin

Jika ternyata anda gagal sampai ke tahap ini, mohon periksa kembali kode anda dan ulangi setiap langkah yang ada pada artikel ini.

Kesimpulan

Pada dasarnya, membuat plugin cukup mudah jika kita paham bagaimana langkah-demi langkah membuatnya. Artikel ini merupakan contoh sederhana membuat plugin WordPress yang berguna. Plugin ini dapat anda sesuaikan secara bebas tanpa syarat, tanpa perlu meminta izin terlebih dahulu. Cukup doakan saja admin punya badan yang sehat dan otak yang waras agar tetap dapat berbagi hal-hal bermanfaat lainnya. hehe

Demikian cara membuat plugin WordPress form pencarian autocomplete dengan suggestion ini semoga menjadi amal soleh bagi kita semua. Bagi anda yang berminat memasang plugin ini di website anda, anda dapat mengunduh langsung pada halaman github yang sudah saya di sini.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *