WordPress Meta Box Ekleme ve Kullanımı

Bu yazıda WordPress Meta Box ekleme örneği yaptık ve kullanımını gösterdim.

Merhaba, birazdan WordPress Meta Box nasıl eklenir ve nasıl kullanılır bunu öğreneceğiz. Eğer daha önce meta box kullanmadıysanız aslında tahmin ettiğinizden çok daha işlevsel ve kullanışlı olduğunu göreceksiniz. Yapabilecekleriniz tamamen sizin hayal gücünüze kalmış.

Sizi oyalamadan hemen nasıl bir meta box oluşturabiliriz bakalım:

function oguzhan_metabox()
{

}

Yukarıdaki gibi önce bir fonksiyon oluşturalım. Bu fonksiyonumuz ile meta box ekleyeceğimiz için şu fonksiyonu da hemen altına veya üstüne yazalım.

add_action('add_meta_boxes', 'oguzhan_metabox');

Bununla birlikte fonksiyonumuzu add_meta_boxes kancasına atmış bulunuyoruz.

Şimdi fonksiyonumuzun içine dolduralım. Yazacaklarımızı sırasıyla ve açıklayarak vereceğim.

Öncelikle hangi yazı türlerinde görünmesini istiyorsak bir dizi içine onları yazalım. Eğer sadece sayfalarda veya sadece yazılarda görünmesini isterseniz bunu yazmak zorunda değilsiniz.

$screens = ['post', 'page'];

Ben hem yazılarda hem de sayfalarda görünmesini istediğim için bu diziyi oluşturdum. Şimdi de bu diziyi foreach döngüsü ile döndürerek meta box ekleyeceğimiz fonksiyonu kullanacağım. Döngüyü aşağıdaki gibi fonksiyonumuzun içine yazıyorum:

function oguzhan_metabox()
{
    $screens = ['post', 'page'];
    foreach ($screens as $screen) {
        
    }
}
add_action('add_meta_boxes', 'oguzhan_metabox');

Şimdi meta box fonksiyonumuzu döngü içine dahil edelim.

function oguzhan_metabox()
{
    $screens = ['post', 'page'];
    foreach ($screens as $screen) {
        add_meta_box(
            'oguzhan_test_metabox',   // Benzersiz ID
            'Oğuzhan Meta Box',       // Meta Box adı
            'oguzhan_callback',       // Meta Box içeriğini bize gösterecek callback fonksiyonumuzun adı
            $screen                   // Yazı türü
        );
    }
}
add_action('add_meta_boxes', 'oguzhan_metabox');

add_meta_box fonksiyonumuzu döngü içine ekledik. Bu fonksiyon bizim dizimizde 2 değer olduğu için 2 kere dönecek. İlkinde yazılar için ikincisinde de sayfalar için bunu eklemiş olacağız.

Bu fonksiyona bir kaç parametre vermemiz gerekiyor. Bunlar şu şekilde:

  • ID: Benzersiz bir kimlik adı vermemiz gerekiyor buraya.
  • Name: Burada meta box adını veriyoruz. Türkçe karakter kullanmanızda sakında yok.
  • Callback: Buraya ise henüz oluşturmadığımız bir fonksiyon adını yazdım. Bu fonksiyonun içeriği ney ise meta box içerisinde de o görünecek.
  • Post Type: Burada ise yazı türlerimiz var. Anlatmaya başlarken söylediğim gibi ben 2 yazı türünde de göstermek istedim. Eğer bir tane isterseniz döngü kurmadan buraya sadece yazı türünü yazarak devam edebilirsiniz.

Evet, burada yapacaklarımız bu kadar. Şimdi meta box içerisinde bize içeriğimizi gösterecek callback fonksiyonumuzu yazmamız lazım.

Ben yukarıda callback fonksiyonumun adını “oguzhan_callback” olarak belirlemiştim. O yüzden hemen “oguzhan_callback” adında bir fonksiyon oluşturuyorum.

function oguzhan_callback()
{

}

Bunun içerisine ben başlangıç olarak “Hello World!” yazdırıp sonucunu hemen göstermek istiyorum.

function oguzhan_callback()
{
    echo 'Hello World!';
}

İşte sonuç:

Şimdi biraz daha ilerletelim ve ikinci bir yazar adı girebileceğimiz bir alan yapalım. Bununla birlikte zaten istediğiniz kadar giriş kutusu oluşturup verileri alabilirsiniz.

Callback fonksiyonumuza dönüyorum ve içeriğini şu şekilde değiştiriyorum:

