Artikel

Cara Membuat Custom Plugin WordPress Sendiri

Cara Membuat Custom Plugin WordPress Sendiri – Dalam tutorial ini, kita akan mendalami pengembangan Custom Plugin WordPress menggunakan bahasa PHP. Tujuan utamanya adalah memberikan referensi kepada pelajar dan pemula, terutama mereka yang baru mengenal WordPress dan PHP, untuk mempelajari teknik-teknik yang berguna guna meningkatkan pengetahuan dan kemampuan pemrograman mereka. Saya akan menyertakan cuplikan kode sampel dan kode sumber plugin WordPress sampel yang menunjukkan tujuan utama kita dalam tutorial ini.

Apa itu WordPress?

WordPress adalah sistem manajemen konten (CMS) sumber terbuka yang banyak digunakan yang memungkinkan pengguna untuk membuat dan mengelola situs web dan blog. WordPress ditulis dalam bahasa PHP dan menggunakan basis data MySQL atau MariaDB. WordPress telah berkembang dari asalnya sebagai platform blog menjadi CMS yang serbaguna yang digunakan oleh individu, bisnis, dan organisasi untuk berbagai jenis situs web, termasuk blog, portofolio, situs e-commerce, dan situs web perusahaan.

Apa itu Plugin WordPress?

Plugin WordPress adalah komponen perangkat lunak yang memperluas dan meningkatkan fungsi situs web WordPress. Plugin sangat penting dalam membuat WordPress menjadi sistem manajemen konten (CMS) yang fleksibel dan dapat disesuaikan. Plugin memungkinkan pengguna untuk menggabungkan fitur atau kemampuan tertentu ke dalam situs web mereka tanpa memodifikasi kode inti WordPress.

Bagaimana Cara Membuat Custom Plugin WordPress?

Langkah 1

Untuk membuat Custom Plugin WordPress, buat direktori baru di situs web WordPress Anda dalam folder source_code_path>wp-contents>plugins. Kemudian, buat file PHP baru.

Langkah 2

Buka file PHP yang baru Anda buat dengan editor kode pilihan Anda, seperti MS VS Code, Sublime, atau Notepad++.

Langkah 3

Selanjutnya, kita perlu memberikan header informasi Plugin di baris atas file PHP. Header informasi ini ditempatkan dalam tag komentar. Di bawah ini adalah contoh header informasi untuk Plugin WordPress sampel:

<?php
/**
 * Plugin Name: My Custom Plugin Name
 * Plugin URI: URI of your plugin where your docs, updates, or etc located
 * Description: A brief description of yout plugin
 * Version: your plugin version
 * Author: the plugins author name
 * Author URI: the plugins author URI
 * License: license name e.g. GPL2
 */  
?>

Setelah menyelesaikan langkah-langkah ini, Anda akan dapat menemukan Custom Plugin WordPress Anda di Halaman Plugin pada sisi admin WordPress Anda.

Untuk pemahaman yang lebih baik dalam membuat Custom Plugin WordPress, saya telah mengembangkan plugin sederhana yang mencakup fitur CRUD (Create, Read, Update, dan Delete) pada sisi admin. Script plugin yang disediakan juga melibatkan pembuatan tabel database baru.

Berikut adalah script PHP untuk plugin sederhana yang saya buat:

<?php
/**
    * Plugin Name: My First Custom Plugin
    * Plugin URI: https://sample-domain.com
    * Description: Lorem ipsum dolor sit amet consectetur adipisicing elit.
    * Version: 1.0
    * Author: oretnom23
    * Author URI: https://www.sourcecodester.com/user/257130/activity
    * License: GPLv2 or later
    */    
 
if ( ! defined( 'ABSPATH' ) ) {
    die;
}
 
class MyFirstPlugin{
    public $notices = [];
    function __construct()
    {
        add_action( 'admin_menu', [ $this, 'pages' ] );
        add_action( 'admin_enqueue_scripts', [$this, 'bootstrap_scripts'], 10, 1 );
 
        // Process Form
        add_action( 'admin_init', [ $this, 'save_form' ] );
        add_action( 'admin_init', [ $this, 'delete_mfcp' ] );
 
        $this->notices = get_option("mfcp_notices", array());
        // print_r(gettype($this->notices));exit;
        add_action( 'admin_notices', [$this, 'display_notices'] );
    }
 
