Cinq extraits utiles pour Polylang

Publicado: 05/02/2025 : 18:29 | Actualizado: 05/02/2025 : 19:07 |

Aucun commentaire

 

Cinq extraits utiles pour Polylang 0
Capture du 5 février 2025

Bien qu'il y ait différents avis sur le meilleur plugin pour créer un blog multilingue, et que tous aient beaucoup évolué depuis leurs premières versions en simplifiant et en facilitant la tâche, l'un des plus utilisés est Polylang.

Avec plus de 700 000 installations actives à ce jour, il reste l'une des options les plus légères et les plus efficaces.

Voici une petite liste de snippets avec des fonctions et des filtres qui pourraient être utiles à un moment ou à un autre. Tous fonctionnent pour la version gratuite de Polylang et ont été testés et/ou utilisés ici.

Copier le contenu de l'article original en utilisant Polylang dans sa version gratuite

Si vous utilisez la version gratuite du plugin Polylang pour WordPress, vous savez déjà que la nouvelle page ou le nouvel article qu'il génère pour la traduction ne copie pas le contenu original. C'est l'une des caractéristiques de sa version payante et, dans la version gratuite, vous devez coller le contenu à la main.

Pour résoudre ce problème et accélérer le processus, il suffit d'ajouter ces fonctions dans le fichier functions.php de votre modèle. Désormais, lorsque vous ajouterez une nouvelle traduction, elle s'ouvrira avec le contenu original copié (titre et contenu).

// 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' );

*Cet extraita été trouvé dans une note datant de décembre 2020. Bien qu'il fonctionne toujours, il ne serait pas inutile de garder un œil dessus au cas où, avec le temps et les futures mises à jour de Polylang, il échouerait.

Afficher le nombre total d'articles traduits avec Polylang dans chaque langue

Cette fonction vous permet d'ajouter un shortcode pour chaque langue qui affichera le nombre total d'articles publiés dans une langue dans laquelle il y a des traductions ajoutées avec le plugin Polylang.

Cette fonction a été plus que testée et fonctionne correctement sur ma page de statistiques. Elle est utile pour maintenir une liste de compteurs qui sont automatiquement mis à jour.

L'extrait est ajouté au fichier functions.php du modèle :

// 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');

L'un des problèmes que nous rencontrons ici est que si vous avez beaucoup d'articles dans de nombreuses langues différentes sur votre site, comme c'est le cas pour ce blog, l'impact de la requête de la base de données pourrait ralentir la vitesse de chargement. Le code prend cela en compte et la requête est optimisée en utilisant WP_Query avec fields => 'ids' pour réduire la surcharge de mémoire en ne chargeant pas des objets d'articles entiers.

Le nombre de messages est stocké à l'aide de set_transient, ce qui permet d'éviter les requêtes répétitives à la base de données. Dans l'exemple, le cache est mis à jour toutes les 12 heures, exprimées en secondes (vous pouvez ajuster ce temps en fonction de vos besoins).

Pour optimiser la requête, WP_Query est utilisé à la place de get_posts pour accéder à found_posts, qui renvoie le nombre total d'articles sans qu'il soit nécessaire de charger tous les objets.

Le paramètre fields => 'ids' réduit la charge de mémoire en ne récupérant que les identifiants des messages.

Si, à un moment donné, vous devez vider le cache manuellement (par exemple, après avoir publié un nouvel article) afin qu'il n'affiche pas de données périmées, vous pouvez l'utiliser :

delete_transient('post_count_by_lang_' . $lang);

Si vous préférez automatiser ce processus, la fonction suivante supprimera le transitoire à chaque fois qu'un message est publié, mis à jour ou supprimé. Si vous l'ajoutez dans le fichier functions.php de votre modèle, le crochet sera activé pour toutes ces actions :

//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

Et celui-ci efface automatiquement le cache en fonction d'un certain nombre de scénarios possibles(y compris le scénario ci-dessus) :

// 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');

