
Въпреки че има различни мнения за това кой е най-добрият плъгин за създаване на многоезичен блог и всички те са се развили много след първите си версии, опростявайки и улеснявайки задачата, един от най-използваните е Polylang.
С повече от 700 000 активни инсталации до момента, той остава един от най-леките и ефективни варианти.
Ето малък списък с фрагменти с функции и филтри, които могат да бъдат полезни в даден момент. Всички те работят за безплатната версия на Polylang и са тествани и/или използвани тук.
Копиране на съдържанието от оригиналната публикация с помощта на Polylang в безплатната му версия
Ако използвате безплатната версия на приставката Polylang за WordPress, вече знаете, че новата страница или публикация, която тя генерира за превод, не копи ра оригиналното съдържание. Това е една от функциите на платената му версия, а в безплатната версия трябва да вмъкнете съдържанието на ръка.
За да разрешите този проблем и да ускорите процеса, просто добавете тези функции във файла functions.php на вашия шаблон. Сега, когато добавяте нов превод, той ще се отваря с оригиналното копирано съдържание (заглавие и съдържание).
// 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' );
*Тисниппетътбеше открит в бележка от декември 2020 г. Въпреки че все още работи, не би навредило да го държите под око, в случай че с времето и бъдещите актуализации на Polylang се провали.
Покажете общия брой публикации, преведени с Polylang на всеки език
Тази функция ви позволява да добавите шорткод за всеки език, който ще показва общия брой публикации, публикувани на език, на който има преводи, добавени с плъгина Polylang.
Тази функция е повече от тествана и работи правилно на моята страница за статистика и е полезна за поддържане на списък с броячи, които се актуализират автоматично.
Откъсът се добавя към functions.php на шаблона:
// 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');
Един от проблемите, с които се сблъскваме тук, е, че ако на сайта ви има много публикации на различни езици, какъвто е случаят с този блог, въздействието на заявката за база данни може да забави скоростта на зареждане. Кодът отчита това и заявката е оптимизирана с помощта на WP_Query с полета => "ids ", за да се намали натоварването на паметта, като не се зареждат цели обекти от публикации.
Броят на публикациите се съхранява с помощта на set_transient и се избягват повтарящи се заявки към базата данни. В примера кешът се обновява на всеки 12 часа, изразено в секунди (можете да коригирате това време според нуждите си).
За да се оптимизира заявката, вместо get_posts се използва WP_Query за достъп до found_posts, който връща общия брой публикации, без да е необходимо да се зареждат всички обекти.
Параметърът fields => 'ids' намалява натоварването на паметта, като извлича само идентификаторите на публикациите.
Ако в даден момент се наложи да изчистите кеша ръчно (например след публикуване на нова публикация), за да не се показват остарели данни, можете да използвате:
delete_transient('post_count_by_lang_' . $lang);
Ако предпочитате да автоматизирате този процес, следната функция ще изтрива преходния период всеки път, когато се публикува, актуализира или изтрие публикация. Ако я добавите във functions.php на вашия шаблон, куката ще се активира за всички тези действия:
//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
А този автоматично изчиства кеша в зависимост от няколко различни възможни сценария(включително този по-горе):
// 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');
Числата се показват с помощта на шорткод за всеки език със съответния код, където и да искате да покажете числото. Изглежда по следния начин:
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.
Ако искате да отчитате други типове съдържание (страници, персонализирани типове публикации и т.н.), можете да промените"post_type" в кода.
В този URL адрес има пример за работата на кратките кодове.
Добавяне на родни банери на Polylang към всяка страница или публикация
Тъй като Polylang включва колекция от 249 флагове 16x11 в .png, можем да ги използваме за украса на списъци, да ги добавяме към таблици, параграфи и т.н., без да се налага да пишем HTML или CSS.
Тази функция ви позволява да добавите изображението на всеки местен банер, използван от плъгина, чрез шорткод.
За да ги направите достъпни, трябва да добавите фрагмента във functions.php на вашата детска тема, в персонализирана приставка или с Code Snippet, ако го използвате.
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');
След като добавите кода, можете да използвате шорткода със съответния код на страната на всяка страница или публикация в WordPress, като се уверите, че той съвпада точно с имената на файловете с флагове в папката /wp-content/plugins/polylang/flags/.
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Original size
[polylang_flag code="de"]
За да променяте размера на флаговете, просто променете стойността на атрибута size в шорткода.
Ако искате да създадете и използвате свои собствени банери или да имате друга колекция с различен дизайн, просто хоствайте новите банери (в .png) в нова папка с различно име (в противен случай ще загубите промените при актуализиране на плъгина) и добавете новия път към кода. Например:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');
Добавяне на SVG икона до селектора за език
Този фрагмент добавя SVG икона със символа "Translate" вляво от селектора на родния език на Polylang, за да го направи по-привлекателен и да привлече вниманието на посетителите. В примера иконата е тази, която използвам в този блог. Можете да потърсите тази, която ви харесва най-много, и да я замените. Ето няколко от тях.
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');
Показване на персонализирано предупреждение за наличието на чуждоезикова версия
Тази функция създава шорткод за показване на предупреждение с жълт фон, който може да се добави навсякъде в публикация или страница. Това съобщение предупреждава, че статията има превод на английски език с Polylang и предоставя връзка към английската версия.
Избрах този пример, защото съм го използвал, когато статия на какъвто и да е език е получавала по-голям трафик от англоговорящи страни и от англоезични браузъри (което също не гарантира, че човекът, който стои зад нея, е търсил английската версия). Все пак в някои случаи това е начин да се гарантира задържането на посетителите.
Код за добавяне към functions.php
// 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');
В стила можете да променяте съобщението, размера на текста, цветовете на текста, фона и връзката по свой вкус.
За да добавите съобщението, където пожелаете, просто използвайте този шорткод:
[polylang_translation_notice]
С помощта на CSS в примера той изглежда така.

Ако искате да добавите известие към превода на друг език, просто променете кода на езика в pll_get_post($post_id, 'en'); на 'fr', 'de', 'it' и т.н. Ако трябва да използвате няколко поста, можете да добавите различни фрагменти, по един за всеки език. Можете да ги добавите всички в един фрагмент, но на мен ми трябваше само един.