Cara Membuat Widget Kustom di WordPress (Panduan Lengkap)

WordPress, Elrolumnews — Anda sudah bisa membuat shortcode, sudah bisa membuat Custom Post Type. Tapi bagaimana dengan sidebar? Bagaimana cara menambahkan elemen kustom ke area widget—seperti kotak newsletter, daftar sosial media, atau promo—yang bisa diatur dari dashboard?

Artikel ini cocok untuk: Anda yang sudah familiar dengan WordPress dan ingin naik level dengan Widget Kustom—untuk menambahkan elemen yang bisa diatur sendiri ke sidebar, footer, atau area widget lainnya.

Widget adalah blok konten yang bisa Anda tambahkan, hapus, dan atur dari Appearance > Widgets—tanpa menyentuh kode . Widget kustom memungkinkan Anda membuat blok sendiri yang sesuai kebutuhan—misalnya “Tentang Penulis”, “Promo Spesial”, atau “Daftar Sosial Media”.

Di artikel ini, kita akan bahas dari nol: apa itu widget, cara membuat widget kustom, mendaftarkan sidebar, hingga contoh praktis yang bisa langsung dipakai.

Apa Itu Widget dan Mengapa Penting?

Widget adalah komponen yang bisa ditambahkan ke sidebar atau area widget lainnya. WordPress sudah menyediakan beberapa widget bawaan:

Widget BawaanFungsi
ArchivesDaftar arsip bulanan
CategoriesDaftar kategori
Recent PostsArtikel terbaru
SearchKotak pencarian
TextTeks bebas (HTML)
Custom HTMLKode HTML

Mengapa Membuat Widget Kustom?

AlasanPenjelasan
Kontrol penuhTampilan dan fungsi sesuai kebutuhan
User-friendlyKlien bisa atur dari dashboard
ReusableBisa dipakai di beberapa sidebar
Lebih rapiTidak perlu hardcode di theme

💡 Tips Pro: Widget kustom sangat berguna untuk tema yang dijual—memberi fleksibilitas ke pengguna tanpa harus edit kode.

Langkah 1: Daftarkan Area Widget (Sidebar)

Sebelum membuat widget, Anda perlu area widget (sidebar) tempat widget akan ditempatkan.

Kode di functions.php

php
function elrolum_register_sidebars() {
    register_sidebar( array(
        'name'          => 'Sidebar Utama',
        'id'            => 'sidebar-utama',
        'description'   => 'Sidebar yang muncul di halaman blog',
        'before_widget' => '<div id="%1$s" class="widget %2$s">',
        'after_widget'  => '</div>',
        'before_title'  => '<h3 class="widget-title">',
        'after_title'   => '</h3>',
    ) );
}
add_action( 'widgets_init', 'elrolum_register_sidebars' );

Penjelasan

ParameterFungsi
nameNama yang muncul di dashboard
idIdentifier unik (huruf kecil, tanpa spasi)
descriptionDeskripsi area widget
before_widgetHTML sebelum setiap widget
after_widgetHTML setelah setiap widget
before_titleHTML sebelum judul widget
after_titleHTML setelah judul widget

Tampilkan di Theme

Di file tema (misalnya sidebar.php atau footer.php):

php
<?php if ( is_active_sidebar( 'sidebar-utama' ) ) : ?>
    <aside class="sidebar">
        <?php dynamic_sidebar( 'sidebar-utama' ); ?>
    </aside>
<?php endif; ?>

💡 Tips Pro: Anda bisa mendaftarkan beberapa area widget—misalnya “Footer 1”, “Footer 2”, “Footer 3″—dengan fungsi yang sama, hanya beda id dan name.

Langkah 2: Membuat Widget Kustom dengan Coding

Sekarang saatnya membuat widget sendiri. Kita akan menggunakan class WP_Widget .

Kode Dasar Widget

php
class Elrolum_Widget_Profil extends WP_Widget {

    // 1. Constructor
    public function __construct() {
        parent::__construct(
            'elrolum_widget_profil', // ID unik
            'Profil Penulis',        // Nama di dashboard
            array( 'description' => 'Menampilkan profil penulis' ) // Deskripsi
        );
    }

    // 2. Output di frontend
    public function widget( $args, $instance ) {
        echo $args['before_widget'];

        if ( ! empty( $instance['title'] ) ) {
            echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
        }

        echo '<div class="profil-widget">';
        echo '<p>' . esc_html( $instance['deskripsi'] ) . '</p>';
        echo '</div>';

        echo $args['after_widget'];
    }

