- Skopiowanie treści z oryginalnego postu przy użyciu Polylang w wersji darmowej
- Pokaż całkowitą liczbę postów przetłumaczonych za pomocą Polylang w każdym języku.
- Dodaj natywne banery Polylang do dowolnej strony lub postu
- Dodanie ikony SVG obok selektora języka
- Wyświetlanie konfigurowalnego ostrzeżenia o istnieniu obcej wersji językowej

Chociaż istnieją różne opinie na temat najlepszej wtyczki do tworzenia wielojęzycznych blogów, a wszystkie z nich ewoluowały od czasu ich pierwszych wersji, upraszczając i ułatwiając zadanie, jedną z najczęściej używanych jest Polylang.
Z ponad 700 000 aktywnych instalacji do tej pory, pozostaje jedną z najlżejszych i najbardziej efektywnych opcji.
Oto mała lista snippetów z funkcjami i filtrami, które mogą być przydatne w pewnym momencie. Wszystkie z nich działają w darmowej wersji Polylang i zostały tutaj przetestowane i/lub użyte.
Skopiowanie treści z oryginalnego postu przy użyciu Polylang w wersji darmowej
Jeśli korzystasz z darmowej wersji wtyczki Polylang dla WordPress, wiesz już, że nowa strona lub post, który generuje do tłumaczenia, nie kopiuje oryginalnej treści. Jest to jedna z funkcji jej płatnej wersji, a w wersji darmowej trzeba ręcznie wklejać treść.
Aby rozwiązać ten problem i przyspieszyć proces, wystarczy dodać te funkcje do pliku functions.php szablonu. Teraz, gdy dodasz nowe tłumaczenie, otworzy się ono z oryginalną skopiowaną treścią (tytułem i treścią).
// 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' );
*Thissnippetzostał znaleziony w notatce z grudnia 2020 roku. Chociaż nadal działa, nie zaszkodzi mieć go na oku na wypadek, gdyby z czasem i przyszłymi aktualizacjami Polylang przestał działać.
Pokaż całkowitą liczbę postów przetłumaczonych za pomocą Polylang w każdym języku.
Ta funkcja umożliwia dodanie shortcode dla każdego języka, który pokaże całkowitą liczbę postów opublikowanych w języku, w którym istnieją tłumaczenia dodane za pomocą wtyczki Polylang.
Ta funkcja jest więcej niż przetestowana i działa poprawnie na mojej stronie statystyk i jest przydatna do utrzymywania listy liczników, które są automatycznie aktualizowane.
Fragment jest dodawany do pliku functions.php szablonu :
// 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');
Jednym z problemów jest to, że jeśli masz wiele postów w wielu różnych językach na swojej stronie, tak jak w przypadku tego bloga, wpływ zapytania do bazy danych może spowolnić prędkość ładowania. Kod bierze to pod uwagę, a zapytanie jest zoptymalizowane przy użyciu WP_Query z polami => "ids", aby zmniejszyć obciążenie pamięci, nie ładując całych obiektów postów.
Liczba postów jest przechowywana przy użyciu set_transient i pozwala uniknąć powtarzających się zapytań do bazy danych. W przykładzie pamięć podręczna jest aktualizowana co 12 godzin, wyrażona w sekundach (można dostosować ten czas do własnych potrzeb).
Aby zoptymalizować zapytanie, WP_Query jest używane zamiast get_posts, aby uzyskać dostęp do found_posts, który zwraca całkowitą liczbę postów bez konieczności ładowania wszystkich obiektów.
Parametr fields => 'ids' zmniejsza obciążenie pamięci, pobierając tylko identyfikatory postów.
Jeśli w pewnym momencie będziesz musiał ręcznie wyczyścić pamięć podręczną (np. po opublikowaniu nowego posta), aby nie wyświetlać nieaktualnych danych, możesz z niej skorzystać:
delete_transient('post_count_by_lang_' . $lang);
Jeśli wolisz zautomatyzować ten proces, poniższa funkcja usunie stan przejściowy za każdym razem, gdy post zostanie opublikowany, zaktualizowany lub usunięty. Jeśli dodasz ją do functions.php swojego szablonu, hak zostanie aktywowany dla wszystkich tych działań:
//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 ten automatycznie czyści pamięć podręczną zgodnie z wieloma różnymi możliwymi scenariuszami(w tym jednym powyżej):
// 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');
Liczby są wyświetlane za pomocą shortcode dla każdego języka z odpowiednim kodem, gdziekolwiek chcesz wyświetlić liczbę. Wygląda to następująco:
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.
Możesz zmodyfikować"post_type" w kodzie, jeśli chcesz liczyć inne typy treści (strony, niestandardowe typy postów itp.).
Pod tym adresem URL znajduje się przykład działania skrótów.
Dodaj natywne banery Polylang do dowolnej strony lub postu
Ponieważ Polylang zawiera kolekcję 249 flag 16x11 w formacie .png, możemy ich używać do dekorowania list, dodawania ich do tabel, akapitów itp. bez konieczności pisania HTML lub CSS.
Ta funkcja umożliwia dodanie obrazu dowolnego natywnego banera używanego przez wtyczkę za pomocą shortcode.
Aby je udostępnić, należy dodać snippet w functions.php motywu potomnego, w niestandardowej wtyczce lub za pomocą Code Snippet, jeśli go używasz.
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 dodaniu kodu możesz użyć shortcode z odpowiednim kodem kraju na dowolnej stronie WordPress lub w poście , upewniając się, że odpowiada on dokładnie nazwom plików flag w folderze /wp-content/plugins/polylang/flags/.
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Original size
[polylang_flag code="de"]
Aby zmienić rozmiar flag, wystarczy zmienić wartość atrybutu size w kodzie shortcode.
Jeśli chcesz tworzyć i używać własnych banerów lub mieć inną kolekcję z innym projektem, po prostu umieść nowe (w .png) w nowym folderze o innej nazwie (w przeciwnym razie utracisz zmiany po aktualizacji wtyczki) i dodaj nową ścieżkę do kodu. Na przykład:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');
Dodanie ikony SVG obok selektora języka
Ten fragment kodu dodaje ikonę SVG z symbolem "Tłumacz" po lewej stronie selektora języka ojczystego Polylang, aby uczynić go bardziej atrakcyjnym wizualnie i przyciągnąć uwagę odwiedzających. W przykładzie ikona jest tą, której używam na tym blogu. Możesz poszukać tej, która najbardziej Ci się podoba i zastąpić ją inną. Oto kilka 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');
Wyświetlanie konfigurowalnego ostrzeżenia o istnieniu obcej wersji językowej
Ta funkcja tworzy shortcode do wyświetlania ostrzeżenia z żółtym tłem, które można dodać w dowolnym miejscu postu lub strony. Ten komunikat ostrzega, że artykuł ma angielskie tłumaczenie z Polylang i zawiera link do angielskiej wersji.
Wybrałem ten przykład, ponieważ użyłem go, gdy artykuł w dowolnym języku otrzymał większy ruch z krajów anglojęzycznych i z anglojęzycznych przeglądarek (co również nie gwarantuje, że osoba za nim szukała angielskiej wersji). W niektórych przypadkach jest to jednak sposób na zatrzymanie odwiedzających.
Kod do dodania 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');
W stylu można modyfikować wiadomość, rozmiar tekstu, kolory tekstu, tła i łącza według własnych upodobań.
Aby dodać wiadomość w dowolnym miejscu, wystarczy użyć tego krótkiego kodu:
[polylang_translation_notice]
Z CSS w przykładzie wygląda to następująco.

Jeśli chcesz dodać powiadomienie do tłumaczenia w innym języku, po prostu zmień kod języka w pll_get_post($post_id, 'en'); na 'fr', 'de', 'it' itd. Jeśli chcesz użyć wielu postów, możesz dodać różne fragmenty, po jednym dla każdego języka. Możesz dodać je wszystkie w jednym snippecie, ale ja potrzebowałem tylko jednego.