WordPress Özel Widget (Bileşen) Ekleme

Bu yazıda özel bir widget (bileşen) nasıl oluşturulur onu anlattım.

Merhaba, bugün ki konumuz WordPress sistemine kendimizin yazdığı özel bir widget (bileşen) eklemek. Ben bu widgeti basit düzeyde tutacağım. Yapmam gerek size bunun mantığını anlatmak ve gerisini sizin hayal gücünüze bırakmak. Hadi başlayalım artık!

WordPress Özel Widget (Bileşen) Nasıl Oluşturulur?

Öncelikle widget nedir ona bakalım bir.

WordPress yönetim paneli – Bileşenler

Bu sayfaya girdiğiniz zaman bileşenleri göreceksiniz. Şimdi biz buraya Widget sınıfını kullanarak yeni bir Class yazacağız. Ama ondan önce bir widget yapısı nasıl olmalı ona bakalım.

WordPress Özel Widget Oluşturma

Şimdi kodlarınızı yazacağınız kodları geliştirme ortamını hazırlayın ve yaklaşın!

Kodlarımızı functions.php dosyasına yazabiliriz. Ya da benim gibi daha düzenli şekilde çalışmak isterseniz tema klasörünüzde widgets adında bir klasör oluşturabilirsiniz. O klasörün içine de posts.php adında bir dosya oluştrdum ben. Kodlarımı bu dosyaya yazacağım.

Widget kodumuzu yazmaya başlamadan önce aşağıdaki kod ile bu dosyayı temamıza dahil edelim:

<?php require_once get_template_directory() . '/widgets/posts.php'; ?>

Şimdi gelelim, widget nasıl yazılır? Bu sınıf için toplamda 18 tane metodumuz var. Bu metotlara WordPress Geliştirici Sitesi‘nden ulaşabilirsiniz.

Bir bileşeni oluşturmak için bizim kullanacağımız temel metotlara bakalım:

// Özel widget sınıfımızı oluşturuyoruz.
class CustomPosts extends WP_Widget
{

    // İlk çalışacak olan yapıcı metodumuz 
    function __construct()
    {
    }

    // Bileşenimizin Front-End tarafı
    public function widget($args, $instance)
    {
    }

    // Yöneticinin bileşenin ayarlarını yapacağı form
    public function form($instance)
    {
    }

    // Bileşen kaydedildiğinde gerçekleşecek işlemler
    public function update($new_instance, $old_instance)
    {
    }

    // Class CustomPosts bitiş yeri
}

Bunları yazdıktan sonra yeni oluşturduğumuz CustomPosts Class’ı bittikten sonra da uygun olarak şunları ekleyelim:

function custom_post_widget_load()
{
    register_widget('CustomPosts');
}
add_action('widgets_init', 'custom_post_widget_load');

Şimdi CustomPosts sınıfımızı düzenleme zamanı.

__construct metodumuzu şu şekilde güncelleyelim:

function __construct()
{
    parent::__construct(

        // Widget ID
        'custom_widget_posts',

        // Bileşenler kısmında gözükecek bileşen adı
        __('Custom | Posts', 'textdomain'),

        // Widget açıklaması
        array('description' => __('Yazılarınızı bu widget ile gösterebilirsiniz', 'textdomain'),)
    );
}

Yukarıdaki metot ile yeni oluşturacağımız bileşenin kimlik adını, adını ve açıklamasını ayarlamış olduk.

Şimdi diğer metotları da aşağıdaki gibi güncelleyelim:

Widget metodu:

public function widget($args, $instance)
{
    
    $title = apply_filters('widget_title', $instance['title']);

    // Sidebar'ı oluştururken widget öncesinde gelecek HTML kodlarını yazdırdık.
    echo $args['before_widget'];

    // Widget başlığı var ise onu yazdırdık.
    if (!empty($title)) {
        echo $args['before_title'] . $title . $args['after_title'];
    }

    // Widget formundan gelen widget ayarlarını kontrol ettik
    if ($instance['posts_per_page'] <= 1) {
        $posts_per_page = 1;
    } else {
        $posts_per_page = $instance['posts_per_page'];
    }

    // WordPress özel sorugusunu yapmak için parametrelerimizi hazırladık.
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => $posts_per_page,
    );

    // Sorgumuzu yaptık ve yazılarımızı yazdırdık.
    $query = new WP_Query($args);

    if ($query->have_posts()) {
        echo '<div class="widget-posts">';
        while ($query->have_posts()) {
            $query->the_post();
            echo '<div><a href="' . get_the_permalink() . '" class="widget-post">';
            if (has_post_thumbnail()) {
                echo '
                <div class="widget-post-img">
                    <img src="' . get_the_post_thumbnail_url() . '" alt="' . get_the_title() . '">
                </div>
                ';
            }
            echo '
                <div class="widget-post-title">
                    <h2 class="widget-post-the-title">' . get_the_title() . '</h2>
                </div>
                </a>
                </div>
            ';
        }
        echo '</div>';
        echo $args['after_widget'];
    }
    wp_reset_postdata();
}

Form metodu:

<?php

public function form($instance)
    {
        if (isset($instance['title'])) {
            $title = $instance['title'];
        } else {
            $title = __('Posts', 'textdomain');
        }

        if (isset($instance['posts_per_page'])) {
            $posts_per_page = $instance['posts_per_page'];
        } else {
            $posts_per_page = 5;
        }

?>
        <p>
            <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', 'textdomain'); ?></label>
            <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" />
        </p>
        <p>
            <label for="<?php echo $this->get_field_id('posts_per_page'); ?>"><?php _e('Post Per Page:', 'textdomain'); ?></label>
            <input class="widefat" id="<?php echo $this->get_field_id('posts_per_page'); ?>" name="<?php echo $this->get_field_name('posts_per_page'); ?>" type="number" min="1" max="10" value="<?php echo esc_attr($posts_per_page); ?>" />
        </p>
<?php
    }

Update metodu:

public function update($new_instance, $old_instance)
{
    $instance = array();
    $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
    $instance['posts_per_page'] = (!empty($new_instance['posts_per_page'])) ? strip_tags($new_instance['posts_per_page']) : 5;
    return $instance;
}

Evet artık bileşenimizi oluşturduk. Bunu daha da ilerletip kategorilere göre de gösterme seçeneği ekleyebilirsiniz. Ben size buraya kadar olanı anlattım sonrasında da kategorileri ekledim. Kategorileri eklemek de sizin ödeviniz olsun. Soru sormaktan çekinmeyin.

Umarım işinize yarar bir yazı olmuştur. Beni okumaya devam edin, iyi çalışmalar.

Leave a Reply