- Копіюйте вміст оригінального допису за допомогою безкоштовної версії Polylang
- Показати загальну кількість дописів, перекладених за допомогою Polylang кожною мовою
- Додайте нативні банери Polylang на будь-яку сторінку або допис
- Додавання SVG-піктограми поруч із перемикачем мов
- Показувати настроюване попередження про наявність іншомовної версії

Хоча існують різні думки щодо того, який плагін є найкращим для створення багатомовного блогу, і всі вони значно еволюціонували з моменту появи перших версій, спрощуючи і полегшуючи завдання, одним з найбільш використовуваних є 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 для доступу до found_posts використовується WP_Query, який повертає загальну кількість постів без необхідності завантажувати всі об'єкти.
Параметр 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" в коді, якщо хочете підрахувати інші типи контенту (сторінки, кастомні типи дописів тощо).
За цією адресою ви знайдете приклад роботи шорткодів.
Додайте нативні банери 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-іконку з символом "Перекласти" зліва від селектора рідної мови 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' тощо. Якщо вам потрібно використовувати кілька постів, ви можете додати різні фрагменти, по одному для кожної мови. Ви можете додати їх всі в одному фрагменті, але мені потрібен лише один.