    // 3. Form di admin
    public function form( $instance ) {
        $title     = ! empty( $instance['title'] ) ? $instance['title'] : 'Tentang Penulis';
        $deskripsi = ! empty( $instance['deskripsi'] ) ? $instance['deskripsi'] : '';
        ?>
        <p>
            <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>">Judul:</label>
            <input class="widefat" 
                   id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" 
                   name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" 
                   type="text" 
                   value="<?php echo esc_attr( $title ); ?>">
        </p>
        <p>
            <label for="<?php echo esc_attr( $this->get_field_id( 'deskripsi' ) ); ?>">Deskripsi:</label>
            <textarea class="widefat" 
                      id="<?php echo esc_attr( $this->get_field_id( 'deskripsi' ) ); ?>" 
                      name="<?php echo esc_attr( $this->get_field_name( 'deskripsi' ) ); ?>"><?php echo esc_textarea( $deskripsi ); ?></textarea>
        </p>
        <?php
    }

    // 4. Simpan data
    public function update( $new_instance, $old_instance ) {
        $instance = array();
        $instance['title']     = sanitize_text_field( $new_instance['title'] );
        $instance['deskripsi'] = sanitize_textarea_field( $new_instance['deskripsi'] );
        return $instance;
    }
}

Daftarkan Widget

php
function elrolum_register_widgets() {
    register_widget( 'Elrolum_Widget_Profil' );
}
add_action( 'widgets_init', 'elrolum_register_widgets' );

Penjelasan Setiap Method

MethodFungsi
__construct()Mendefinisikan ID, nama, dan deskripsi widget
widget()Menampilkan output di frontend
form()Form pengaturan di admin
update()Menyimpan data dari form

⚠️ Peringatan: Gunakan sanitasi (sanitize_text_fieldsanitize_textarea_field) di method update() untuk mencegah XSS .

Langkah 3: Widget dengan Gambar dan Tautan

Mari buat contoh yang lebih kaya: widget dengan gambarteks, dan tombol.

php
class Elrolum_Widget_Promo extends WP_Widget {

    public function __construct() {
        parent::__construct(
            'elrolum_widget_promo',
            'Promo Spesial',
            array( 'description' => 'Menampilkan promo dengan gambar dan tombol' )
        );
    }

    public function widget( $args, $instance ) {
        echo $args['before_widget'];

        if ( ! empty( $instance['title'] ) ) {
            echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
        }

        echo '<div class="promo-widget">';

        if ( ! empty( $instance['gambar'] ) ) {
            echo '<img src="' . esc_url( $instance['gambar'] ) . '" alt="' . esc_attr( $instance['title'] ) . '">';
        }

        if ( ! empty( $instance['teks'] ) ) {
            echo '<p>' . esc_html( $instance['teks'] ) . '</p>';
        }

        if ( ! empty( $instance['url'] ) ) {
            echo '<a href="' . esc_url( $instance['url'] ) . '" class="promo-button">' 
                 . esc_html( $instance['tombol'] ) . 
                 '</a>';
        }

        echo '</div>';
        echo $args['after_widget'];
    }

    public function form( $instance ) {
        $title  = ! empty( $instance['title'] ) ? $instance['title'] : 'Promo Spesial';
        $gambar = ! empty( $instance['gambar'] ) ? $instance['gambar'] : '';
        $teks   = ! empty( $instance['teks'] ) ? $instance['teks'] : '';
        $url    = ! empty( $instance['url'] ) ? $instance['url'] : '';
        $tombol = ! empty( $instance['tombol'] ) ? $instance['tombol'] : 'Beli Sekarang';
        ?>
        <p>
            <label>Judul:</label>
            <input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" 
                   type="text" value="<?php echo esc_attr( $title ); ?>">
        </p>
        <p>
            <label>URL Gambar:</label>
            <input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'gambar' ) ); ?>" 
                   type="text" value="<?php echo esc_attr( $gambar ); ?>">
        </p>
        <p>
            <label>Teks:</label>
            <textarea class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'teks' ) ); ?>"><?php echo esc_textarea( $teks ); ?></textarea>
        </p>
        <p>
            <label>URL Tombol:</label>
            <input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'url' ) ); ?>" 
                   type="text" value="<?php echo esc_attr( $url ); ?>">
        </p>
        <p>
            <label>Teks Tombol:</label>
            <input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'tombol' ) ); ?>" 
                   type="text" value="<?php echo esc_attr( $tombol ); ?>">
        </p>
        <?php
    }

    public function update( $new_instance, $old_instance ) {
        $instance = array();
        $instance['title']  = sanitize_text_field( $new_instance['title'] );
        $instance['gambar'] = esc_url_raw( $new_instance['gambar'] );
        $instance['teks']   = sanitize_textarea_field( $new_instance['teks'] );
        $instance['url']    = esc_url_raw( $new_instance['url'] );
        $instance['tombol'] = sanitize_text_field( $new_instance['tombol'] );
        return $instance;
    }
}

