- Kopieren Sie den Inhalt des Originalbeitrags mit Polylang in der kostenlosen Version
- Anzeige der Gesamtzahl der mit Polylang übersetzten Beiträge in jeder Sprache
- Hinzufügen von nativen Polylang-Bannern zu jeder Seite oder jedem Beitrag
- Hinzufügen eines SVG-Symbols neben dem Sprachselektor
- Anzeige einer anpassbaren Warnung über das Vorhandensein einer fremdsprachigen Version

Obwohl es unterschiedliche Meinungen darüber gibt, welches das beste Plugin für die Erstellung eines mehrsprachigen Blogs ist, und sich alle seit ihren ersten Versionen stark weiterentwickelt haben, indem sie die Aufgabe vereinfacht und erleichtert haben, ist Polylang eines der am häufigsten verwendeten.
Mit bisher mehr als 700.000 aktiven Installationen ist es nach wie vor eine der leichtesten und effektivsten Optionen.
Hier ist eine kleine Liste von Schnipseln mit Funktionen und Filtern, die irgendwann einmal nützlich sein könnten. Sie funktionieren alle für die kostenlose Version von Polylang und wurden hier getestet und/oder verwendet.
Kopieren Sie den Inhalt des Originalbeitrags mit Polylang in der kostenlosen Version
Wenn Sie die kostenlose Version des Polylang-Plugins für WordPress verwenden, wissen Sie bereits, dass die neue Seite oder der neue Beitrag, den es für die Übersetzung erstellt, den ursprünglichen Inhalt nicht kopiert. Dies ist eine der Funktionen der kostenpflichtigen Version und in der kostenlosen Version müssen Sie den Inhalt von Hand einfügen.
Um dieses Problem zu lösen und den Prozess zu beschleunigen, fügen Sie diese Funktionen einfach in die Datei functions.php Ihrer Vorlage ein. Wenn Sie nun eine neue Übersetzung hinzufügen, wird diese mit dem kopierten Originalinhalt (Titel und Inhalt) geöffnet.
// 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' );
*Das Thissnippetwurde in einer Notiz vom Dezember 2020 gefunden. Obwohl es immer noch funktioniert, kann es nicht schaden, es im Auge zu behalten, falls es mit der Zeit und zukünftigen Polylang-Updates ausfällt.
Anzeige der Gesamtzahl der mit Polylang übersetzten Beiträge in jeder Sprache
Mit dieser Funktion können Sie für jede Sprache einen Shortcode hinzufügen, der die Gesamtzahl der in einer Sprache veröffentlichten Beiträge anzeigt, für die mit dem Polylang-Plugin Übersetzungen hinzugefügt wurden.
Diese Funktion ist mehr als getestet und funktioniert einwandfrei auf meiner Statistikseite und ist nützlich für die Pflege einer Liste von Zählern, die automatisch aktualisiert werden.
Das Snippet wird in die functions.php der Vorlage eingefügt :
// 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');
Eines der Probleme, mit denen wir hier konfrontiert sind, ist, dass die Auswirkungen der Datenbankabfrage die Ladegeschwindigkeit verlangsamen können, wenn Sie viele Beiträge in vielen verschiedenen Sprachen auf Ihrer Website haben, wie es bei diesem Blog der Fall ist. Der Code berücksichtigt dies und die Abfrage wird mit WP_Query mit fields => 'ids' optimiert, um den Speicher-Overhead zu reduzieren, indem nicht ganze Post-Objekte geladen werden.
Die Anzahl der Beiträge wird mit set_transient gespeichert und vermeidet wiederholte Datenbankabfragen. Im Beispiel wird der Cache alle 12 Stunden aktualisiert, ausgedrückt in Sekunden (Sie können diese Zeit nach Ihren Bedürfnissen anpassen).
Um die Abfrage zu optimieren, wird WP_Query anstelle von get_posts verwendet, um auf found_posts zuzugreifen, das die Gesamtzahl der Beiträge liefert, ohne dass alle Objekte geladen werden müssen.
Der Parameter fields => 'ids ' reduziert die Speicherbelastung, indem nur die Post-IDs abgerufen werden.
Wenn Sie zu einem bestimmten Zeitpunkt den Cache manuell leeren müssen (z. B. nach der Veröffentlichung eines neuen Beitrags), damit keine veralteten Daten angezeigt werden, können Sie dies verwenden:
delete_transient('post_count_by_lang_' . $lang);
Wenn Sie es vorziehen, diesen Prozess zu automatisieren, löscht die folgende Funktion den Transient jedes Mal, wenn ein Beitrag veröffentlicht, aktualisiert oder gelöscht wird. Wenn Sie sie in die functions.php Ihrer Vorlage einfügen, wird der Haken für alle diese Aktionen aktiviert:
//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
Und dieser löscht den Cache automatisch nach einer Reihe verschiedener möglicher Szenarien(einschließlich des oben genannten):
// 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');
Die Zahlen werden mit dem Shortcode für jede Sprache mit dem entsprechenden Code angezeigt, wo immer Sie die Zahl anzeigen möchten. Das sieht dann so aus:
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.
Sie können den"post_type" im Code ändern, wenn Sie andere Arten von Inhalten zählen möchten (Seiten, benutzerdefinierte Beitragstypen usw.).
Unter dieser URL finden Sie ein Beispiel für die Funktionsweise der Shortcodes.
Hinzufügen von nativen Polylang-Bannern zu jeder Seite oder jedem Beitrag
Da Polylang eine Sammlung von 249 16x11 Flaggen im .png-Format enthält, können wir sie verwenden, um Listen zu dekorieren, sie zu Tabellen, Absätzen usw. hinzuzufügen, ohne HTML oder CSS schreiben zu müssen.
Diese Funktion ermöglicht es Ihnen, das Bild eines nativen Banners, das vom Plugin verwendet wird, über einen Shortcode hinzuzufügen.
Um sie verfügbar zu machen, fügen Sie das Snippet in die functions.php Ihres Child-Themes, in ein benutzerdefiniertes Plugin oder mit Code Snippet ein, wenn Sie es verwenden.
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');
Sobald Sie den Code hinzugefügt haben, können Sie den Shortcode mit dem entsprechenden Ländercode auf jeder WordPress-Seite oder in jedem WordPress-Beitrag verwenden . Achten Sie dabei darauf, dass er genau mit den Namen der Flaggendateien im Ordner /wp-content/plugins/polylang/flags/ übereinstimmt.
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Original size
[polylang_flag code="de"]
Um mit der Größe der Flaggen zu spielen, ändern Sie einfach den Wert des Attributs size im Shortcode.
Wenn Sie Ihre eigenen Banner erstellen und verwenden möchten oder eine andere Sammlung mit einem anderen Design haben, hosten Sie die neuen Banner (in .png) einfach in einem neuen Ordner mit einem anderen Namen (sonst gehen die Änderungen verloren, wenn das Plugin aktualisiert wird) und fügen Sie den neuen Pfad zum Code hinzu. Zum Beispiel:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');
Hinzufügen eines SVG-Symbols neben dem Sprachselektor
Dieses Snippet fügt ein SVG-Symbol mit dem "Übersetzen"-Symbol links neben der Auswahl der Muttersprache von Polylang ein, um es optisch ansprechender zu gestalten und die Aufmerksamkeit des Besuchers zu erregen. Im Beispiel ist das Symbol dasjenige, das ich in diesem Blog verwende. Sie können nach dem Symbol suchen, das Ihnen am besten gefällt, und es ersetzen. Hier sind einige von ihnen.
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');
Anzeige einer anpassbaren Warnung über das Vorhandensein einer fremdsprachigen Version
Diese Funktion erstellt einen Shortcode zur Anzeige einer Warnung mit gelbem Hintergrund, die an beliebiger Stelle in einem Beitrag oder einer Seite eingefügt werden kann. Diese Meldung warnt davor, dass der Artikel eine englische Übersetzung mit Polylang hat und bietet einen Link zur englischen Version.
Ich habe dieses Beispiel gewählt, weil ich es verwendet habe, wenn ein Artikel, egal in welcher Sprache, mehr Besucher aus englischsprachigen Ländern und von englischsprachigen Browsern erhielt (was auch keine Garantie dafür ist, dass die Person dahinter nach der englischen Version gesucht hat). Dennoch ist es eine Möglichkeit, in manchen Fällen die Bindung der Besucher zu gewährleisten.
Code zum Hinzufügen in die 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');
Im Stil können Sie die Nachricht, die Größe des Textes, die Farben des Textes, den Hintergrund und den Link nach Ihren Wünschen ändern.
Um die Nachricht an der gewünschten Stelle einzufügen, verwenden Sie einfach diesen Shortcode:
[polylang_translation_notice]
Mit dem CSS im Beispiel sieht es so aus.

Wenn Sie der Übersetzung einen Hinweis in einer anderen Sprache hinzufügen wollen, ändern Sie einfach den Sprachcode in pll_get_post($post_id, 'en'); in 'fr', 'de', 'it', usw. Wenn Sie mehrere Beiträge verwenden müssen, können Sie verschiedene Snippets hinzufügen, eines für jede Sprache. Man könnte sie alle in einem Snippet hinzufügen, aber ich brauchte nur einen.