    function pages(){
        //add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
        add_menu_page(__('My First Custom Plugin'), __('Custom Plugin'), 'administrator', 'my-first-custom-plugin-page', [$this, 'my_plugin_list_page'], '', 25); 
        add_submenu_page('my-first-custom-plugin-page', __('Manage Plugin\'s DB'), __('Add New'), 'administrator', 'my-first-custom-plugin-page-form', [$this, 'my_plugin_form_page']); 
    }
 
    function display_notices(){
        // print_r($this->notices);exit;
        if(count($this->notices) > 0){
            foreach($this->notices as $k =>$notice){
                ?>
                <div class="notice notice-<?= $notice['type'] ?> <?= ($notice['dismissible']) ? "is-dismissible" : "" ?>">
                    <?= htmlspecialchars_decode($notice['message']) ?>
                </div>
                <?php
                unset($this->notices[$k]);
            }
        }
        update_option("mfcp_notices", []);
 
    }
    function activate(){
        // Install Plugin's Database
        $this->install_db();
    }
    function deactivate(){
 
    }
    function uninstall(){
    }
 
    /**
        * Enqueue Styles and Scripts
        */    function bootstrap_scripts($hook){
        // Enqueue Bootstrap CDN CSS and JS only in plugin's page
        if($hook == 'toplevel_page_my-first-custom-plugin-page' || $hook == 'custom-plugin_page_my-first-custom-plugin-page-form'){
            wp_enqueue_style("fontawesome-icon-cdn","https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css",[],"6.1.2", "all");
            wp_enqueue_style("bootstrap-css-cdn","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",[],"5.3.2", "all");
 
            wp_enqueue_script("fontawesome-icon-js-cdn","https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/js/all.min.js",[],"6.1.2", "all");
            wp_enqueue_script("bootstrap-js-cdn","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js",[],"5.3.2", "all");
        }
        // echo $hook;exit;
    }
 
