- Kopieer inhoud van het originele bericht met Polylang in de gratis versie
- Toon het totale aantal berichten vertaald met Polylang in elke taal
- Voeg Polylang banners toe aan elke pagina of post
- Een SVG-pictogram toevoegen naast de taalselector
- Aanpasbare waarschuwing tonen voor het bestaan van een versie in een vreemde taal

Hoewel er verschillende meningen zijn over welke de beste plugin is om een meertalige blog te maken, en ze allemaal veel geëvolueerd zijn sinds hun eerste versies die de taak vereenvoudigen en vergemakkelijken, is een van de meest gebruikte Polylang.
Met meer dan 700.000 actieve installaties tot nu toe blijft het een van de lichtste en meest effectieve opties.
Hier is een kleine lijst met knipsels met functies en filters die op een bepaald moment nuttig kunnen zijn. Ze werken allemaal voor de gratis versie van Polylang en zijn hier getest en/of gebruikt.
Kopieer inhoud van het originele bericht met Polylang in de gratis versie
Als je de gratis versie van de Polylang plugin voor WordPress gebruikt, dan weet je al dat de nieuwe pagina of post die het genereert voor vertaling niet de originele inhoud kopieert. Dit is een van de functies van de betaalde versie en in de gratis versie moet je de inhoud met de hand plakken.
Om dit op te lossen en het proces te versnellen, voeg je gewoon deze functies toe in het bestand functions.php van je sjabloon. Wanneer u nu een nieuwe vertaling toevoegt, wordt deze geopend met de origineel gekopieerde inhoud (titel en inhoud).
// 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' );
*Thissnippetwerd gevonden in een notitie van december 2020. Hoewel het nog steeds werkt, kan het geen kwaad om het in de gaten te houden voor het geval, met de tijd en toekomstige Polylang-updates, het faalt.
Toon het totale aantal berichten vertaald met Polylang in elke taal
Met deze functie kun je voor elke taal een shortcode toevoegen die het totale aantal berichten toont dat is gepubliceerd in een taal waarin vertalingen zijn toegevoegd met de Polylang-plugin.
Deze functie is meer dan getest en werkt naar behoren op mijn statistiekenpagina en is handig voor het bijhouden van een lijst met tellers die automatisch worden bijgewerkt.
Het fragment wordt toegevoegd aan functions.php van de sjabloon :
// 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');
Een van de problemen waarmee we hier te maken hebben is dat als je veel berichten in veel verschillende talen op je site hebt, zoals het geval is bij deze blog, de impact van de database query de laadsnelheid kan vertragen. De code houdt hier rekening mee en de query is geoptimaliseerd met WP_Query met velden => 'ids' om de overhead in het geheugen te verminderen door niet hele postobjecten te laden.
De posttelling wordt opgeslagen met set_transient en vermijdt repetitieve database queries. In het voorbeeld wordt de cache elke 12 uur bijgewerkt, uitgedrukt in seconden (je kunt deze tijd aanpassen aan je behoeften).
Om de query te optimaliseren, wordt WP_Query gebruikt in plaats van get_posts om toegang te krijgen tot found_posts, waardoor het totale aantal posts wordt geretourneerd zonder dat alle objecten hoeven te worden geladen.
De parameter velden => 'ids' vermindert de geheugenbelasting door alleen de post-ID's op te halen.
Als je op een bepaald moment de cache handmatig moet wissen (bijv. na het publiceren van een nieuw bericht) zodat er geen verouderde gegevens worden weergegeven, kun je dit gebruiken:
delete_transient('post_count_by_lang_' . $lang);
Als je dit proces liever automatiseert, dan zal de volgende functie de transiënt verwijderen telkens als een bericht wordt gepubliceerd, bijgewerkt of verwijderd. Als je deze functie toevoegt aan functions.php van je sjabloon, wordt de haak geactiveerd voor al deze acties:
//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
En deze wist de cache automatisch volgens een aantal verschillende mogelijke scenario's(inclusief het bovenstaande):
// 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');
De nummers worden weergegeven met behulp van de shortcode voor elke taal met de bijbehorende code waar je het nummer ook wilt weergeven. Het ziet er als volgt uit:
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.
Je kunt het'post_type' in de code aanpassen als je andere typen inhoud wilt tellen (pagina's, aangepaste posttypen, enz.).
In deze URL staat een voorbeeld van de werking van de shortcodes.
Voeg Polylang banners toe aan elke pagina of post
Omdat Polylang een verzameling van 249 16x11 vlaggen in .png bevat, kunnen we ze gebruiken om lijsten te versieren, ze toe te voegen aan tabellen, paragrafen, enz. zonder HTML of CSS te hoeven schrijven.
Met deze functie kun je de afbeelding van een native banner die door de plugin wordt gebruikt toevoegen via een shortcode.
Om ze beschikbaar te maken voeg je de snippet toe in de functions.php van je child theme, in een aangepaste plugin of met Code Snippet, als je die gebruikt.
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');
Zodra je de code hebt toegevoegd, kun je de shortcode met de corresponderende landcode gebruiken op elke WordPress pagina of bericht , waarbij je ervoor moet zorgen dat deze exact overeenkomt met de namen van de vlaggenbestanden in de map /wp-content/plugins/polylang/flags/.
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Original size
[polylang_flag code="de"]
Om met de grootte van de vlaggen te spelen, verander je gewoon de waarde van het kenmerk Grootte in de shortcode.
Als je je eigen banners wilt maken en gebruiken of een andere collectie wilt met een ander ontwerp, host je de nieuwe banners (in .png) in een nieuwe map met een andere naam (anders raak je de wijzigingen kwijt als de plugin wordt bijgewerkt) en voeg je het nieuwe pad toe aan de code. Bijvoorbeeld:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');
Een SVG-pictogram toevoegen naast de taalselector
Dit fragment voegt een SVG-pictogram met het "Vertalen"-symbool toe aan de linkerkant van de Polylang taalselector om het visueel aantrekkelijker te maken en de aandacht van de bezoeker te trekken. In het voorbeeld is het pictogram het pictogram dat ik gebruik in deze blog. Je kunt op zoek gaan naar het pictogram dat jij het mooist vindt en het vervangen. Hier zijn er een paar.
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');
Aanpasbare waarschuwing tonen voor het bestaan van een versie in een vreemde taal
Deze functie maakt een shortcode om een waarschuwing weer te geven met een gele achtergrond die overal op een bericht of pagina kan worden toegevoegd. Dit bericht waarschuwt dat het artikel een Engelse vertaling met Polylang heeft en geeft een link naar de Engelse versie.
Ik heb dit voorbeeld gekozen omdat ik het heb gebruikt toen een artikel, in welke taal dan ook, meer verkeer kreeg uit Engelstalige landen en van Engelstalige browsers (wat ook niet garandeert dat de persoon erachter op zoek was naar de Engelse versie). Toch is het in sommige gevallen een manier om bezoekers te behouden.
Code om toe te voegen aan 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');
In stijl kun je het bericht, de grootte van de tekst, de kleuren van de tekst, de achtergrond en de link naar wens aanpassen.
Om het bericht toe te voegen waar je maar wilt, gebruik je gewoon deze shortcode:
[polylang_translation_notice]
Met de CSS in het voorbeeld ziet het er als volgt uit.

Als je een mededeling wilt toevoegen aan de vertaling in een andere taal, verander dan gewoon de taalcode in pll_get_post($post_id, 'en'); in 'fr', 'de', 'it', enz. Als je meerdere posts moet gebruiken, kun je verschillende snippets toevoegen, één voor elke taal. Je zou ze allemaal in één knipsel kunnen toevoegen, maar ik had er maar één nodig.