<?php
function oguzhan_callback()
{
    ?>
    <label for="ikinci-yazar">İkinci Yazar Adı:</label>
    <div>
        <input type="text" name="ikinci_yazar" id="ikinci-yazar" />
    </div>
    <?php
}

Eğer buraya input eklemek isterseniz name öz niteliğine bir isim vermeyi unutmayın. Sonuç olarak buradan bir veri gidecek, bir isimle gitmesi gerekiyor. İsmin başka bir yerde kullanılmadığından emin olun. Sonucumuzu görelim:

Gördüğünüz gibi aşağıya giriş kutumuz geldi. Ancak bunun içine şu an bir isim girsek bile bunu kaydetmez. Çünkü bir kayıt etmek için bir kancadan daha geçirmemiz lazım. O kancanın adı da: save_post

Bununla birlikte 1 kanca adı ve 2 tane daha fonksiyon öğreneceğiz. Fonksiyonlar da buradan aldığımız veriyi veri tabanına kaydetmemizi ya da silmemizi sağlayacaklar:

  • update_post_meta: Bu fonksiyon ile verileri veri tabanımıza kaydedebiliriz.
  • delete_post_meta: Tahmin ettiğiniz gibi bununla da verilerimizi siliyoruz.

O zaman kaydetmek için ilk adımımızı atalım ve adını sizin vereceğiniz bir fonksiyon daha oluşturalım. Ben fonksiyonumun adına şunu veriyorum: oguzhan_save

function oguzhan_save()
{
    
}

Şimdi bu oluşturduğumuz meta box tüm sayfa ve yazılarda gözükeceği için hangi sayfa ya da hangi yazı olduğunu bulmamız gerekiyor. Bunu da global bir değişken olan $post değişkenimiz ile bulacağız. Aşağıdaki gibi:

function oguzhan_save()
{
    global $post;
    $post_id = $post->ID;
}

$post_id değişkenime global $post değişkenimizden o an işlem yapılan yazı veya sayfanın ID’sini çekmiş oldum.

Şimdi de az önce oluşturduğumuz ikinci yazar girişimizin gönderilip gönderilmediğini ve eğer gönderildiyse boş olup olmadığını kontrol edelim:

function oguzhan_save()
{
    global $post;
    $post_id = $post->ID;

    if(isset($_POST['ikinci_yazar']) && !empty($_POST['ikinci_yazar'])) {

    }
}

if fonksiyonu içerisinde kontrolümüzü yaptık. Burada kontrol ederken giriş kutusunun name öz niteliğine verdiğimiz isim ile koşul içerisindeki ismin aynı olmasına dikkat edin. Eğer böyle bir değer varsa kayıt etmemiz gerekiyor. Kayıt etmek için az önce verdiğim update_post_meta fonksiyonunu kullanacağız. Bu fonksiyon aslında 4 tane parametre alıyor ancak ben şimdilik 3 tanesini göstereceğim:

function oguzhan_save()
{
    global $post;
    $post_id = $post->ID;

    if (isset($_POST['ikinci_yazar']) && !empty($_POST['ikinci_yazar'])) {
        update_post_meta($post_id, $meta_key, $meta_value);
    }
}

Burada gördüğünüz gibi ilk parametremiz yazımızın ID’si. İkinci parametre ise veri tabanına kaydederken kullanacağımız isim. Üçüncü parametre ise bizim değerimiz, yani giriş kutusundan aldığımız yazar adı değeri. Güncelleyerek gösteriyorum:

function oguzhan_save()
{
    global $post;
    $post_id = $post->ID;

    if (isset($_POST['ikinci_yazar']) && !empty($_POST['ikinci_yazar'])) {
        update_post_meta($post_id, 'ikinci_yazar_adi', $_POST['ikinci_yazar']);
    }
}

Evet kayıt işlemi aslında bu kadar. Şimdi de koşulumuzun geçersiz olduğu kısmı yazalım. Burada da eğer böyle bir veri bize gönderilmemiş ise ve veri tabanımızda böyle bir değer varsa bunu sileceğiz. Bunun için de delete_post_meta fonksiyonumuzu kullanıyoruz.

function oguzhan_save()
{
    global $post;
    $post_id = $post->ID;

    if (isset($_POST['ikinci_yazar']) && !empty($_POST['ikinci_yazar'])) {
        update_post_meta($post_id, 'ikinci_yazar_adi', $_POST['ikinci_yazar']);
    } else {
        delete_post_meta($post_id, $meta_key);
    }
}

