- Kopírovanie obsahu z pôvodného príspevku pomocou jazyka Polylang v jeho bezplatnej verzii
- Zobraziť celkový počet príspevkov preložených pomocou jazyka Polylang v každom jazyku
- Pridanie natívnych bannerov Polylang na akúkoľvek stránku alebo príspevok
- Pridanie ikony SVG vedľa voliča jazyka
- Zobrazenie prispôsobiteľného upozornenia na existenciu cudzojazyčnej verzie

Hoci existujú rôzne názory na to, ktorý plugin je najlepší na vytvorenie viacjazyčného blogu, a všetky sa od svojich prvých verzií veľmi vyvinuli, čo zjednodušilo a uľahčilo túto úlohu, jedným z najpoužívanejších je Polylang.
S viac ako 700 000 aktívnymi inštaláciami je stále jednou z najľahších a najúčinnejších možností.
Tu je malý zoznam fragmentov s funkciami a filtrami, ktoré by mohli byť niekedy užitočné. Všetky fungujú pre bezplatnú verziu Polylangu a boli tu testované a/alebo použité.
Kopírovanie obsahu z pôvodného príspevku pomocou jazyka Polylang v jeho bezplatnej verzii
Ak používate bezplatnú verziu doplnku Polylang pre WordPress, už viete, že nová stránka alebo príspevok, ktorý vygeneruje na preklad, nekopíruje pôvodný obsah. Je to jedna z funkcií jeho platenej verzie a v bezplatnej verzii musíte obsah vkladať ručne.
Ak to chcete vyriešiť a urýchliť tento proces, stačí pridať tieto funkcie do súboru functions.php vašej šablóny. Teraz sa pri pridávaní nového prekladu otvorí s pôvodným skopírovaným obsahom (názov a obsah).
// 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' );
*Tento úryvokbol nájdený v poznámke z decembra 2020. Hoci stále funguje, nezaškodilo by ho sledovať pre prípad, že by časom a budúcimi aktualizáciami jazyka Polylang zlyhal.
Zobraziť celkový počet príspevkov preložených pomocou jazyka Polylang v každom jazyku
Táto funkcia umožňuje pridať skratku pre každý jazyk, ktorá zobrazí celkový počet príspevkov uverejnených v jazyku, v ktorom sú pridané preklady pomocou doplnku Polylang.
Táto funkcia je viac ako otestovaná a funguje správne na mojej stránke štatistík a je užitočná na udržiavanie zoznamu počítadiel, ktoré sa automaticky aktualizujú.
Úryvok sa pridá do súboru functions.php šablóny:
// 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');
Jedným z problémov, s ktorými sa tu stretávame, je, že ak máte na stránke veľa príspevkov v rôznych jazykoch, ako je to v prípade tohto blogu, vplyv databázového dotazu by mohol spomaliť rýchlosť načítania. Kód to zohľadňuje a dotaz je optimalizovaný pomocou WP_Query s poliami => 'ids', aby sa znížila pamäťová záťaž tým, že sa nenačítajú celé objekty príspevkov.
Počet príspevkov sa ukladá pomocou funkcie set_transient a zabraňuje opakovaným dotazom do databázy. V príklade sa vyrovnávacia pamäť aktualizuje každých 12 hodín, vyjadrené v sekundách (tento čas môžete upraviť podľa svojich potrieb).
Na optimalizáciu dotazu sa namiesto get_posts používa WP_Query na prístup k found_posts, ktorý vráti celkový počet príspevkov bez potreby načítania všetkých objektov.
Parameter fields => 'ids' znižuje zaťaženie pamäte načítaním iba ID príspevkov.
Ak v určitom okamihu potrebujete ručne vymazať vyrovnávaciu pamäť (napr. po uverejnení nového príspevku), aby sa nezobrazovali neaktuálne údaje, môžete použiť:
delete_transient('post_count_by_lang_' . $lang);
Ak chcete tento proces zautomatizovať, nasledujúca funkcia odstráni prechodný stav vždy, keď je príspevok uverejnený, aktualizovaný alebo odstránený. Ak ju pridáte do súboru functions.php svojej šablóny, háčik sa aktivuje pri všetkých týchto akciách:
//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
A tento automaticky vymaže vyrovnávaciu pamäť podľa viacerých možných scenárov(vrátane vyššie uvedeného):
// 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');
Čísla sa zobrazujú pomocou skráteného kódu pre každý jazyk s príslušným kódom, kdekoľvek chcete číslo zobraziť. Vyzerá to takto:
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.
Ak chcete počítať aj iné typy obsahu (stránky, vlastné typy príspevkov atď.), môžete v kóde upraviť"post_type".
V tejto adrese URL máte príklad fungovania skratiek.
Pridanie natívnych bannerov Polylang na akúkoľvek stránku alebo príspevok
Keďže Polylang obsahuje kolekciu 249 vlajok 16x11 vo formáte .png, môžeme ich použiť na ozdobenie zoznamov, pridanie do tabuliek, odsekov atď. bez toho, aby sme museli písať HTML alebo CSS.
Táto funkcia umožňuje pridať obrázok akéhokoľvek natívneho bannera používaného pluginom prostredníctvom skratky.
Ak ich chcete sprístupniť, pridajte úryvok do súboru functions.php vašej detskej témy, do vlastného pluginu alebo pomocou Code Snippet, ak ho používate.
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');
Po pridaní kódu môžete použiť skratku s príslušným kódom krajiny na ľubovoľnej stránke alebo príspevku WordPress, pričom sa uistite, že sa presne zhoduje s názvami súborov vlajok v priečinku /wp-content/plugins/polylang/flags/.
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Original size
[polylang_flag code="de"]
Ak si chcete pohrať s veľkosťou vlajok, jednoducho zmeňte hodnotu atribútu size v skratke.
Ak chcete vytvoriť a používať vlastné bannery alebo máte inú kolekciu s iným dizajnom, stačí umiestniť nové bannery (vo formáte .png) do nového priečinka s iným názvom (v opačnom prípade stratíte zmeny pri aktualizácii doplnku) a pridať novú cestu do kódu. Napríklad:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');
Pridanie ikony SVG vedľa voliča jazyka
Tento úryvok pridáva ikonu SVG so symbolom "Preložiť" na ľavú stranu výberu rodného jazyka jazyka Polylang, aby bol vizuálne atraktívnejší a upútal pozornosť návštevníka. V príklade je ikona tá, ktorú používam v tomto blogu. Môžete si vyhľadať tú, ktorá sa vám najviac páči, a nahradiť ju. Tu je niekoľko z nich.
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');
Zobrazenie prispôsobiteľného upozornenia na existenciu cudzojazyčnej verzie
Táto funkcia vytvára skratku na zobrazenie upozornenia so žltým pozadím, ktorú možno pridať kdekoľvek na príspevok alebo stránku. Táto správa upozorňuje, že článok má anglický preklad s Polylangom a poskytuje odkaz na anglickú verziu.
Tento príklad som si vybral, pretože som ho použil, keď článok v akomkoľvek jazyku zaznamenal väčšiu návštevnosť z anglicky hovoriacich krajín a z anglicky hovoriacich prehliadačov (čo tiež nezaručuje, že osoba, ktorá za ním stojí, hľadala anglickú verziu). Napriek tomu je to spôsob, ako v niektorých prípadoch zabezpečiť udržanie návštevníkov.
Kód na pridanie do 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');
V štýle môžete upraviť správu, veľkosť textu, farby textu, pozadie a odkaz podľa svojich predstáv.
Ak chcete pridať správu kamkoľvek chcete, použite tento skrátený kód:
[polylang_translation_notice]
S CSS v príklade to vyzerá takto.

Ak chcete pridať upozornenie na preklad v inom jazyku, stačí zmeniť kód jazyka v pll_get_post($post_id, 'en'); na 'fr', 'de', 'it' atď. Ak potrebujete použiť viacero príspevkov, môžete pridať rôzne úryvky, pre každý jazyk jeden. Mohli by ste ich pridať všetky do jedného fragmentu, ale ja som potreboval len jeden.