WordPress Eklenti Geliştirme Kılavuzu: Başlangıçtan Gerçek Uygulamalara Kadar Özel İşlevler Oluşturma

4 dakika okuma.
2026-03-16
2026-06-03
2,674
Aşağıdaki bağlantılar üzerinden alışveriş yaptığınızda, sizin için ek bir maliyet olmadan komisyon kazanıyorum.

WordPress Eklenti Geliştirme Genel Bakışı

WordPress eklentileri, WordPress’in temel işlevlerini genişletmek ve geliştirmek için kullanılan PHP betik koleksiyonlarıdır. Geliştiricilere, WordPress’in temel kodunu değiştirmeden yeni özellikler, araçlar, yönetim panelleri eklemelerine veya mevcut davranışları değiştirmelerine olanak tanır. Bir eklenti, yalnızca bir dosyadan oluşabileceği gibi, birden fazla klasör ve çeşitli dosya türlerini içeren daha karmaşık bir yapıda da olabilir.

Eklentilerin anahtarı, giriş dosyalarıdır. Her eklenti en az bir ana PHP dosyası içermelidir ve bu dosyanın başında standart eklenti meta bilgileri sağlanmalıdır. Bu bilgiler, WordPress eklenti yöneticisi tarafından okunur ve arka uçtaki eklenti listesinde görüntülenir.

İlk eklentinizi oluşturun

Temel dosya yapısını oluşturun.

Öncelikle, eklentinin giriş dosyasını oluşturmanız gerekiyor. Bu dosyayı WordPress kurulum dizininizin altında bulunan…wp-content/plugins/Dosya içinde, örneğin, yeni bir klasör oluşturun.my-first-pluginBu klasörde, genellikle klasörün adıyla aynı olan bir ana PHP dosyası oluşturun. Örneğin:my-first-plugin.php

Tavsiye edilen okuma Sıfırdan Başlayın: İlk WordPress Eklentinizi Oluşturun

Plugin başlık bilgilerini yazın.

Bu ana dosyada, WordPress standartlarına uygun bir eklenti başlık yorumu eklemelisiniz. Bu, eklentinin WordPress tarafından tanınması ve etkinleştirilmesi için kritik öneme sahiptir.

UltaHost WordPress Sunucusu
30 gün iade garantisi, sınırsız bant genişliği ve veritabanı kullanımı, ücretsiz DDoS koruması; 3 yıllık abonelikte indirim (50%).
<?php
/**
 * Plugin Name:       我的第一个插件
 * Plugin URI:        https://example.com/my-first-plugin
 * Description:       这是一个用于演示的简单插件,它将在文章内容顶部添加一行文字。
 * Version:           1.0.0
 * Author:            你的名字
 * License:           GPL v2 or later
 * Text Domain:       my-first-plugin
 */

Bu yorum, eklentinin temel bilgilerini içermektedir. Bu dosyayı kaydettikten sonra, WordPress arayüzündeki “Eklentiler” sayfasında onu görebileceksiniz.

Basit bir işlevi gerçekleştirin.

Bundan sonra, bu eklentiye en basit özelliği ekleyeceğiz: Tüm makale içeriklerinin üstüne özelleştirilmiş bir metin satırı ekleyeceğiz. Bunun için şunları kullanabiliriz:the_contentBu filtre işlevi, bir “Filtre Kancası” (Filter Hook) aracılığıyla gerçekleştirilir.

function myplugin_add_text_to_content( $content ) {
    $custom_text = '<p>Bu metin, ilk eklentim tarafından eklenen selamlama mesajından oluşmaktadır!</p>';
    return $custom_text . $content;
}
add_filter( 'the_content', 'myplugin_add_text_to_content' );

Kodu ana eklenti dosyanıza ekleyin.my-first-plugin.phpBu adımları takip ederek eklentiyi kaydedip etkinleştirin. Artık, web sitesindeki herhangi bir gönderi veya sayfayı gezdiğinizde, belirtilen metin içeriğin en başında görünecektir. İşte en temel eklenti işlevinin nasıl gerçekleştirildiği.

