- Zkopírovat obsah z původního příspěvku pomocí Polylang v bezplatné verzi
- Zobrazit celkový počet příspěvků přeložených pomocí Polylangu v každém jazyce
- Přidání nativních bannerů Polylang na libovolnou stránku nebo příspěvek
- Přidání ikony SVG vedle voliče jazyka
- Zobrazení přizpůsobitelného upozornění na existenci cizojazyčné verze

Ačkoli existují různé názory na to, který plugin je nejlepší pro vytvoření vícejazyčného blogu, a všechny se od svých prvních verzí hodně vyvinuly a zjednodušily tento úkol, jedním z nejpoužívanějších je Polylang.
S více než 700 000 aktivními instalacemi je stále jednou z nejlehčích a nejefektivnějších možností.
Zde je malý seznam fragmentů s funkcemi a filtry, které by mohly být někdy užitečné. Všechny fungují pro bezplatnou verzi Polylangu a byly zde testovány a/nebo použity.
Zkopírovat obsah z původního příspěvku pomocí Polylang v bezplatné verzi
Pokud používáte bezplatnou verzi pluginu Polylang pro WordPress, už víte, že nová stránka nebo příspěvek, který vygeneruje pro překlad, nekopíruje původní obsah. To je jedna z funkcí jeho placené verze a v bezplatné verzi musíte obsah vkládat ručně.
Chcete-li to vyřešit a urychlit proces, stačí přidat tyto funkce do souboru functions.php vaší šablony. Nyní se při přidání nového překladu otevře s původním zkopírovaným obsahem (nadpis 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 úryvekbyl nalezen v poznámce z prosince 2020. Přestože stále funguje, neuškodí jej sledovat pro případ, že by časem a budoucími aktualizacemi Polylangu selhal.
Zobrazit celkový počet příspěvků přeložených pomocí Polylangu v každém jazyce
Tato funkce umožňuje přidat zkrácený kód pro každý jazyk, který zobrazí celkový počet příspěvků publikovaných v jazyce, ve kterém jsou překlady přidané pomocí pluginu Polylang.
Tato funkce je více než otestovaná a funguje správně na mé stránce statistik a je užitečná pro udržování seznamu počítadel, která jsou automaticky aktualizována.
Úryvek je přidán do souboru functions.php šablony:
// 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émů, se kterými se zde setkáváme, je to, že pokud máte na webu mnoho příspěvků v různých jazycích, jako je tomu v případě tohoto blogu, mohl by dopad dotazu do databáze zpomalit rychlost načítání. Kód to zohledňuje a dotaz je optimalizován pomocí WP_Query s poli => 'ids', aby se snížila paměťová zátěž tím, že se nenačítají celé objekty příspěvků.
Počet příspěvků se ukládá pomocí set_transient a zabraňuje opakovaným dotazům do databáze. V příkladu je mezipaměť aktualizována každých 12 hodin, vyjádřeno v sekundách (tuto dobu můžete upravit podle svých potřeb).
Pro optimalizaci dotazu se místo get_posts používá WP_Query pro přístup k found_posts, který vrací celkový počet příspěvků bez nutnosti načítat všechny objekty.
Parametr fields => 'ids' snižuje zatížení paměti tím, že načítá pouze ID příspěvků.
Pokud v určitém okamžiku potřebujete vymazat mezipaměť ručně (např. po zveřejnění nového příspěvku), aby se nezobrazovala zastaralá data, můžete použít:
delete_transient('post_count_by_lang_' . $lang);
Pokud chcete tento proces automatizovat, následující funkce odstraní přechodný stav pokaždé, když je příspěvek zveřejněn, aktualizován nebo odstraněn. Pokud ji přidáte do souboru functions.php své šablony, bude háček aktivován pro všechny tyto akce:
//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 vyčistí mezipaměť podle několika různých možných scénářů(včetně výše 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 se zobrazují pomocí zkráceného kódu pro každý jazyk s odpovídajícím kódem, kdekoli chcete číslo zobrazit. Vypadá 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.
Pokud chcete počítat i jiné typy obsahu (stránky, vlastní typy příspěvků atd.), můžete v kódu upravit'post_type'.
Na této adrese URL máte příklad fungování zkratek.
Přidání nativních bannerů Polylang na libovolnou stránku nebo příspěvek
Vzhledem k tomu, že Polylang obsahuje kolekci 249 vlaječek 16x11 ve formátu .png, můžeme je použít k ozdobení seznamů, přidání do tabulek, odstavců atd., aniž bychom museli psát HTML nebo CSS.
Tato funkce umožňuje přidat obrázek jakéhokoli nativního banneru používaného pluginem prostřednictvím zkratky.
Chcete-li je zpřístupnit, přidejte úryvek do souboru functions.php svého podřízeného tématu, do vlastního pluginu nebo pomocí nástroje Code Snippet, pokud jej používáte.
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 přidání kódu můžete zkrácený kód s odpovídajícím kódem země použít na libovolné stránce nebo příspěvku ve WordPressu a ujistit se, že přesně odpovídá názvům souborů s vlajkami ve složce /wp-content/plugins/polylang/flags/.
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Original size
[polylang_flag code="de"]
Chcete-li si pohrát s velikostí vlaječek, jednoduše změňte hodnotu atributu size ve zkráceném kódu.
Pokud chcete vytvořit a používat vlastní bannery nebo máte jinou kolekci s jiným designem, stačí umístit nové bannery (ve formátu .png) do nové složky s jiným názvem (jinak o změny přijdete při aktualizaci pluginu) a přidat novou cestu do kódu. Například:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');
Přidání ikony SVG vedle voliče jazyka
Tento úryvek přidává ikonu SVG se symbolem "Translate" vlevo od voliče nativního jazyka Polylang, aby byl vizuálně atraktivnější a upoutal pozornost návštěvníka. V příkladu je to ikona, kterou používám v tomto blogu. Můžete vyhledat tu, která se vám nejvíce líbí, a nahradit ji. Zde je několik 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');
Zobrazení přizpůsobitelného upozornění na existenci cizojazyčné verze
Tato funkce vytvoří zkrácený kód pro zobrazení upozornění se žlutým pozadím, který lze přidat kamkoli na příspěvek nebo stránku. Tato zpráva upozorňuje, že článek má český překlad s Polylangem, a poskytuje odkaz na anglickou verzi.
Tento příklad jsem zvolil, protože jsem ho použil, když článek v jakémkoli jazyce zaznamenal větší návštěvnost z anglicky mluvících zemí a z anglicky mluvících prohlížečů (což také nezaručuje, že osoba, která za ním stála, hledala anglickou verzi). Přesto je to způsob, jak v některých případech zajistit udržení návštěvníků.
Kód pro přidání do souboru 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');
Ve stylu můžete upravit zprávu, velikost textu, barvy textu, pozadí a odkaz podle svých představ.
Chcete-li přidat zprávu kamkoli chcete, použijte tento zkrácený kód:
[polylang_translation_notice]
Pomocí CSS v příkladu to vypadá takto.

Pokud chcete přidat upozornění na překlad v jiném jazyce, stačí změnit kód jazyka v pll_get_post($post_id, 'en'); na 'fr', 'de', 'it' atd. Pokud potřebujete použít více příspěvků, můžete přidat různé úryvky, pro každý jazyk jeden. Mohli byste je přidat všechny do jednoho úryvku, ale já jsem potřeboval jen jeden.