    /**
        * Create Plugin's Database
        */    function install_db(){
        global $wpdb;
        $table = $wpdb->prefix."mfp_tbl";
        $qry = $wpdb->prepare("SHOW TABLES LIKE %s", $wpdb->esc_like($table));
        if($wpdb->get_var($qry) == $table){
            /**
                * Table Already Exists
                */ 
        }else{
            /**
                * Table Doesn't Exists on the Database
                * - Install Table
                */            $charset_collate = $wpdb->get_charset_collate();
 
            $sql = "CREATE TABLE IF NOT EXISTS $table  (
                `id` int(30) NOT NULL PRIMARY KEY AUTO_INCREMENT,
                `meta_field` text DEFAULT NULL,
                `meta_value` text DEFAULT NULL,
                `created_at` datetime NOT NULL DEFAULT current_timestamp(),
                `updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp()
            ) $charset_collate;";
            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
            dbDelta($sql);
        }
    }
 
    /**
        * Create Plugin's Form Page
        */    function my_plugin_form_page(){
        global $wpdb;
        if(isset($_GET['mfcp_id'])){
            $data = $wpdb->get_row(
                $wpdb->prepare("SELECT * FROM `{$wpdb->prefix}mfp_tbl` where `id` = %d", [$_GET['mfcp_id']]),
                ARRAY_A
            );
            extract($data, EXTR_PREFIX_ALL, "mfcp");
        }
        ?>
        <style>
            .card{
                max-width: unset ;
            }
        </style>
        <div class="container-fluid">
            <div class="card shadow col-lg-5 col-md-8 col-sm-12 col-12 mx-auto p-0">
                <div class="card-header rounded-0">
                    <div class="card-title">Plugin's Sample Form <?= (!empty($mfcp_id ?? "")? " - Updating #{$mfcp_id}" : "") ?></div>
                </div>
                <div class="card-body">
                    <div class="container-fluid">
                        <form action-xhr="#" id="sample-form" method="POST">
                            <?php wp_nonce_field( "mfcp-sample-form" ); ?>
                            <input type="hidden" name="action" value="save-mfcp-sample-form">
                            <input type="hidden" name="id" value="<?= $mfcp_id ?? "" ?>">
                            <div class="mb-3">
                                <label for="meta_field" class="form-label">Meta Field <small class="text-danger">*</small></label>
                                <input type="text" class="form-control rounded-0" id="meta_field" name="meta_field" value="<?= $_POST['meta_field'] ?? $mfcp_meta_field ?? "" ?>" required="required" autofocus>
                            </div>
                            <div class="mb-3">
                                <label for="meta_value" class="form-label">Meta Value <small class="text-danger">*</small></label>
                                <textarea name="meta_value" id="meta_value" rows="3" class="form-control rounded-0" requried=""><?= $_POST['meta_value'] ?? $mfcp_meta_value ?? "" ?></textarea>
                            </div>
                            <div class="mb-3">
                                <button class="btn btn-primary rounded-0" type="submit">Save</button>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
        <?
    }
 
    /**
        * Create Plugin's List Page
        */ 
    function my_plugin_list_page(){
        global $wpdb;
        $data = $wpdb->get_results(
            $wpdb->prepare("
                SELECT * FROM `{$wpdb->prefix}mfp_tbl` order by id ASC
            "),
            ARRAY_A
        );
        ?>
        <style>
            .card{
                max-width: unset ;
            }
        </style>
        <div class="container-fluid">
            <div class="card shadow col-12 p-0">
                <div class="card-header rounded-0">
                    <div class="card-title">Plugin's Database Data</div>
                </div>
                <div class="card-body">
                    <div class="container-fluid">
                        <div class="table-responsive">
                            <table class="table table-striped table-hover table-bordered">
                                <colgroup>
                                    <col width="20%">
                                    <col width="30%">
                                    <col width="30%">
                                    <col width="20%">
                                </colgroup>
                                <thead>
                                    <tr>
                                        <th class="text-center px-2 py-1 text-light bg-primary">Date Added</th>
                                        <th class="text-center px-2 py-1 text-light bg-primary">Meta Field</th>
                                        <th class="text-center px-2 py-1 text-light bg-primary">Meta Value</th>
                                        <th class="text-center px-2 py-1 text-light bg-primary">Action</th>
                                    </tr>
                                </thead>
                                <tbody>
                                    <?php if(!empty($data)): ?>
                                    <?php foreach($data as $row): ?>
                                        <tr>
                                            <td class="px-2 py-1"><?= date("M d, Y g:i A", strtotime($row['created_at'])) ?></td>
                                            <td class="px-2 py-1"><?= $row['meta_field'] ?></td>
                                            <td class="px-2 py-1"><?= $row['meta_value'] ?></td>
                                            <td class="px-2 py-1">
                                                <div class="input-group d-flex justify-content-center">
                                                    <a href="<?= admin_url("admin.php?page=my-first-custom-plugin-page-form&mfcp_id={$row['id']}") ?>" class="btn btn-sm btn-outline-primary rounded-0" title="Edit"><i class="fa fa-edit"></i></a>
                                                    <a href="<?= admin_url("admin.php?page=my-first-custom-plugin-page-form&action=delete_mfcp&mfcp_id={$row['id']}") ?>" class="btn btn-sm btn-outline-danger rounded-0 delete-mfcp" title="Delete"><i class="fa fa-trash"></i></a>
                                                </div>
                                            </td>
                                        </tr>
                                    <?php endforeach; ?>
                                    <?php else: ?>
                                        <tr>
                                            <th class="text-center px-2 py-1" colspan="4">No Data Found!</th>
                                        </tr>
                                    <?php endif; ?>
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <script>
            var delete_mfcp = document.querySelectorAll('.delete-mfcp')
            delete_mfcp.forEach(el=>{
                el.addEventListener('click', function(e){
                    if(confirm(`Are you sure to delete this data?`) === false)
                    e.preventDefault();
                })
            })
        </script>
        <?
    }
 
 
    /**
        * Save Form Data
        */    function save_form(){
        global $wpdb;
        extract($_POST, EXTR_PREFIX_ALL, "mfcp");
        $resp=[];
        if(
            isset($_POST['action']) &&
            $_POST['action'] == 'save-mfcp-sample-form'
        ){
            if(!wp_verify_nonce( $mfcp__wpnonce, 'mfcp-sample-form')){
                $resp = ["type" => "danger", "message" => "Security Check Failed!"];
            }else{
                $mfcp_meta_field = sanitize_text_field( $mfcp_meta_field );
                $mfcp_meta_value = sanitize_textarea_field( $mfcp_meta_value );
                if(empty($mfcp_id)){
                    $save = $wpdb->insert(
                        "{$wpdb->prefix}mfp_tbl",
                        [
                            "meta_field" => $mfcp_meta_field,
                            "meta_value" => $mfcp_meta_value
                        ],
                        [
                            '%s',
                            '%s'
                        ]
                    );
                }else{
                    $save = $wpdb->update("{$wpdb->prefix}mfp_tbl",
                    [
                        "meta_field" => $mfcp_meta_field,
                        "meta_value" => $mfcp_meta_value
                    ],
                    [
                        "id" => $mfcp_id,
                    ],
                    [
                        '%s',
                        '%s'
                    ],
                    [
                        '%d',
                    ]
                    );
                }
                if($wpdb->last_error){
                    $resp = ["type" => "danger", "message" => $wpdb->last_error];
                }else{
                    $resp = ["type" => "success", "message" => "Data has been saved successfully!"];
                }
            }
 
            $this->notices[] = $resp;
            update_option("mfcp_notices", $this->notices);
            echo "<script>location.replace(`".admin_url("admin.php?page=my-first-custom-plugin-page")."`)</script>";
            exit;
        }
 
    }
 
    /**
        * Delete Data
        */    function delete_mfcp(){
        global $wpdb;
        if(
            isset($_GET['page']) && 
            $_GET['page'] == 'my-first-custom-plugin-page-form' &&
            isset($_GET['action']) && 
            $_GET['action'] == 'delete_mfcp'&&
            isset($_GET['mfcp_id'])
        ){
            $delete = $wpdb->delete("{$wpdb->prefix}mfp_tbl", [ "id" =>  $_GET['mfcp_id']], ['%d']);
            if($wpdb->last_error){
                $resp = ["type" => "danger", "message" => $wpdb->last_error];
            }else{
                $resp = ["type" => "success", "message" => "Data has been deleted successfully!"];
            }
            $this->notices[] = $resp;
            update_option("mfcp_notices", $this->notices);
            echo "<script>location.replace(document.referrer)</script>";
            exit;
        }
    }
 
}
 
if(class_exists("MyFirstPlugin")){
    $MyFirstPlugin = new MyFirstPlugin();
    register_activation_hook(__FILE__ , array ( $MyFirstPlugin , 'activate' ) );
}

Cuplikan Layar

Jelajahi cuplikan layar di bawah ini, yang menangkap hasil dari Script Custom Plugin WordPress yang disediakan di atas:

Dan selesai! Saya berharap Panduan Custom Plugin WordPress ini bermanfaat untuk kebutuhan Anda dan menjadi sumber daya berharga untuk proyek WordPress Anda saat ini dan di masa mendatang.

Jika anda membutuhkan jasa pembuatan website wordpress custom bisa menghubungi nomor WA 087823179122 atau klik tombol WA di bawah website Kami. Terimakasih teleh membaca artikel Cara Membuat Custom Plugin WordPress Sendiri, Semoga Bermanfaat!

Yudith Hentreisa

Web Developer. Sejak 2009. Ahli di bidang pemrograman basis website. Keahlian : HTML, PHP, Mysql, Codeigniter, Bootstrap, CSS, Jquery, Javascript

Recent Posts

Download Aplikasi SPPD Basis Web PHP

Download Aplikasi SPPD Basis Web PHP - Apakah instansi atau perusahaan Anda masih menggunakan Microsoft…

3 minggu ago

Cara Melindungi Data Pribadi Agar Tidak Masuk Database Mata Elang

Cara Melindungi Data Pribadi Agar Tidak Masuk Database Mata Elang - Kasus bocornya 1,7 juta…

5 bulan ago

Mengapa Aplikasi Penjual Data Pribadi Seperti Matel Bisa Lolos ke Play Store?

Belakangan ini aplikasi matel, jagat media sosial dihebohkan dengan penertiban aplikasi Mata Elang (Matel) oleh…

5 bulan ago

[DOWNLOAD] Source Code AI Code Reviewer: Bangun Tool Internal Perusahaan Berbasis Gemini API

Source Code AI Code Reviewer - Di era AI saat ini, keamanan kode perusahaan adalah…

5 bulan ago

10 Software Gratis Pengganti Aplikasi Berbayar di 2026 (Update Desember 2025)

10 Software Gratis Pengganti Aplikasi Berbayar di 2026 (Update Desember 2025) 10 Software Gratis Pengganti…

5 bulan ago

Download Pinokyo Browser

Download Pinokyo Browser: Solusi Mudah Install AI Tanpa Coding bagi Pemula Menjalankan teknologi AI seperti…

5 bulan ago