Eklenti Geliştirme Temel Kavramları ve API’ler

“Hook mekanizmasını anlamak” (Understanding the Hook mechanism)

Kancalar (Hooks), WordPress eklenti geliştirmenin temelini oluşturur ve kodunuzun WordPress’in çekirdeğine veya diğer eklentilere entegre edilmesine olanak tanır. Kancalar esas olarak iki türe ayrılır: Eylemler (Actions) ve Filtreler (Filters).

Tavsiye edilen okuma WordPress Eklenti Geliştirmeyi Sıfırdan Nasıl Öğrenirsiniz: Kapsamlı Rehber ve Pratik Eğitim Kursu

Belirli bir zaman noktasında özel kodunuzu çalıştırmak için kullanılır. Örneğin,wp_footerBu özellik, sayfanın alt kısmında HTML veya betik kodlarını görüntülemenize olanak tanır. Bunu kullanarak sayfada istediğiniz içerikleri oluşturabilirsiniz.add_action()Bir eylemi monte etmek için bir fonksiyon kullanılır.

Filtreler, verilerin veritabanına veya tarayıcıya aktarılmasından önce değiştirilmesi için kullanılır. Örneğin, yukarıdaki örnekte kullanılan filtreler gibi…the_contentFiltreler, makale içeriğini değiştirmenize olanak tanır. Bunu yapmak için…add_filter()Bir fonksiyon kullanarak filtre ekleyebilirsiniz ve geri çağırma fonksiyonunuz değiştirilmiş değeri döndürmelidir.

Çekirdek veritabanı sınıflarını kullanın.

WordPress, güçlü bir veritabanı soyutlama sınıfı sunar.wpdbBu, veritabanıyla güvenli bir şekilde etkileşim kurmak için kullanılır. PHP’nin MySQL fonksiyonlarını doğrudan çağırmak yerine, bu genel nesneyi doğrudan kullanmalısınız.

hosting.com Paylaşımlı Barındırma
AMD EPYC CPU'lar, NVMe SSD depolama ve LiteSpeed ile yüksek performans, 7/24, 7x7 uzman şirket içi destek, SSL, kaba kuvvet, kötü amaçlı yazılım ve DDoS koruması dahil gelişmiş güvenlik önlemleri, 73%'ye kadar tasarruf

Örneğin, veritabanındaki bazı bilgileri sorgulamak istiyorsanız şu şekilde yapabilirsiniz:

global $wpdb;
$results = $wpdb->get_results( "SELECT id, name FROM {$wpdb->prefix}my_custom_table" );

Kullanırken dikkatli olun.$wpdb->prefixTablo öneklerinin doğruluğundan emin olun. Ekleme, güncelleme veya silme işlemleri sırasında mutlaka doğru önekleri kullanın.wpdbSunulan…insert()update()Bu yöntemler sayesinde veriler otomatik olarak dönüştürülür ve SQL enjeksiyon saldırıları önlenir.

Yönetim ayarları sayfasını oluşturun.

Eklentiler için bir arka plan ayarları sayfası oluşturmak, profesyonel eklentilerin temel gereksinimlerindendir. WordPress, farklı seviyelerde menü öğeleri ve sayfalar eklemek için çeşitli API fonksiyonları sunar ve en yaygın olarak kullanılanlar bunlardır.add_menu_page()add_options_page()

Tavsiye edilen okuma WooCommerce Uygulama Rehberi: Sıfırdan profesyonel bir e-ticaret web sitesi oluşturma.

Aşağıda, üst düzey bir menü ve basit ayar sayfası eklenmiş bir örnek bulunmaktadır:

function myplugin_add_admin_menu() {
    add_menu_page(
        '我的插件设置',        // 页面标题
        '我的插件',            // 菜单标题
        'manage_options',      // 所需权限
        'myplugin-settings',   // 菜单Slug
        'myplugin_settings_page', // 回调函数,用于输出页面HTML
        'dashicons-admin-generic', // 图标
        6                      // 菜单位置
    );
}
add_action( 'admin_menu', 'myplugin_add_admin_menu' );

function myplugin_settings_page() {
    ?&gt;
    <div class="wrap">
        <h1>Eklenti ayarlarım.</h1>
        <form method="post" action="/tr/options.php/" data-trp-original-action="options.php">
            <?php
                settings_fields( 'myplugin_settings_group' );
                do_settings_sections( 'myplugin-settings' );
                submit_button();
            ?>
        <input type="hidden" name="trp-form-language" value="tr"/></form>
    </div>
    &lt;?php
}

Bu örnek, “Benim Eklentim” adında bir üst düzey menü oluşturur ve buna tıklandığında ilgili içerik açılır.myplugin_settings_pageWordPress’in Ayarlar (Settings) API’si ile birlikte kullanılan, fonksiyonlar tarafından oluşturulan sayfalar.register_setting, add_settings_section, add_settings_fieldAyarları güvenli bir şekilde işlemek ve kaydetmek için bu yöntem kullanılır.

InterServer Paylaşımlı Barındırma
Paylaşımlı hosting aylık $2.50 USD, ilk ay $0.1 USD promosyon kodu tryinterserver, 461 bulut uygulaması komut dosyası, tek tıklamayla yükleme.

Proje Uygulaması: Bir Notlar Yönetim Eklentisi Geliştirme

Bu bölümde, yukarıda bahsedilen bilgileri kapsamlı bir şekilde kullanarak, makale düzenleme sayfasında kullanılabilecek basit bir “not” özelliği oluşturacağız. Bu eklenti, editörlerin makalelere özel iç notlar eklemesine olanak tanır.

Özel bir veritabanı tablosu oluşturun.

Öncelikle, eklenti etkinleştirildiğinde, notları saklamak için yeni bir veritabanı tablosu oluşturmamız gerekiyor. Bu, bir etkinleştirme işlemi (activation hook) kaydederek yapılabilir.register_activation_hookGerçekleştirmek için.

function my_note_plugin_activate() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'post_notes';
    $charset_collate = $wpdb->get_charset_collate();

$sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        post_id bigint(20) NOT NULL,
        note_content text NOT NULL,
        created_by bigint(20) NOT NULL,
        created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY  (id)
    ) $charset_collate;";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
}
register_activation_hook( __FILE__, 'my_note_plugin_activate' );

Burada, biz…dbDelta()Fonksiyonlar, tablo yapılarını oluşturmak veya güncellemek için kullanılır. Bu, güvenli ve iyi bir uyumluluk sunan bir yöntemdir.

Makale düzenleme arayüzüne bir meta kutusu ekleyin.

Bundan sonra, makale düzenleme sayfasına notları göstermek ve kaydetmek için bir metin kutusu eklememiz gerekiyor. Bunun için şu adımları izlememiz gerekecek:add_meta_boxBu fonksiyonu oluşturun ve ardından onu uygun yere monte edin.add_meta_boxesHareket açısından.

function my_note_add_meta_box() {
    add_meta_box(
        'my_note_meta_box',         // 元框的唯一ID
        '文章内部便签',             // 显示的标题
        'my_note_meta_box_callback', // 渲染元框内容的回调函数
        'post',                     // 要显示的帖子类型
        'side',                     // 位置
        'default'                   // 优先级
    );
}
add_action( 'add_meta_boxes', 'my_note_add_meta_box' );

