Blog
WordPress Eklenti Güvenliği ve Performansı: Sağlam Geliştirme için Pratik Adımlar
WordPress eklentilerinizi sanitizasyon, nonce'ler, önbellekleme ve uluslararasılaştırma en iyi uygulamalarıyla güvenceye alın ve optimize edin.

Özet
Birçok WordPress eklentisi, göz ardı edilen en iyi uygulamalar nedeniyle güvenlik açıkları ve performans darboğazları oluşturur. Bu makale, eklenti kodunuzu sağlamlaştırmak ve hızı artırmak için somut adımlar sunar. Tüm verileri sanitize etmeyi ve kaçış karakterleriyle temizlemeyi, CSRF'yi önlemek için nonce kullanmayı, önbellekleme ile veritabanı sorgularını en aza indirmeyi, geçici veriler (transient) uygulamayı ve dizelerinizi doğru şekilde uluslararasılaştırmayı öğreneceksiniz. Her bölüm, yaygın tuzaklardan kaçınmak için kod örnekleri ve uyarılar içerir. Bu yönergeleri izleyerek güvenli, hızlı ve küresel olarak erişilebilir eklentiler sunabilirsiniz. Makale, temel eklenti geliştirme bilgisi varsayar ancak prodüksiyon seviyesinde cilalamaya odaklanır.
Giriş
Yerel ortamınızda harika çalışan bir WordPress eklentisi oluşturdunuz. Ancak canlıya çıktığında kullanıcılar yavaşlık veya daha kötüsü bir güvenlik ihlali bildirir. Hobi eklentisi ile sağlam bir eklenti arasındaki fark genellikle WordPress'in güvenlik, performans ve uluslararasılaştırma için belirlenmiş en iyi uygulamalarını takip etmekten gelir. Bunlar isteğe bağlı ekstralar değil—genel kullanıma sunulacak herhangi bir eklenti için olmazsa olmazlardır. Bu kılavuz, pratik adımlar, gerçek örnekler ve deneyimli geliştiricilerin bile takıldığı uyarılarla üç kritik alanı ele alır.
1. Kurşun Geçirmez Güvenlik: Sanitize Et, Kaçış Karakteri Uygula ve Doğrula
Güvenlik, hiçbir girdiye güvenmemekle başlar. Eklentinize bir kullanıcıdan, API'den veya veritabanından giren her veri parçası sanitize edilmelidir. Benzer şekilde, eklentinizden çıkan (ekranda görüntülenen) her veri kaçış karakterleriyle temizlenmelidir. Buradaki en basit hata SQL enjeksiyonu, XSS saldırıları veya yetkisiz eylemlere yol açabilir.
Girdide Sanitizasyon
WordPress'in yerleşik sanitizasyon fonksiyonlarını kullanın: sanitize_email(), sanitize_text_field(), absint(). Örneğin, bir kullanıcının takma adını kaydederken:
$nickname = sanitize_text_field( $_POST['nickname'] );
update_user_meta( $user_id, 'custom_nickname', $nickname );
$_POST veya $_GET'i asla ham olarak kullanmayın. Her zaman bir filtreden geçirin.
Çıktıda Kaçış Karakterleri
Veri çıktılarken esc_html(), esc_url(), esc_attr() ve wp_kses_post() kullanın. Örneğin:
echo '<a href="' . esc_url( $url ) . '">' . esc_html( $title ) . '</a>';
WordPress Eklenti Öneklerinde Ustalaşmak: Adlandırma Çakışmalarını Önlemek için Pratik Bir Kılavuz makalesi, başka bir kritik güvenlik unsurunu ele alır—çakışmaları önlemek için fonksiyon adlarınızı ve seçeneklerinizi öneklerle adlandırma.
CSRF Koruması için Nonce'ler
Her form veya AJAX isteği, wp_nonce_field() veya wp_create_nonce() ile oluşturulmuş bir nonce içermelidir. Gönderimde wp_verify_nonce() ile doğrulayın. Örnek:
// Formda:
wp_nonce_field( 'save_settings', 'myplugin_nonce' );
// Kaydetme sırasında:
if ( ! isset( $_POST['myplugin_nonce'] ) || ! wp_verify_nonce( $_POST['myplugin_nonce'], 'save_settings' ) ) {
wp_die( 'Güvenlik kontrolü başarısız.' );
}
Uyarı: Nonce'ler varsayılan olarak 12 saat sonra geçerliliğini yitirir. Uzun süreli formlar (örneğin günlerce açık kalan yönetici sayfaları) için nonce_life filtresi ile ömrü artırmayı düşünün, ancak ödünleşimi anlayın.
2. Performansı Artırın: Daha Akıllı Sorgular ve Önbellekleme
Yavaş bir eklenti kullanıcıları hayal kırıklığına uğratır ve SEO'ya zarar verir. En büyük performans katilleri gereksiz veritabanı sorguları ve önbellekleme eksikliğidir. İşte her ikisini de düzeltmenin yolu.
Veritabanı Sorgularını En Aza İndirin
WP_Query'yi akıllıca kullanın. query_posts() çağırmaktan kaçının—ana sorguyu değiştirir ve kullanımdan kaldırılmıştır. Bunun yerine, ana sorguyu değiştirmek için pre_get_posts filtresini kullanın. Özel sorgular için sonuçları Transients API veya Object Cache ile önbelleğe alın.
Örnek: Son yazıları saatte bir getirin:
$recent = get_transient( 'myplugin_recent_posts' );
if ( false === $recent ) {
$recent = new WP_Query( array(
'posts_per_page' => 5,
'no_found_rows' => true, // bir sorguyu kaydeder
) );
set_transient( 'myplugin_recent_posts', $recent, HOUR_IN_SECONDS );
}
Verimli eklenti mimarisi için bkz. Sağlam WordPress Eklentileri Oluşturmak: En İyi Uygulamalar için Pratik Bir Kılavuz.
Transients ve Object Cache Kullanın
Transients, geçici verileri süreli olarak veritabanında saklar. Yüksek trafikli siteler için kalıcı bir nesne önbelleği (Redis, Memcached) ile wp_cache_set()/wp_cache_get() kullanın. Ayarlamadan önce her zaman varlığını kontrol edin.
Uyarı: Nesne önbelleği yoksa Transients veritabanına dayanır. Büyük veriler için özel tablolar veya harici önbellekleme düşünün. Ayrıca, önbellek anahtarlarınızın benzersiz olduğundan emin olun—her zaman önek ekleyin.
Veritabanı Optimizasyonu
SELECT *'dan kaçının. Yalnızca gerekli alanları'fields' => 'ids'ile alın.update_meta_cache()vewp_cache_delete()'i stratejik olarak kullanın.- Büyük veri kümeleri için indekslenmiş sorgularla doğrudan
wpdb::prepare()kullanın.
3. Uluslararasılaştırma: Eklentinizi Kullanıcının Dilinde Konuşturun
Uluslararasılaştırmayı atlarsanız, WordPress topluluğunun büyük bir kısmını dışarıda bırakırsınız. Doğru uluslararasılaştırma, WordPress fonksiyonlarıyla basittir.
Dizeleri __() ve _e() ile Sarın
Dönüş değeri için __( 'String', 'textdomain' ), echo için _e() kullanın. Örnek:
echo '<h2>' . esc_html__( 'Ayarlar', 'myplugin' ) . '</h2>';
Textdomain Yükleyin
Ana eklenti dosyanızda init veya plugins_loaded hook'una bağlanın:
function myplugin_load_textdomain() {
load_plugin_textdomain( 'myplugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}
add_action( 'plugins_loaded', 'myplugin_load_textdomain' );
.pot Dosyası Sağlayın
Kaynak kodunuzdan bir .pot dosyası oluşturmak için Poedit gibi bir araç kullanın. Bunu /languages klasörüne ekleyin. Bu, çevirmenlerin .po/.mo dosyaları oluşturmasını sağlar.
Uyarı: Textdomain veya çevrilebilir dize için değişken kullanmayın—WordPress dinamik dizeleri ayrıştıramaz. Her zaman sabit dizeler kullanın.
Hook'lar, dizeleri filtrelenebilir hale getirebildiğiniz için uluslararasılaştırmada önemli bir rol oynar. Gelişmiş hook kullanımı için WordPress Hook'larında Ustalaşmak: Geliştiricilerin Özelleştirme Kılavuzu bölümüne göz atın.
4. Test ve Dağıtım: Son Cila
Yukarıdakilerin hepsine rağmen, eklentinizi bir test ortamında test etmelisiniz. WP_DEBUG, Query Monitor ve otomatik testler gibi araçları kullanın. Eklentinizin WordPress Eklenti El Kitabı'na uygun olduğundan emin olun.
- Güvenlik testi: Wordfence gibi bir eklenti kullanın veya manuel sızma testi yapın.
- Performans testi: Query Monitor veya Xdebug ile profil oluşturun.
- Çeviri testi: WordPress dilini değiştirin ve dizelerin çevrildiğini doğrulayın.
Dağıtmadan önce kodunuzda sabit kodlanmış dizeler, eksik nonce'ler veya kaçış karakterleri uygulanmamış çıktı olup olmadığını kontrol edin. Kapsamlı bir kod incelemesi, otomatik testlerin kaçırdığı sorunları yakalayabilir.
Sonuç
Profesyonel bir WordPress eklentisi oluşturmak, ayrıntılara dikkat etmek anlamına gelir—güvenlik, performans ve uluslararasılaştırma. Tüm girdileri sanitize edin, tüm çıktıları kaçış karakterleriyle temizleyin ve eylemleri nonce'lerle doğrulayın. Veritabanı yükünü azaltmak için agresif önbellekleme yapın ve kalıcı depolama için transients kullanın. Kullanıcıya yönelik her dizeyi uluslararasılaştırma fonksiyonlarıyla sarın ve bir .pot dosyası sağlayın. Bu uygulamalar birkaç ekstra kod satırı ekleyebilir, ancak size sayısız saat hata ayıklama süresi kazandıracak ve kullanıcılarınızı koruyacaktır. Adlandırma kuralları hakkında daha derinlemesine bilgi için WordPress Hook Mimarisi: Eylemler ve Filtreler Açıklaması kılavuzuna bakın. Bu adımları bugün uygulamaya başlayın ve eklentiniz WordPress deposu ve binlerce mutlu kullanıcı için hazır olsun.
Sources (5)
- WordPress Architecture: A Complete Guide - Liquid Web
- WordPress plugin best practices, my three golden Rules - Daniel Auener
- Best Practices – Plugin Handbook - WordPress Developer Resources
- Modern approach to WordPress plugin development | by Gabriele Bellini - Medium
- WordPress Full Site Editing - Human Made