Bu da aslında 3 tane parametre alıyor ancak bu yazı için 2 parametre yeterli olduğundan 2 tanesini veriyorum.

Birinci parametremiz yine yazımızın veya sayfamızın ID’si. İkinci parametre de silinecek olan meta verimizin veri tabanındaki adı. Yani update_post_meta fonksiyonunda verdiğimiz ikinci parametre ile aynı. Güncelleyerek veriyorum kodu:

function oguzhan_save()
{
    global $post;
    $post_id = $post->ID;

    if (isset($_POST['ikinci_yazar']) && !empty($_POST['ikinci_yazar'])) {
        update_post_meta($post_id, 'ikinci_yazar_adi', $_POST['ikinci_yazar']);
    } else {
        delete_post_meta($post_id, 'ikinci_yazar_adi');
    }
}

Şimdi de bu yazdığımız kaydetme kaydetme fonksiyonumuzu save_post kancasına atalım. Bunun için de fonksiyonun hemen altına şunu yazıyoruz:

add_action('save_post', 'oguzhan_save');

Yani sonuç olarak şu şekilde oldu:

function oguzhan_save()
{
    global $post;
    $post_id = $post->ID;

    if (isset($_POST['ikinci_yazar']) && !empty($_POST['ikinci_yazar'])) {
        update_post_meta($post_id, 'ikinci_yazar_adi', $_POST['ikinci_yazar']);
    } else {
        delete_post_meta($post_id, 'ikinci_yazar_adi');
    }
}
add_action('save_post', 'oguzhan_save');

Henüz bitmedi ancak çok az kaldı, sabredin 🙂

Kısa bir test yapalım ve yazdığımız veriyi veri tabanımızda görelim. İkinci yazar adına “Onur” yazıyorum ve yazıyı yayımlıyorum.

Adres çubuğunda görüldüğü gibi yazımızın ID’si: 1791

Veri tabanımıza giriyorum ve wp_postmeta tablosunda post_id sütununa göre çoktan aza olacak şekilde yani DESC olarak sıralıyorum. Bunu yaparken ben yeni yazı açtığım için post_id en büyük olacak ve en üstte görünecektir. Siz daha önce eklemiş olduğunuz bir yazı ve sayfada denerseniz en üstte görünmeyebilir.

En yukarıda meta_key ve meta_value sütunlarına bakarak verimizin bu sayfa için kaydedildiğini görebilirsiniz. Ancak çok ufak bir sorunumuz daha var. Sayfamızı yenilediğimiz zaman bu kutucuk boş olarak geliyor. Bunun içine önceden kayıtlı olan veriyi getirmemiz gerek.

Kayıtlı verileri getirmek için de bir fonksiyonumuz var. Bunun için şu fonksiyonu kullanacağız: get_post_meta

Giriş kutusu oluşturduğumuz callback fonksiyonuna geri dönelim ve kutunun üstüne şunu ekleyelim:

global $post;
$post_id = $post->ID;
$meta_value = get_post_meta($post_id, 'ikinci_yazar_adi', true);

Bu fonksiyon ile verimizi çekmiş olduk. Bunu da giriş kutumuzun içinde value öz niteliğine eklememiz gerekiyor ki sayfayı yenilediğimiz zaman kutunun içerisinde bizim verimiz neyse o gözüksün.

Ekledikten sonra callback fonksiyonumuz şu şekilde olması lazım:

<?php
function oguzhan_callback()
{

    global $post;
    $post_id = $post->ID;
    $meta_value = get_post_meta($post_id, 'ikinci_yazar_adi', true);
?>
    <label for="ikinci-yazar">İkinci Yazar Adı:</label>
    <div>
        <input type="text" name="ikinci_yazar" value="<?php echo $meta_value; ?>" id="ikinci-yazar" />
    </div>
<?php
}

Evet, bitti 🙂 WordPress Meta Box ile anlatacaklarım şimdilik bu kadar. Aslında çok daha büyük işler yapılabilir. Ben basit bir örnek ile temel düzeyde size aktarmaya çalıştım. Anlamadığınız bir yer olursa yorum yazarak sorabilirsiniz.

Kendi başınıza eklemeye çalıştığınız bir meta box varsa ve yapamadıysanız bu konuda da size yardımcı olabilirim. Biraz uzun bir yazı oldu kusura bakmayın.

Beni okumaya devam edin, iyi çalışmalar.

Leave a Reply