WordPress Polylang REST API Dil Filtreleme Sorunu ve Çözümü
WordPress Polylang REST API Dil Filtreleme Sorunu ve Çözümü Giriş WordPress'te çok dilli website geliştirirken en popüler eklentilerden biri Polylang'dir. Ancak Polylang'in ücretsiz versiyonunu kullanırken REST API ile çalışırken karşılaştığımız en büyük sorunlardan biri, API'nin tüm dillerdeki yazıları döndürmesidir. Bu durum özellikle headless WordPress veya frontend framework'leri kullanırken büyük bir problem oluşturur. Problem Nedir? Polylang […]

Batuhan Özen
30.06.2025
- WordPress Polylang REST API Dil Filtreleme Sorunu ve Çözümü
Giriş
WordPress'te çok dilli website geliştirirken en popüler eklentilerden biri Polylang'dir. Ancak Polylang'in ücretsiz versiyonunu kullanırken REST API ile çalışırken karşılaştığımız en büyük sorunlardan biri, API'nin tüm dillerdeki yazıları döndürmesidir. Bu durum özellikle headless WordPress veya frontend framework'leri kullanırken büyük bir problem oluşturur.
Problem Nedir?
Polylang eklentisini yükledikten sonra, WordPress REST API endpoint'lerini çağırdığınızda (/wp-json/wp/v2/posts
), varsayılan olarak tüm dillerdeki yazılar döner. Bu durum:
- Gereksiz veri transferine neden olur
- Frontend'te manuel filtreleme gerektirir
- Performans sorunları yaratır
- UX açısından kafa karıştırıcıdır
Polylang Pro versiyonunda bu sorun çözülmüş durumda, ancak ücretsiz versiyonda bu özellik bulunmuyor.
Çözüm: Custom Plugin Geliştirme
Bu sorunu çözmek için basit ama etkili bir custom plugin geliştirebiliriz:
// REST API query'sine dil filtresi ekleme add_filter('rest_post_query', function ($args, $request) { $lang = $request->get_param('lang'); if ($lang) { $args['lang'] = $lang; } return $args; }, 10, 2);
// Diğer post type'lar için de destek add_filter('rest_page_query', function ($args, $request) { $lang = $request->get_param('lang'); if ($lang) { $args['lang'] = $lang; } return $args; }, 10, 2);
// Custom post type'lar için genel çözüm add_filter('rest_pre_get_posts', function ($query, $request) { $lang = $request->get_param('lang'); if ($lang && function_exists('pll_languages_list')) { $available_langs = pll_languages_list(); if (in_array($lang, $available_langs)) { $query->set('lang', $lang); } } return $query; }, 10, 2);
Kullanım Örnekleri
Plugin aktif olduktan sonra REST API çağrılarınızı şu şekilde yapabilirsiniz:
JavaScript ile Kullanım
// Sadece Türkçe yazıları getir fetch('/wp-json/wp/v2/posts?lang=tr') .then(response => response.json()) .then(data => console.log(data));
// İngilizce sayfaları getir
fetch('/wp-json/wp/v2/pages?lang=en') .then(response => response.json()) .then(data => console.log(data));
PHP ile Kullanım
$response = wp_remote_get(
site_url('/wp-json/wp/v2/posts?lang=tr')
);
$posts = json_decode(wp_remote_retrieve_body($response));
Ek Özellikler
Plugin'i daha da geliştirmek için şu özellikleri ekleyebilirsiniz:
Varsayılan Dil Desteği
add_filter('rest_pre_get_posts', function ($query, $request) { $lang = $request->get_param('lang');
// Eğer dil belirtilmemişse varsayılan dili kullan if (!$lang && function_exists('pll_default_language')) { $lang = pll_default_language(); } if ($lang) { $query->set('lang', $lang); } return $query;
}, 10, 2);
Dil Validasyonu
function validate_language_parameter($lang) { if (!function_exists('pll_languages_list')) { return false; }
$available_langs = pll_languages_list(); return in_array($lang, $available_langs);
}
Performans İyileştirmeleri
Bu çözüm performans açısından da önemli avantajlar sağlar:
- Veri Transfer Azaltma: Sadece gerekli dildeki içerik transfer edilir
- Veritabanı Optimizasyonu: Polylang'in built-in query optimizasyonları kullanılır
- Cache Dostu: Dil bazlı cache stratejileri uygulanabilir
Sonuç
Bu basit ama etkili çözüm ile Polylang'in ücretsiz versiyonunda REST API dil filtreleme sorununu çözebilirsiniz. Plugin, minimal kod ile maksimum etki sağlar ve tüm post type'lar için çalışır.
Headless WordPress projelerinizde bu yaklaşımı kullanarak daha temiz ve performanslı API çağrıları yapabilir, frontend geliştirme sürecinizi hızlandırabilirsiniz.
Bu makale DBSoft Tech Blog için hazırlanmıştır.
Etiketler
Bu yazı için etiket bulunmuyor.