function my_note_meta_box_callback( $post ) {
    // 从数据库获取当前文章的已有便签
    global $wpdb;
    $table_name = $wpdb-&gt;prefix . 'post_notes';
    $notes = $wpdb-&gt;get_results( $wpdb-&gt;prepare( "SELECT * FROM $table_name WHERE post_id = %d ORDER BY created_at DESC", $post-&gt;ID ) );

wp_nonce_field( 'my_note_save_action', 'my_note_nonce_field' );
    echo '<textarea name="my_new_note" rows="5" style="width:100%;" placeholder="İç notlarınızı girin..."></textarea>'echo '<p class="description">Bu not yalnızca web sitesi editörleri ve yöneticileri tarafından görülebilir.</p>';

if ( $notes ) {
        echo '<hr><h4>Tarihi Notlar:</h4>';
        foreach ( $notes as $note ) {
            $user = get_user_by( 'id', $note-&gt;created_by );
            $username = $user ? $user-&gt;display_name : '未知用户';
            echo '<p><strong>' . esc_html( $username ) . ' (' . $note-&gt;created_at . '):</strong><br>';
            echo nl2br( esc_html( $note-&gt;note_content ) ) . '</p>';
        }
    }
}

Verileri kaydetmek ve temizlemek

Makale kaydedildiğinde veya güncellendiğinde, yeni notları veritabanına eklememiz gerekiyor. Bu, aşağıdaki yöntemlerle gerçekleştirilebilir:save_postBu işlem, belirli eylemlerin gerçekleştirilmesiyle sağlanır. Aynı zamanda, eklenti silindiğinde (isteğe bağlı olarak), bir kaldırma mekanizması (uninstall hook) da sağlamamız gerekmektedir.register_uninstall_hookOluşturulan veri tablolarını temizlemek için geliyoruz.

function my_note_save_post_data( $post_id ) {
    // 检查非ce、权限、自动保存等
    if ( ! isset( $_POST['my_note_nonce_field'] ) || ! wp_verify_nonce( $_POST['my_note_nonce_field'], 'my_note_save_action' ) ) {
        return;
    }
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }

if ( ! empty( $_POST['my_new_note'] ) ) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'post_notes';

$wpdb->insert(
            $table_name,
            array(
                'post_id' => $post_id,
                'note_content' => sanitize_textarea_field( $_POST['my_new_note'] ),
                'created_by' => get_current_user_id(),
            ),
            array( '%d', '%s', '%d' )
        );
    }
}
add_action( 'save_post', 'my_note_save_post_data' );

// 可选:卸载插件时删除数据表
function my_note_plugin_uninstall() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'post_notes';
    $wpdb->query( "DROP TABLE IF EXISTS $table_name" );
}
register_uninstall_hook( __FILE__, 'my_note_plugin_uninstall' );

En İyi Uygulamalar ve Yayın Hazırlığı

WordPress kodlama standartlarına uyun.

Kodun okunabilirliğini, sürdürülebilirliğini ve diğer eklentilerle uyumluluğunu sağlamak için lütfen WordPress’in resmi PHP kodlama standartlarına sıkı sıkıya uyun. Bunlar arasında, doğru girintilerin kullanılması (boşluk yerine tab karakterleri), fonksiyon adları ve değişken adlarının küçük harfler ve alt çizgilerle ayrılarak yazılması (snake_case), sınıf adlarının büyük harfler ve boşluklarla yazılması (UpperCamelCase) ve çevrilebilir tüm metinler için uluslararasılaştırma fonksiyonlarının kullanılması yer alır.

Uluslararasılaştırmayı gerçekleştirmek

Mükemmel ve yaygın olarak kullanılması beklenen bir eklenti, uluslararasılaştırmayı (internationalization) desteklemelidir. Bu, kullanıcıya yönelik tüm metinlerin çeviri fonksiyonları içinde yer alması gerektiği anlamına gelir.

WordPress sunmaktadır.__()_e()_n()Bir dizi fonksiyon… Öncelikle, eklentinin başlık bilgilerinde bunları doğru bir şekilde ayarlamalısınız.Text Domain(Örneğin: `my-first-plugin`), ardından her string çıktısı veya kullanımında bu string’i uygun şekilde sarın (wrap).

