Ön Hazırlık ve Gereksinimler
Özel gönderi türü (Custom Post Type - CPT) oluşturmaya başlamadan önce, çalışma ortamınızın hazır olduğundan emin olmalısınız. WordPress 6.x ve üzeri sürümlerle uyumlu, PHP 8.2+ sürümü kullanan bir yerel geliştirme ortamı (LocalWP, XAMPP veya Docker) önerilir.
- Düzenleyici: VS Code veya benzeri bir kod editörü.
- Dosya Yapısı: Kodlarınızı temanızın
functions.phpdosyasına veya tercihen temiz bir kod yönetimi için ayrı bir eklenti dosyasına eklemeniz gerekir. - Sürüm Kontrolü: Değişiklikleri yapmadan önce veritabanı yedeği almanız kritik öneme sahiptir.
Adım Adım Özel Gönderi Türü Kaydetme
Özel gönderi türü kaydetmek için init kancasını (hook) kullanmalıyız. Bu, WordPress'in çekirdek dosyaları yüklendikten sonra bizim fonksiyonumuzu çalıştırmasını sağlar. Aşağıdaki örnekte "Kitaplar" adında bir gönderi türü oluşturuyoruz.
function ozel_kitap_gonderi_turu_kaydet() {
$args = array(
'public' => true,
'label' => 'Kitaplar',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'has_archive' => true,
);
register_post_type('kitap', $args);
}
add_action('init', 'ozel_kitap_gonderi_turu_kaydet');
Bu kod bloğu, WordPress yönetim paneline "Kitaplar" menüsünü ekler. supports dizisi, bu gönderi türünün hangi özellikleri (başlık, içerik, öne çıkan görsel vb.) destekleyeceğini belirler.
Kritik Uyarı: Özel gönderi türü kaydettikten sonra, kalıcı bağlantıların (permalinks) güncellenmesi için WordPress yönetim panelinde Ayarlar > Kalıcı Bağlantılar sayfasına gidip "Değişiklikleri Kaydet" butonuna basmanız gerekir. Aksi takdirde 404 hataları alabilirsiniz.
Gelişmiş Etiketler ve Arayüz Ayarları
Sadece gönderi türünü kaydetmek yeterli değildir; kullanıcı deneyimi için etiketleri (labels) doğru yapılandırmanız gerekir. Bu, yönetim panelindeki "Yeni Ekle", "Kitap Düzenle" gibi metinlerin özelleştirilmesini sağlar.
function kitap_etiketlerini_yapilandir() {
$labels = array(
'name' => 'Kitaplar',
'singular_name' => 'Kitap',
'add_new' => 'Yeni Kitap Ekle',
'add_new_item' => 'Yeni Kitap Oluştur',
'edit_item' => 'Kitabı Düzenle',
'all_items' => 'Tüm Kitaplar',
);
$args = array(
'labels' => $labels,
'public' => true,
'menu_icon' => 'dashicons-book',
'show_in_rest' => true, // Gutenberg editörü için gereklidir
'supports' => array('title', 'editor', 'thumbnail'),
);
register_post_type('kitap', $args);
}
add_action('init', 'kitap_etiketlerini_yapilandir');
show_in_rest => true parametresi, oluşturduğunuz gönderi türünün modern blok editörü (Gutenberg) ile uyumlu çalışmasını sağlar. menu_icon ile yönetim panelinde görsel bir kimlik atayabilirsiniz.
Özel Taksonomiler ile Kategorize Etme
Gönderi türlerinizi sınıflandırmak için özel taksonomiler (kategoriler veya etiketler gibi) eklemeniz gerekebilir. Örneğin, kitapları "Tür" veya "Yazar" olarak gruplandırabilirsiniz.
function kitap_taksonomi_kaydet() {
register_taxonomy('tur', 'kitap', array(
'label' => 'Kitap Türleri',
'rewrite' => array('slug' => 'kitap-turu'),
'hierarchical' => true,
'show_in_rest' => true,
));
}
add_action('init', 'kitap_taksonomi_kaydet');
hierarchical => true parametresi, bu taksonominin kategori gibi (alt kategorileri olan) bir yapıya sahip olmasını sağlar. false yaparsanız etiketler gibi düz bir yapı elde edersiniz.
Özel Gönderi Türü Karşılaştırma Tablosu
| Özellik | Eklenti ile Yapmak | Kod ile Yapmak |
|---|---|---|
| Performans | Düşük (Ek yük) | Yüksek (Hızlı) |
| Esneklik | Orta | Çok Yüksek |
| Bakım | Kolay | Teknik Bilgi Gerektirir |
Güvenlik ve Performans İpuçları
Kod yazarken veritabanı güvenliği ve performans her zaman önceliğiniz olmalıdır. Özel gönderi türleri için register_post_type kullanırken gereksiz özelliklerin (örneğin trackbacks veya comments) kapalı olduğundan emin olun.
// Güvenli bir kayıt örneği
$args = array(
'public' => true,
'capability_type' => 'post',
'capabilities' => array(
'create_posts' => 'do_not_allow', // Sadece yöneticiler ekleyebilir
),
'map_meta_cap' => true,
);
Sorumluluk Reddi: Bu rehberdeki kodlar genel bilgilendirme amaçlıdır. Üretim ortamında (production) kullanmadan önce kodlarınızı mutlaka bir test ortamında deneyin. Hatalı yapılandırmalar veritabanı sorgularını yavaşlatabilir veya güvenlik açıklarına yol açabilir.
Sıkça Sorulan Sorular
Özel gönderi türü neden yönetim panelinde görünmüyor?
Genellikle init kancasının doğru çağrılmamasından veya kalıcı bağlantıların yenilenmemesinden kaynaklanır. Ayarlar > Kalıcı Bağlantılar kısmını kontrol edin.
Gutenberg editörü neden çalışmıyor?
'show_in_rest' => true parametresini eklemeyi unutmuş olabilirsiniz. Blok editörü desteği için bu parametre zorunludur.
Özel gönderi türü için özel şablon dosyası nasıl oluşturulur?
Temanızın klasörüne single-kitap.php adında bir dosya oluşturursanız, WordPress otomatik olarak bu gönderi türü için o şablonu kullanacaktır.
CPT verilerini nasıl sorgularım?
WP_Query sınıfını kullanarak 'post_type' => 'kitap' argümanı ile verileri kolayca çekebilirsiniz.
CPT'leri eklenti ile mi yoksa kodla mı yapmalıyım?
Eğer temanızın bir parçasıysa kodla, ancak temanızdan bağımsız bir özellikse eklenti ile yapmak daha sürdürülebilirdir.
Özel Gönderi Türleri İçin Meta Veri Yönetimi: Advanced Custom Fields (ACF) Entegrasyonu
Özel gönderi türlerini kaydettikten sonra, bu türlerin standart başlık ve içerik alanları genellikle yeterli olmaz. Örneğin, bir "Kitap" gönderi türü için "Yazar", "ISBN Numarası" veya "Yayın Yılı" gibi ek verilere ihtiyaç duyarsınız. WordPress'in yerleşik add_meta_box fonksiyonu ile bu alanları manuel oluşturabileceğiniz gibi, profesyonel projelerde Advanced Custom Fields (ACF) eklentisi ile bu süreci hızlandırmak standart bir yaklaşımdır.
ACF kullanarak özel alanları kodla tanımlamak, veritabanı performansını artırır ve sürdürülebilir bir yapı sunar. Aşağıdaki örnek, bir kitap gönderi türü için PHP ile nasıl özel alan tanımlanacağını göstermektedir:
if( function_exists('acf_add_local_field_group') ):
acf_add_local_field_group(array(
'key' => 'group_kitap_detaylari',
'title' => 'Kitap Detayları',
'fields' => array(
array(
'key' => 'field_isbn',
'label' => 'ISBN Numarası',
'name' => 'isbn_no',
'type' => 'text',
),
array(
'key' => 'field_yazar',
'label' => 'Yazar Adı',
'name' => 'yazar_adi',
'type' => 'text',
)
),
'location' => array(
array(
array(
'param' => 'post_type',
'operator' => '==',
'value' => 'kitap',
),
),
),
));
endif;
Özel Gönderi Türlerinde Performans Optimizasyonu
Çok sayıda özel gönderi türü ve bunlara bağlı meta veriler, özellikle büyük veritabanlarında sorgu süresini uzatabilir. Performansı korumak için aşağıdaki stratejileri izlemelisiniz:
- Sorgu Kısıtlamaları:
WP_Querykullanırken gereksiz meta verileri çekmemek için'no_found_rows' => trueparametresini kullanın. - Veritabanı İndeksleme: Eğer özel alanlar üzerinden sıkça sıralama veya filtreleme yapıyorsanız,
wp_postmetatablosundakimeta_keysütununa indeks eklemek sorgu hızını ciddi oranda artırır. - Object Cache Kullanımı:
wp_cache_setvewp_cache_getfonksiyonları ile sık kullanılan CPT verilerini bellekte tutarak veritabanı yükünü azaltın.
Aşağıdaki örnek, performanslı bir CPT sorgusunun nasıl olması gerektiğini göstermektedir:
$args = array(
'post_type' => 'kitap',
'posts_per_page' => 10,
'no_found_rows' => true, // Sayfalama gerekmiyorsa performansı artırır
'update_post_meta_cache' => false, // Meta veriye ihtiyaç yoksa false yapın
'update_post_term_cache' => false,
);
$kitap_sorgusu = new WP_Query($args);
if ($kitap_sorgusu->have_posts()) :
while ($kitap_sorgusu->have_posts()) : $kitap_sorgusu->the_post();
// İçerik çıktıları
endwhile;
wp_reset_postdata();
endif;
Özel Gönderi Türü Hata Ayıklama (Debugging) İpuçları
CPT'leriniz yönetim panelinde görünmüyorsa veya 404 hatası alıyorsanız, şu adımları izleyerek sorunu teşhis edebilirsiniz:
- Permalinks (Kalıcı Bağlantılar): CPT kaydettikten sonra mutlaka Ayarlar > Kalıcı Bağlantılar sayfasına gidip "Değişiklikleri Kaydet" butonuna basın. Bu, WordPress'in rewrite kurallarını (URL yapılarını) yeniden oluşturmasını sağlar.
- Query Monitor Eklentisi:
Query Monitoreklentisini kurarak, CPT'nizin hangi sorgularla çekildiğini ve olası çakışmaları anlık olarak izleyin. - Capabilities Kontrolü: Eğer CPT'niz görünmüyor ancak kodda bir hata yoksa,
'capability_type' => 'post'ayarını kontrol edin. Kullanıcının bu gönderi türünü görmeye yetkisi olmayabilir.
Sonuç
WordPress ile özel gönderi türü kaydı yapmak, sitenizi standart bir blogdan tam teşekküllü bir içerik yönetim sistemine dönüştürmenin anahtarıdır. Bu rehberde öğrendiğiniz register_post_type ve register_taxonomy fonksiyonları, verilerinizi daha düzenli ve SEO dostu bir şekilde sunmanıza olanak tanır. Bir sonraki adım olarak, oluşturduğunuz bu gönderi türleri için Custom Fields (Özel Alanlar) ekleyerek veri giriş süreçlerinizi daha da detaylandırabilirsiniz.


Yorumlar (0)
Yorum Yaz