Les numéros sont affichés à l'aide du shortcode pour chaque langue avec le code correspondant à l'endroit où vous souhaitez afficher le numéro. Voici à quoi cela ressemble :

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.

Vous pouvez modifier le'post_type' dans le code si vous souhaitez compter d'autres types de contenu (pages, types de posts personnalisés, etc.).

Dans cette URL, vous avez un exemple de fonctionnement des shortcodes.

Ajouter des bannières natives Polylang à n'importe quelle page ou message

Puisque Polylang inclut une collection de 249 drapeaux 16x11 en .png, nous pouvons les utiliser pour décorer des listes, les ajouter à des tableaux, des paragraphes, etc. sans avoir à écrire du HTML ou du CSS.

Cette fonction vous permet d'ajouter l'image de n'importe quelle bannière native utilisée par le plugin via un shortcode.

Pour les rendre disponibles, vous devez ajouter le snippet dans le fichier functions.php de votre thème enfant, dans un plugin personnalisé ou avec Code Snippet, si vous l'utilisez.

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');

Une fois que vous avez ajouté le code, vous pouvez utiliser le shortcode avec le code pays correspondant sur n'importe quelle page ou article de WordPress en vous assurant qu'il correspond exactement aux noms des fichiers de drapeaux dans le dossier /wp-content/plugins/polylang/flags/.

[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]

//Original size
[polylang_flag code="de"]

Pour modifier la taille des drapeaux, il suffit de changer la valeur de l'attribut size dans le shortcode.

Si vous souhaitez créer et utiliser vos propres bannières ou avoir une autre collection avec un design différent, il suffit d'héberger les nouvelles (en .png) dans un nouveau dossier avec un nom différent (sinon vous perdrez les changements lors de la mise à jour du plugin) et d'ajouter le nouveau chemin dans le code. Par exemple :

$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');

Ajout d'une icône SVG à côté du sélecteur de langue

Ce snippet ajoute une icône SVG avec le symbole "Translate" à gauche du sélecteur de langue maternelle de Polylang pour le rendre plus attrayant visuellement et attirer l'attention du visiteur. Dans l'exemple, l'icône est celle que j'utilise dans ce blog. Vous pouvez rechercher celle qui vous plaît le plus et la remplacer. En voici quelques-unes.

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');


Afficher un avertissement personnalisable sur l'existence d'une version en langue étrangère

Cette fonction crée un shortcode pour afficher un avertissement sur fond jaune qui peut être ajouté n'importe où dans un article ou une page. Ce message prévient que l'article a une traduction anglaise avec Polylang et fournit un lien vers la version anglaise.

J'ai choisi cet exemple parce que je l'ai utilisé lorsqu'un article, quelle que soit la langue, recevait plus de trafic en provenance des pays anglophones et des navigateurs de langue anglaise (ce qui ne garantit pas non plus que la personne qui se trouvait derrière recherchait la version anglaise). C'est néanmoins un moyen d'assurer la rétention des visiteurs dans certains cas.

Code à ajouter au fichier 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');

Dans le style, vous pouvez modifier le message, la taille du texte, les couleurs du texte, l'arrière-plan et le lien à votre convenance.

Pour ajouter le message où vous le souhaitez, il vous suffit d'utiliser ce shortcode :

[polylang_translation_notice]

Avec le CSS de l'exemple, cela ressemble à ceci.

Exemple de l'aspect de l'annonce, texte noir de 14 px sur fond jaune clair et lien bleu.

Si vous souhaitez ajouter un avis à la traduction dans une autre langue, il vous suffit de modifier le code de la langue dans pll_get_post($post_id, 'en') ; en 'fr', 'de', 'it', etc. Si vous devez utiliser plusieurs posts, vous pouvez ajouter différents snippets, un pour chaque langue. Vous pourriez les ajouter tous dans un seul snippet, mais je n'en avais besoin que d'un seul.


Suscríbete por email para recibir las viñetas y los artículos completos y sin publicidad

Articles connexes

Laisser un commentaire