
Çok dilli bir blog oluşturmak için en iyi eklentinin hangisi olduğu konusunda farklı görüşler olmasına ve hepsinin görevi basitleştiren ve kolaylaştıran ilk sürümlerinden bu yana çok gelişmesine rağmen, en çok kullanılanlardan biri Polylang'dır.
Bugüne kadar 700.000'den fazla aktif kurulumla en hafif ve en etkili seçeneklerden biri olmaya devam ediyor.
Burada, bir noktada yararlı olabilecek işlevler ve filtreler içeren küçük bir parçacık listesi bulunmaktadır. Hepsi Polylang'ın ücretsiz sürümü için çalışır ve burada test edilmiş ve/veya kullanılmıştır.
Polylang'ın ücretsiz sürümünü kullanarak orijinal gönderideki içeriği kopyalayın
WordPress için Polylang eklentisinin ücretsiz sürümünü kullanıyorsanız, çeviri için oluşturduğu yeni sayfa veya yazının orijinal içeriği kopyalamadığını zaten biliyorsunuzdur. Bu, ücretli sürümünün özelliklerinden biridir ve ücretsiz sürümde içeriği elle yapıştırmanız gerekir.
Bunu çözmek ve süreci hızlandırmak için, bu işlevleri şablonunuzun functions.php dosyasına eklemeniz yeterlidir. Artık yeni bir çeviri eklediğinizde orijinal kopyalanmış içerikle (başlık ve içerik) açılacaktır.
// Copying content when creating a translation with Polylang
function jb_editor_content( $content ) {
// Polylang sets the 'from_post' parameter
if ( isset( $_GET['from_post'] ) ) {
$my_post = get_post( $_GET['from_post'] );
if ( $my_post )
return $my_post->post_content;
}
return $content;
}
add_filter( 'default_content', 'jb_editor_content' );
// Copy title when creating a translation with Polylang
function jb_editor_title( $title ) {
// Polylang sets the 'from_post' parameter
if ( isset( $_GET['from_post'] ) ) {
$my_post = get_post( $_GET['from_post'] );
if ( $my_post )
return $my_post->post_title;
}
return $title;
}
add_filter( 'default_title', 'jb_editor_title' );
*ThissnippetAralık 2020 tarihli bir notta bulundu. Hala çalışıyor olsa da, zamanla ve gelecekteki Polylang güncellemeleriyle başarısız olma ihtimaline karşı bir göz atmaktan zarar gelmez.
Her dilde Polylang ile çevrilen toplam gönderi sayısını göster
Bu işlev, Polylang eklentisi ile eklenen çevirilerin bulunduğu bir dilde yayınlanan toplam gönderi sayısını gösterecek her dil için bir kısa kod eklemenize olanak tanır.
Bu işlev istatistik sayfamda test edilmiş ve düzgün çalışmaktadır ve otomatik olarak güncellenen sayaçların bir listesini tutmak için kullanışlıdır.
Parçacık şablonun functions.php dosyasına eklenir:
// Function to display number of published posts by language for Polylang
function polylang_post_count_by_language($atts) {
// Atributos del shortcode
$atts = shortcode_atts(array(
'lang' => '', // Código de idioma (ej: 'es', 'en', etc.)
), $atts, 'post_count_by_lang');
// Check if Polylang is active
if (!function_exists('pll_languages_list')) {
return 'Polylang plugin is not active.';
}
// Get the language code
$lang = $atts['lang'];
if (empty($lang)) {
return 'Language code is required.';
}
// Single key for transient
$transient_key = 'post_count_by_lang_' . $lang;
// Trying to get the count from the cache
$post_count = get_transient($transient_key);
// If there is no cache, perform the query
if (false === $post_count) {
// Configure the query to count posts by language
$args = array(
'lang' => $lang,
'post_type' => 'post', // Type of post (you can change it if necessary)
'post_status' => 'publish', // Only published posts
'fields' => 'ids', // Only obtain IDs to reduce the burden
'numberposts' => -1, // All posts
);
// Make an enquiry
$query = new WP_Query($args);
// Get the total number of posts
$post_count = $query->found_posts;
// Cache for 12 hours (43200 seconds)
set_transient($transient_key, $post_count, 43200);
}
// Return the number of posts
return $post_count;
}
add_shortcode('post_count_by_lang', 'polylang_post_count_by_language');
Burada karşılaştığımız sorunlardan biri, bu blogda olduğu gibi sitenizde birçok farklı dilde çok sayıda gönderi varsa, veritabanı sorgusunun etkisinin yükleme hızını yavaşlatabilmesidir. Kod bunu dikkate alır ve sorgu, tüm yazı nesnelerini yüklemeyerek bellek yükünü azaltmak için alanlar => 'ids' ile WP_Query kullanılarak optimize edilir.
Gönderi sayısı set_transient kullanılarak saklanır ve tekrarlayan veritabanı sorgularını önler. Örnekte, önbellek her 12 saatte bir güncellenir ve saniye cinsinden ifade edilir (bu süreyi ihtiyaçlarınıza göre ayarlayabilirsiniz).
Sorguyu optimize etmek için, found_posts'a erişmek için get_posts yerine WP_Query kullanılır, bu da tüm nesneleri yüklemeye gerek kalmadan toplam gönderi sayısını döndürür.
fields => 'ids' parametresi, yalnızca gönderi kimliklerini alarak bellek yükünü azaltır.
Bir noktada önbelleği manuel olarak temizlemeniz gerekiyorsa (örneğin yeni bir gönderi yayınladıktan sonra) eski verileri göstermemesi için kullanabilirsiniz:
delete_transient('post_count_by_lang_' . $lang);
Bu işlemi otomatikleştirmeyi tercih ederseniz, aşağıdaki işlev bir gönderi her yayınlandığında, güncellendiğinde veya silindiğinde geçiciyi silecektir. Bunu şablonunuzun functions.php dosyasına eklerseniz, kanca tüm bu eylemler için etkinleştirilecektir:
//Deleting the transient when publishing, updating or deleting a post
function clear_post_count_transient($post_id) {
// Check if the post is of type 'post' (or the type you are counting).
if (get_post_type($post_id) === 'post') {
// Get the language of the post using Polylang
if (function_exists('pll_get_post_language')) {
$lang = pll_get_post_language($post_id);
// If the language is obtained, delete the corresponding transient.
if ($lang) {
delete_transient('post_count_by_lang_' . $lang);
}
}
}
}
add_action('save_post', 'clear_post_count_transient'); // When publishing or updating
add_action('delete_post', 'clear_post_count_transient'); // By deleting
Ve bu, önbelleği bir dizi farklı olası senaryoya göre(yukarıdaki dahil) otomatik olarak temizler:
// Function to delete the transient when necessary
function clear_post_count_transient($post_id) {
if (get_post_type($post_id) === 'post') {
if (function_exists('pll_get_post_language')) {
$lang = pll_get_post_language($post_id);
if ($lang) {
delete_transient('post_count_by_lang_' . $lang);
}
}
}
}
add_action('save_post', 'clear_post_count_transient');
add_action('delete_post', 'clear_post_count_transient');
//Function to delete transient when changing the language of a post
function clear_post_count_transient_on_language_change($post_id, $lang) {
$old_lang = pll_get_post_language($post_id);
if ($old_lang) {
delete_transient('post_count_by_lang_' . $old_lang);
}
if ($lang) {
delete_transient('post_count_by_lang_' . $lang);
}
}
add_action('pll_save_post', 'clear_post_count_transient_on_language_change', 10, 2);
// Function to delete all transients when uninstalling or deactivating Polylang
function clear_all_post_count_transients() {
if (function_exists('pll_languages_list')) {
$languages = pll_languages_list();
foreach ($languages as $lang) {
delete_transient('post_count_by_lang_' . $lang);
}
}
}
register_deactivation_hook(__FILE__, 'clear_all_post_count_transients');
register_uninstall_hook(__FILE__, 'clear_all_post_count_transients');
Numaralar, numarayı görüntülemek istediğiniz her yerde ilgili kodla birlikte her dil için kısa kod kullanılarak görüntülenir. Bu şekilde görünür:
For Spanish: [post_count_by_lang lang="es"]
For English: [post_count_by_lang lang="en"]
For German: [post_count_by_lang lang="de"]
For French: [post_count_by_lang lang="fr"]
etc.
Diğer içerik türlerini (sayfalar, özel gönderi türleri vb.) saymak istiyorsanız koddaki'post_type' ifadesini değiştirebilirsiniz.
Bu URL'de kısa kodların çalıştığına dair bir örnek var.
Herhangi bir sayfaya veya gönderiye yerel Polylang bannerları ekleyin
Polylang, .png formatında 249 adet 16x11 bayraktan oluşan bir koleksiyon içerdiğinden, bunları HTML veya CSS yazmak zorunda kalmadan listeleri süslemek, tablolara, paragraflara vb. eklemek için kullanabiliriz.
Bu işlev, eklenti tarafından kullanılan herhangi bir yerel banner'ın görüntüsünü bir kısa kod aracılığıyla eklemenize olanak tanır.
Bunları kullanılabilir hale getirmek için snippet'i alt temanızın functions.php dosyasına, özel bir eklentiye veya kullanıyorsanız Code Snippet ile eklersiniz.
function polylang_flag_shortcode($atts) {
// Shortcode attributes
$atts = shortcode_atts(array(
'code' => '', // Flag code (e.g. 'es', 'en', 'fr')
'size' => '16', // Flag size (width in pixels)
), $atts, 'polylang_flag');
// Check if a flag code was provided
if (empty($atts['code'])) {
return 'Flag code not provided.';
}
// Polylang flag base route
$flag_path = plugins_url('polylang/flags/' . $atts['code'] . '.png');
// Create the HTML of the flag image
$flag_html = '<img src="' . esc_url($flag_path) . '" alt="' . esc_attr($atts['code']) . '" width="' . esc_attr($atts['size']) . '" height="auto" />';
return $flag_html;
}
add_shortcode('polylang_flag', 'polylang_flag_shortcode');
Kodu ekledikten sonra, /wp-content/plugins/polylang/flags/ klasöründeki bayrak dosyalarının adlarıyla tam olarak eşleştiğinden emin olarak herhangi bir WordPress sayfasında veya yazısında ilgili ülke koduyla birlikte kısa kodu kullanabilirsiniz.
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Original size
[polylang_flag code="de"]
Bayrakların boyutuyla oynamak için kısa koddaki boyut özelliğinin değerini değiştirmeniz yeterlidir.
Kendi bannerlarınızı oluşturmak ve kullanmak istiyorsanız veya farklı bir tasarıma sahip başka bir koleksiyonunuz varsa, yenilerini (.png olarak) farklı bir adla yeni bir klasörde barındırın (aksi takdirde eklenti güncellendiğinde değişiklikleri kaybedersiniz) ve yeni yolu koda ekleyin. Örneğin:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');
Dil seçicinin yanına bir SVG simgesi ekleme
Bu kod parçacığı, görsel olarak daha çekici hale getirmek ve ziyaretçinin dikkatini çekmek için Polylang'ın ana dil seçicisinin soluna "Çevir" simgeli bir SVG simgesi ekler. Örnekte, simge bu blogda kullandığım simgedir. Siz en çok beğendiğinizi bulabilir ve değiştirebilirsiniz. İşte bunlardan birkaçı.
function polylang_add_translate_icon($output) {
//SVG icon for "translate".
$translate_icon = '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align: middle; margin-right: 5px;"><path d="M24 24h-2.784l-1.07-3h-4.875l-1.077 3h-2.697l4.941-13h2.604l4.958 13zm-4.573-5.069l-1.705-4.903-1.712 4.903h3.417zm-9.252-12.804c.126-.486.201-.852.271-1.212l-2.199-.428c-.036.185-.102.533-.22 1-.742-.109-1.532-.122-2.332-.041.019-.537.052-1.063.098-1.569h2.456v-2.083h-2.161c.106-.531.198-.849.288-1.149l-2.147-.645c-.158.526-.29 1.042-.422 1.794h-2.451v2.083h2.184c-.058.673-.093 1.371-.103 2.077-2.413.886-3.437 2.575-3.437 4.107 0 1.809 1.427 3.399 3.684 3.194 2.802-.255 4.673-2.371 5.77-4.974 1.134.654 1.608 1.753 1.181 2.771-.396.941-1.561 1.838-3.785 1.792v2.242c2.469.038 4.898-.899 5.85-3.166.93-2.214-.132-4.635-2.525-5.793zm-2.892 1.531c-.349.774-.809 1.544-1.395 2.15-.09-.646-.151-1.353-.184-2.108.533-.07 1.072-.083 1.579-.042zm-3.788.724c.062.947.169 1.818.317 2.596-1.996.365-2.076-1.603-.317-2.596zm11.236-1.745l-2.075-5.533 5.414-1.104-.976 1.868c2.999 2.418 4.116 5.645 4.532 8.132-1.736-2.913-3.826-4.478-5.885-5.321l-1.01 1.958zm-7.895 10.781l1.985 5.566-5.43 1.016 1.006-1.852c-2.96-2.465-4.021-5.654-4.397-8.148 1.689 2.94 3.749 4.483 5.794 5.36l1.042-1.942zm10.795-6.029"/></svg>';
// Add the icon before the selector
return $translate_icon . '<span style="margin-left: 5px;">' . $output . '</span>';
}
add_filter('pll_the_languages', 'polylang_add_translate_icon');
Yabancı dil sürümünün varlığına ilişkin özelleştirilebilir uyarı gösterme
Bu fonksiyon, bir yazı veya sayfanın herhangi bir yerine eklenebilen sarı arka planlı bir uyarı görüntülemek için bir kısa kod oluşturur. Bu mesaj, makalenin Polylang ile İngilizce çevirisi olduğu konusunda uyarır ve İngilizce sürümüne bir bağlantı sağlar.
Bu örneği seçtim çünkü herhangi bir dildeki bir makale İngilizce konuşulan ülkelerden ve İngilizce tarayıcılardan daha fazla trafik aldığında bunu kullandım (bu da arkasındaki kişinin İngilizce versiyonu aradığını garanti etmez). Yine de, bazı durumlarda ziyaretçi kalıcılığını sağlamanın bir yoludur.
functions.php'ye eklenecek kod
// English version notice
function polylang_translation_notice_shortcode() {
// Verifica si el plugin Polylang está activo
if (!function_exists('pll_the_languages')) {
return '';
}
// Get the ID of the current post
$post_id = get_the_ID();
// Get the English translation of the current post
$english_post_id = pll_get_post($post_id, 'en'); // 'en' es el código del idioma inglés
// Si no hay una traducción en inglés, no mostrará nada
if (!$english_post_id) {
return '';
}
// Get the link to the English version
$english_post_url = get_permalink($english_post_id);
// Crear el contenido del aviso
$ticker_content = sprintf(
'<div style="background-color: #ffffcc; padding: 10px; border-radius: 5px; margin-bottom: 20px; font-size: 14px;">
This article has an English version. <a href="%s" style="color: #0073e6; text-decoration: none; font-weight: bold;">Read</a>
</div>',
esc_url($english_post_url)
);
return $ticker_content;
}
add_shortcode('polylang_translation_notice', 'polylang_translation_notice_shortcode');
Stil olarak mesajı, metnin boyutunu, metnin renklerini, arka planı ve bağlantıyı istediğiniz gibi değiştirebilirsiniz.
Mesajı istediğiniz yere eklemek için bu kısa kodu kullanmanız yeterlidir:
[polylang_translation_notice]
Örnekteki CSS ile bu şekilde görünür.

Başka bir dildeki çeviriye bir bildirim eklemek istiyorsanız, pll_get_post($post_id, 'en'); içindeki dil kodunu 'fr', 'de', 'it' vb. olarak değiştirmeniz yeterlidir. Birden fazla gönderi kullanmanız gerekiyorsa, her dil için bir tane olmak üzere farklı snippet'ler ekleyebilirsiniz. Hepsini tek bir snippet'e ekleyebilirsiniz, ancak benim yalnızca bir tanesine ihtiyacım vardı.