Örnek:

`echo '`'<p>' . esc_html__( '这是一个演示文本。', 'my-first-plugin' ) . '</p>';

Daha sonra, Poedit gibi bir araç kullanarak tüm metni çıkarabilir ve bunu kullanarak yeni bir dosya oluşturabilirsiniz..potDosya, çevirmenler tarafından farklı dillere çevrilmek üzere kullanılır..mo.poDosya.

Güvenlik ve Performans Optimizasyonu

Güvenlik, eklenti geliştirmede en önemli husustur. Kullanıcı girdilerini her zaman doğrulayın ve temizleyin (sanitizasyon), çıktıları ise uygun şekilde işleyin (escaping). SQL sorgularında mutlaka bunlara dikkat edin.prepare()Enjeksiyonları önlemek için ifadeler kullanılır. Bir işlem gerçekleştirilmeden önce, kullanıcı yetkileri kontrol edilmelidir.current_user_can()CE (Canonical Entity) olmayan durumlar için, WordPress’in kendi non-CE mekanizmasını kullanın.wp_nonce_field(), wp_verify_nonce())。

Performans açısından, veritabanı sorgularını optimize edin ve döngüler içinde sorgu çalıştırmaktan kaçının. WordPress’in “Transients” API’sini önbellekleme amacıyla mantıklı bir şekilde kullanın. Eklenti bağlantı noktalarına (hooks) ihtiyaç duyulmadığında, bunları zamanında kaldırın.remove_action(), remove_filter()Son olarak, eklenti dizininde yalnızca gerekli dosyalar bulunmalı ve kod yayınlanmadan önce sıkıştırılmalı ve temizlenmelidir.

WordPress deposuna yayınlamaya hazırlanıyor.

Eğer eklentiyi resmi WordPress eklenti dizinine yayınlamayı planlıyorsanız, bir dizi hazırlık işlemi yapmanız gerekecektir. Öncelikle, eklentinin açık ve anlaşılır bir adı olması önemlidir. Ayrıca, eklentinin kullanım kılavuzunun (dokümantasyonunun) eksiksiz ve net olması gerekir. Eklentinin tüm işlevlerinin doğru bir şekildereadme.txtDosya, WordPress standartlarına uygun bir formatta hazırlanmıştır. Bu dosya, eklentinin açıklamasını, kurulum rehberini, sık sorulan soruları (FAQ’ları), sürüm güncelleme kayıtlarını vb. içermelidir. Ayrıca, ana eklenti dosyasının başlık bilgilerinin tam ve doğru olduğundan emin olun. Eklentinizin farklı ortamlarda ve farklı WordPress sürümlerindeki uyumluluğunu kapsamlı bir şekilde test edin.

Özetle.

WordPress eklenti geliştirme, fikirleri güçlü işlevlere dönüştüren yaratıcı bir süreçtir. Eklentilerin temel yapısını anlayarak, “Eylemler” (Actions) ve “Filtreler” (Filters) gibi temel mekanizmaları kavrayıp, “Ayarlar API’si” (Settings API), veritabanı işlemleri gibi temel özellikleri ustaca kullanarak basit araçlardan karmaşık çözümlere kadar çeşitli eklentiler oluşturabilirsiniz. Tüm geliştirme süreci boyunca güvenlik, performans, kod standartları ve uluslararasılaştırma (internationalization) ilkelerini her zaman temel alın. İlk “Hello World” eklentinizi oluşturarak başlayın ve adım adım pratik yapın; sonunda profesyonel seviyede, yayınlanabilir WordPress eklentileri geliştirebileceksiniz.

Sıkça Sorulan Sorular.

Eklenti geliştirme için hangi teknolojileri bilmek gerekiyor?

