Cinque utili snippet per Polylang

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

No comments

 

Cinque utili snippet per Polylang 0
Cattura del 5 febbraio 2025

Anche se ci sono opinioni diverse su quale sia il miglior plugin per creare un blog multilingue, e tutti si sono evoluti molto dalle loro prime versioni semplificando e facilitando il compito, uno dei più utilizzati è Polylang.

Con oltre 700.000 installazioni attive ad oggi, rimane una delle opzioni più leggere ed efficaci.

Ecco un piccolo elenco di snippet con funzioni e filtri che potrebbero essere utili in qualche momento. Tutti funzionano con la versione gratuita di Polylang e sono stati testati e/o utilizzati qui.

Copiare il contenuto del post originale utilizzando Polylang nella sua versione gratuita

Se utilizzate la versione gratuita del plugin Polylang per WordPress, sapete già che la nuova pagina o il nuovo post che genera per la traduzione non copia il contenuto originale. Questa è una delle caratteristiche della versione a pagamento e nella versione gratuita è necessario incollare il contenuto a mano.

Per risolvere questo problema e velocizzare il processo, basta aggiungere queste funzioni nel file functions.php del template. Ora, quando si aggiunge una nuova traduzione, questa si aprirà con il contenuto originale copiato (titolo e contenuto).

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

*Questo frammentoè stato trovato in una nota del dicembre 2020. Anche se funziona ancora, non sarebbe male tenerlo d'occhio nel caso in cui, con il tempo e i futuri aggiornamenti di Polylang, venisse meno.

Mostra il numero totale di post tradotti con Polylang in ciascuna lingua

Questa funzione consente di aggiungere uno shortcode per ogni lingua che mostrerà il numero totale di post pubblicati in una lingua in cui sono presenti traduzioni aggiunte con il plugin Polylang.

Questa funzione è più che testata e funziona correttamente sulla mia pagina delle statistiche ed è utile per mantenere un elenco di contatori che vengono aggiornati automaticamente.

Lo snippet viene aggiunto al file functions.php del template :

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

Uno dei problemi che dobbiamo affrontare è che se sul sito sono presenti molti post in molte lingue diverse, come nel caso di questo blog, l'impatto della query al database potrebbe rallentare la velocità di caricamento. Il codice tiene conto di questo aspetto e la query è ottimizzata utilizzando WP_Query con campi => 'ids' per ridurre l'overhead di memoria evitando di caricare interi oggetti post.

Il conteggio dei post è memorizzato tramite set_transient ed evita query ripetitive al database. Nell'esempio, la cache viene aggiornata ogni 12 ore, espresse in secondi (si può regolare questo tempo in base alle proprie esigenze).

Per ottimizzare la query, al posto di get_posts si usa WP_Query per accedere a found_posts, che restituisce il numero totale di post senza dover caricare tutti gli oggetti.

Il parametro fields => 'ids' riduce il carico di memoria recuperando solo gli ID dei post.

Se a un certo punto è necessario cancellare manualmente la cache (ad esempio dopo aver pubblicato un nuovo post) in modo da non mostrare dati obsoleti, si può usare:

delete_transient('post_count_by_lang_' . $lang);

Se si preferisce automatizzare questo processo, la seguente funzione cancellerà il transitorio ogni volta che un post viene pubblicato, aggiornato o cancellato. Se la si aggiunge nel functions.php del proprio template, il gancio sarà attivato per tutte queste azioni:

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

E questo cancella automaticamente la cache in base a una serie di scenari possibili(compreso quello sopra descritto):

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

I numeri vengono visualizzati utilizzando lo shortcode per ogni lingua con il codice corrispondente, ovunque si voglia visualizzare il numero. L'aspetto è il seguente:

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.

È possibile modificare il"post_type" nel codice se si desidera contare altri tipi di contenuti (pagine, tipi di post personalizzati, ecc.).

In questo URL è presente un esempio di funzionamento degli shortcode.

Aggiungere banner nativi Polylang a qualsiasi pagina o post

Poiché Polylang include una collezione di 249 bandierine 16x11 in formato .png, possiamo usarle per decorare elenchi, aggiungerle a tabelle, paragrafi, ecc. senza dover scrivere HTML o CSS.

Questa funzione consente di aggiungere l'immagine di qualsiasi banner nativo utilizzato dal plugin tramite uno shortcode.

Per renderli disponibili si aggiunge lo snippet nel functions.php del tema figlio, in un plugin personalizzato o con Code Snippet, se lo si utilizza.

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

Una volta aggiunto il codice, è possibile utilizzare lo shortcode con il codice paese corrispondente in qualsiasi pagina o post di WordPress , assicurandosi che corrisponda esattamente ai nomi dei file delle bandiere nella cartella /wp-content/plugins/polylang/flags/.

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

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

Per giocare con le dimensioni delle bandierine, è sufficiente modificare il valore dell'attributo size nello shortcode.

Se si desidera creare e utilizzare i propri banner o avere un'altra collezione con un design diverso, è sufficiente ospitare i nuovi banner (in formato .png) in una nuova cartella con un nome diverso (altrimenti si perderanno le modifiche quando il plugin verrà aggiornato) e aggiungere il nuovo percorso al codice. Ad esempio:

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

Aggiunta di un'icona SVG accanto al selettore di lingua

Questo snippet aggiunge un'icona SVG con il simbolo "Translate" a sinistra del selettore della lingua nativa di Polylang per renderlo più accattivante e catturare l'attenzione del visitatore. Nell'esempio, l'icona è quella che uso in questo blog. Potete cercare quella che vi piace di più e sostituirla. Eccone alcune.

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


Mostrare un avviso personalizzabile dell'esistenza di una versione in lingua straniera

Questa funzione crea uno shortcode per visualizzare un avviso con sfondo giallo che può essere aggiunto in qualsiasi punto di un post o di una pagina. Questo messaggio avverte che l'articolo ha una traduzione in inglese con Polylang e fornisce un link alla versione inglese.

Ho scelto questo esempio perché l'ho utilizzato quando un articolo, in qualsiasi lingua, ha ricevuto più traffico dai Paesi anglofoni e dai browser in lingua inglese (il che non garantisce che la persona che lo ha letto stesse cercando la versione inglese). Tuttavia, in alcuni casi è un modo per garantire la fidelizzazione dei visitatori.

Codice da aggiungere a 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');

Nello stile è possibile modificare il messaggio, le dimensioni del testo, i colori del testo, lo sfondo e il link a proprio piacimento.

Per aggiungere il messaggio dove si vuole, basta usare questo shortcode:

[polylang_translation_notice]

Con il CSS dell'esempio, l'aspetto è questo.

Esempio dell'aspetto dell'annuncio, testo nero a 14px su sfondo giallo chiaro e link blu.

Se si vuole aggiungere un avviso alla traduzione in un'altra lingua, basta cambiare il codice della lingua in pll_get_post($post_id, 'en'); in 'fr', 'de', 'it', ecc. Se si devono usare più post, si possono aggiungere diversi snippet, uno per ogni lingua. Si potrebbero aggiungere tutti in un unico snippet, ma a me ne serviva solo uno.


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

Articoli correlati

Lascia un commento

Este blog se aloja en LucusHost

Lucushot, el mejor hosting

Abbonamento via e-mail

Ricevi gratuitamente nella tua casella di posta elettronica articoli completi senza pubblicità non appena vengono pubblicati. Il contenuto completo del feed viene inviato senza pubblicità tramite un servizio esterno.