Langkah 4: Gunakan Widget di Block Editor (Gutenberg)

Jika website Anda menggunakan Gutenberg, widget tetap bisa diakses di Appearance > Widgets. Tampilannya mungkin berbeda, tapi fungsinya sama.

Widget Block Editor

WordPress 5.8+ menggunakan block editor untuk widget. Widget kustom Anda akan muncul di Legacy Widget atau Widget Kustom.

💡 Tips Pro: Jika ingin widget kustom tampil di block editor, pastikan widget Anda mendukung REST API atau gunakan block sebagai gantinya.

Tips Lanjutan untuk Level Expert

1. Widget dengan Multiple Fields

Gunakan array untuk menyimpan banyak field sekaligus:

php
$instance['sosmed'] = array(
    'facebook' => sanitize_url( $new_instance['sosmed']['facebook'] ),
    'twitter'  => sanitize_url( $new_instance['sosmed']['twitter'] ),
);

2. Widget dengan Shortcode di Dalamnya

Jika widget Anda menampilkan konten yang mungkin berisi shortcode:

php
echo do_shortcode( $instance['teks'] );

3. Widget untuk WooCommerce

Tampilkan produk terlaris di sidebar:

php
$query = new WP_Query( array(
    'post_type' => 'product',
    'posts_per_page' => 5,
    'meta_key' => 'total_sales',
    'orderby' => 'meta_value_num',
) );

Kesalahan Umum dan Cara Menghindarinya

KesalahanAkibatSolusi
Tidak sanitasi di update()Rentan XSSGunakan sanitize_*()
Tidak pakai $argsWidget tidak konsistenGunakan $args['before_widget']
Edit tema indukHilang saat updateGunakan child theme
Tidak daftarkan sidebarWidget tidak munculregister_sidebar()
Nama widget duplikatKonflikGunakan prefix unik

Widget kustom adalah cara WordPress untuk menambahkan elemen yang bisa diatur ke sidebar, footer, atau area widget lainnya. Kuncinya:

  1. Daftarkan sidebar — dengan register_sidebar()

  2. Buat class widget — extends WP_Widget

  3. Definisikan 4 method — __constructwidgetformupdate

  4. Sanitasi output — esc_html()esc_url()sanitize_*()

  5. Daftarkan widget — register_widget()

  6. Tampilkan sidebar — dynamic_sidebar() di theme

  7. Gunakan child theme — agar kode aman saat update

Dengan widget kustom, Anda bisa membuat sidebar yang kaya dan fleksibel—yang bisa diatur oleh siapa pun, tanpa harus menyentuh kode.

Ingat: Widget adalah alat. Konten yang hebat tetap butuh ide dan pesan yang jelas. Widget membantu Anda menampilkannya dengan cara yang rapi dan konsisten.

Sudah siap membuat widget kustom pertama Anda?

💬 Punya pengalaman dengan widget kustom? Bagikan di kolom komentar!

Share:

Tinggalkan Komentar

Please enter your comment!
Please enter your name here

More like this

Ilustrasi backup otomatis WordPress dengan cloud, jadwal, database, dan tombol restore untuk melindungi data website

Cara Backup WordPress Otomatis: Lindungi Website Anda dari Kehilangan...

WordPress, ElrolumNews — Bayangkan suatu pagi Anda membuka website, dan yang muncul adalah halaman error. Atau lebih buruk:...
Ilustrasi pembuatan shortcode kustom WordPress dengan add_shortcode, parameter, konten bersarang, dan tombol CTA

Cara Membuat Shortcode Kustom di WordPress (Panduan Lengkap)

WordPress, Elrolumnews — Anda ingin menampilkan tombol CTA, kotak info, atau daftar produk di dalam artikel—tapi tidak mau menulis HTML setiap kali?...
Ilustrasi setup email marketing dengan MailPoet, newsletter, daftar subscriber, form pendaftaran, dan automasi email

Cara Setup Email Marketing dengan MailPoet (Panduan Lengkap)

WordPress, Elrolumnews — Anda sudah punya website, sudah punya pengunjung. Tapi bagaimana caranya menjaga hubungan dengan mereka? Bagaimana membuat mereka kembali...

More

Recomended

Read More