Sağlam bir PHP temeline sahip olmanız gerekmektedir; temel HTML, CSS ve JavaScript bilgilerine aşina olmanız önemlidir. MySQL veritabanı hakkında da temel bir bilgiye sahip olmanız faydalı olacaktır. En önemlisi, WordPress’in temel yapısını, özellikle de “Hook” mekanizmasını ve “Şablon Yapısını” (Template Hierarchy) anlamanız gerekmektedir. Nesne Yönelimli Programlama (Object-Oriented Programming – OOP) bilgisi, karmaşık eklentiler oluştururken büyük yardımcı olacaktır.

Eklentilerin ve temaların fonksiyonları arasında ne fark var?

Eklentiler, bir web sitesinin işlevlerini eklemek veya değiştirmek için kullanılır ve teorik olarak web sitesinin görünümünden ayrı olmalıdır. Yüksek derecede taşınabilir olmaları gerekir; böylece tema değiştirildiğinde bile eklentiler çalışmaya devam edebilir. Temalar, esas olarak web sitesinin görünümünü ve düzenini kontrol eder; ancak modern temalar genellikle çok sayıda işlevsel kod içerir (ki bu iyi bir uygulama olarak kabul edilmez). En iyi uygulama şudur: Eğer bir işlev görünümle yakından ilgiliyse, tema içinde yer alabilir; ancak genel veya bağımsız bir işlev ise, bir eklenti olarak oluşturulmalıdır.

Eklentilerin güncellemeleri ve uyumluluğu ile nasıl ilgilenilir?

Güncellemeleri işlemek için, eklentinin baş kısmındaki yorumları (commentary) güncellemeniz gerekiyor.VersionAlanlar (Fields): Önemli güncellemeler için WordPress’in güncelleme bildirim mekanizmasını ve yükseltme araçlarını kullanmayı düşünebilirsiniz. Uyumluluğu sağlamanın anahtarı, WordPress çekirdek API’sine sıkı sıkıya uygun olarak geliştirme yapmaktır; özel veya kullanımdan kaldırılmış fonksiyonları kullanmaktan kaçının.readme.txtDosyada, eklentinin desteklediği en düşük WordPress sürümü açıkça belirtilmiştir. Yeni bir sürüm yayınlamadan önce, eklentinin çeşitli WordPress sürümlerinde kapsamlı bir şekilde test edilmesi şarttır.

Eklentiler, CSS ve JavaScript dosyalarını nasıl yüklemelidir?

PHP eklenti dosyalarında asla doğrudan CSS veya JS kodları içe yazılmamalıdır. Uyumluluk ve performansı sağlamak için, betikleri ve stil şemalarını doğru bir şekilde yüklemek amacıyla WordPress’in `enqueue` fonksiyonu kullanılmalıdır. Bu işlem arka planda gerçekleştirilmelidir.admin_enqueue_scriptsKancalar, ön tarafta (frontend) kullanılır.wp_enqueue_scriptsKancalar. Kullanın.wp_enqueue_style()wp_enqueue_script()Fonksiyonları kullanırken, bağımlılıkları ve sürüm numaralarını dikkate alın.

Eklentime nasıl özel makale türleri veya özel kategoriler ekleyebilirim?

Özel makale türleri (Custom Post Types - CPT) eklemek ve kullanmak için şu adımları izleyin:register_post_type()Fonksiyonlara özel sınıflandırma yöntemleri eklemek için…register_taxonomy()Fonksiyonlar. En iyi uygulama, bu kayıt işlemlerini belirli bir yerde toplamaktır.initEylem kancaları (action hooks) içinde yürütülür. Kayıt parametreleri dizisini dikkatlice yapılandırmanız gerekir; bu dizide etiketler, erişilebilirlik, desteklenen özellikler, arşiv sayfasının olup olmadığı gibi bilgiler bulunur. Bu parametreler, hem arka planda hem de kullanıcı arayüzünde (front-end) neler olacağını belirler.