- Kopiera innehåll från originalinlägget med hjälp av Polylang i dess gratisversion
- Visa det totala antalet inlägg som har översatts med Polylang på varje språk
- Lägg till native Polylang-banners på valfri sida eller i valfritt inlägg
- Lägga till en SVG-ikon bredvid språkväljaren
- Visa anpassningsbar varning om att det finns en version på ett främmande språk

Även om det finns olika åsikter om vilket som är det bästa insticksprogrammet för att skapa en flerspråkig blogg, och alla har utvecklats mycket sedan deras första versioner som förenklar och underlättar uppgiften, är ett av de mest använda Polylang.
Med mer än 700.000 aktiva installationer hittills är det fortfarande ett av de lättaste och mest effektiva alternativen.
Här är en liten lista över snuttar med funktioner och filter som kan vara användbara någon gång. Alla fungerar för gratisversionen av Polylang och har testats och/eller använts här.
Kopiera innehåll från originalinlägget med hjälp av Polylang i dess gratisversion
Om du använder gratisversionen av plugin-programmet Polylang för WordPress vet du redan att den nya sidan eller det nya inlägget som genereras för översättning inte kopierar originalinnehållet. Detta är en av funktionerna i betalversionen och i gratisversionen måste du klistra in innehållet för hand.
För att lösa detta och påskynda processen lägger du bara till dessa funktioner i filen functions.php i din mall. När du nu lägger till en ny översättning kommer den att öppnas med det ursprungliga kopierade innehållet (titel och innehåll).
// 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' );
*Thissnippethittades i en anteckning från december 2020. Även om det fortfarande fungerar, skulle det inte skada att hålla ett öga på det ifall det med tiden och framtida Polylang-uppdateringar misslyckas.
Visa det totala antalet inlägg som har översatts med Polylang på varje språk
Med den här funktionen kan du lägga till en kortkod för varje språk som visar det totala antalet inlägg som publicerats på ett språk där det finns översättningar som lagts till med Polylang-pluginet.
Denna funktion är mer än testad och fungerar som den ska på min statistiksida och är användbar för att upprätthålla en lista över räknare som uppdateras automatiskt.
Snippet läggs till i mallens 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');
Ett av de problem vi står inför här är att om du har många inlägg på många olika språk på din webbplats, vilket är fallet med den här bloggen, kan databasfrågans inverkan sakta ner laddningshastigheten. Koden tar hänsyn till detta och frågan optimeras med hjälp av WP_Query med fält => 'ids' för att minska minneskostnaden genom att inte ladda hela inläggsobjekt.
Antalet inlägg lagras med hjälp av set_transient och undviker upprepade databasfrågor. I exemplet uppdateras cacheminnet var 12:e timme, uttryckt i sekunder (du kan justera den här tiden efter dina behov).
För att optimera frågan används WP_Query i stället för get_posts för att komma åt found_posts, som returnerar det totala antalet inlägg utan att behöva ladda alla objekt.
Parametern fields => 'ids' minskar minnesbelastningen genom att endast hämta inläggs-ID:n.
Om du vid något tillfälle behöver rensa cacheminnet manuellt (t.ex. efter att ha publicerat ett nytt inlägg) så att det inte visar inaktuella data kan du använda:
delete_transient('post_count_by_lang_' . $lang);
Om du föredrar att automatisera den här processen kommer följande funktion att radera transienten varje gång ett inlägg publiceras, uppdateras eller raderas. Om du lägger till den i functions.php i din mall kommer kroken att aktiveras för alla dessa åtgärder:
//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
Och den här rensar cacheminnet automatiskt enligt ett antal olika möjliga scenarier(inklusive det ovan):
// 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');
Siffrorna visas med hjälp av kortkoden för varje språk med motsvarande kod var du än vill visa siffran. Det ser ut så här:
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.
Du kan ändra"post_type" i koden om du vill räkna andra typer av innehåll (sidor, anpassade inläggstyper etc.).
I den här URL:en finns ett exempel på hur kortkoderna fungerar.
Lägg till native Polylang-banners på valfri sida eller i valfritt inlägg
Eftersom Polylang innehåller en samling med 249 16x11-flaggor i .png-format kan vi använda dem för att dekorera listor, lägga till dem i tabeller, stycken etc. utan att behöva skriva HTML eller CSS.
Med den här funktionen kan du lägga till bilden av en native-banner som används av plugin-programmet via en kortkod.
För att göra dem tillgängliga lägger du till snippet i functions.php i ditt barntema, i ett anpassat plugin eller med Code Snippet, om du använder det.
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');
När du har lagt till koden kan du använda kortkoden med motsvarande landskod på valfri WordPress-sida eller inlägg och se till att den matchar exakt namnen på flaggfilerna i mappen /wp-content/plugins/polylang/flags/.
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Original size
[polylang_flag code="de"]
Om du vill ändra storleken på flaggorna ändrar du bara värdet på storleksattributet i kortkoden.
Om du vill skapa och använda dina egna banners eller ha en annan samling med en annan design, hosta bara de nya (i .png) i en ny mapp med ett annat namn (annars kommer du att förlora ändringarna när plugin-programmet uppdateras) och lägg till den nya sökvägen i koden. Till exempel:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');
Lägga till en SVG-ikon bredvid språkväljaren
Detta utdrag lägger till en SVG-ikon med "Översätt"-symbolen till vänster om Polylangs modersmålsväljare för att göra den mer visuellt tilltalande och fånga besökarens uppmärksamhet. I exemplet är ikonen den som jag använder i den här bloggen. Du kan leta efter den du gillar mest och ersätta den. Här är några av dem.
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');
Visa anpassningsbar varning om att det finns en version på ett främmande språk
Den här funktionen skapar en kortkod för att visa en varning med gul bakgrund som kan läggas till var som helst på ett inlägg eller en sida. Detta meddelande varnar för att artikeln har en engelsk översättning med Polylang och ger en länk till den engelska versionen.
Jag har valt det här exemplet eftersom jag har använt det när en artikel, oavsett språk, fick mer trafik från engelsktalande länder och från engelskspråkiga webbläsare (vilket inte heller garanterar att personen bakom den letade efter den engelska versionen). Men det är ändå ett sätt att se till att besökarna stannar kvar i vissa fall.
Kod att lägga till i 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');
I stilen kan du ändra meddelandet, storleken på texten, färgerna på texten, bakgrunden och länken efter eget tycke och smak.
För att lägga till meddelandet var du vill, använd bara den här kortkoden:
[polylang_translation_notice]
Med CSS:en i exemplet ser det ut så här.

Om du vill lägga till ett meddelande om översättningen på ett annat språk ändrar du bara språkkoden i pll_get_post($post_id, 'en'); till 'fr', 'de', 'it' osv. Om du behöver använda flera inlägg kan du lägga till olika snippets, ett för varje språk. Du kan lägga till dem alla i ett utdrag, men jag behövde bara ett.