Cinci snippets utile pentru Polylang

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

No comments

 

Cinci snippets utile pentru Polylang 0
Captură din 5 februarie 2025

Deși există opinii diferite cu privire la care este cel mai bun plugin pentru a crea un blog multilingv și toate acestea au evoluat mult de la primele lor versiuni, simplificând și facilitând sarcina, unul dintre cele mai utilizate este Polylang.

Cu peste 700.000 de instalații active până în prezent, rămâne una dintre cele mai ușoare și mai eficiente opțiuni.

Iată o mică listă de snippets cu funcții și filtre care ar putea fi utile la un moment dat. Toate acestea funcționează pentru versiunea gratuită a Polylang și au fost testate și/sau utilizate aici.

Copiați conținutul din postarea originală utilizând Polylang în versiunea sa gratuită

Dacă utilizați versiunea gratuită a pluginului Polylang pentru WordPress, știți deja că noua pagină sau postare pe care o generează pentru traducere nu copiază conținutul original. Aceasta este una dintre caracteristicile versiunii sale plătite, iar în versiunea gratuită trebuie să lipiți conținutul de mână.

Pentru a rezolva acest lucru și a accelera procesul, adăugați aceste funcții în fișierul functions.php al șablonului dvs. Acum, când adăugați o nouă traducere, aceasta se va deschide cu conținutul original copiat (titlu și conținut).

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

*Thissnippeta fost găsit într-o notă din decembrie 2020. Deși încă funcționează, nu ar strica să îl supravegheați în cazul în care, odată cu trecerea timpului și cu viitoarele actualizări Polylang, nu va mai funcționa.

Afișați numărul total de postări traduse cu Polylang în fiecare limbă

Această funcție vă permite să adăugați un cod scurt pentru fiecare limbă care va afișa numărul total de postări publicate într-o limbă în care există traduceri adăugate cu pluginul Polylang.

Această funcție este mai mult decât testată și funcționează corect pe pagina mea de statistici și este utilă pentru menținerea unei liste de contoare care sunt actualizate automat.

Fragmentul este adăugat la fișierul functions.php al șablonului :

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

Una dintre problemele cu care ne confruntăm aici este că, dacă aveți o mulțime de postări în multe limbi diferite pe site-ul dvs., cum este cazul acestui blog, impactul interogării bazei de date ar putea încetini viteza de încărcare. Codul ia în considerare acest lucru, iar interogarea este optimizată utilizând WP_Query cu fields => "ids" pentru a reduce cheltuielile de memorie prin faptul că nu se încarcă obiecte de post întregi.

Numărul de postări este stocat utilizând set_transient și evită interogările repetitive ale bazei de date. În exemplu, cache-ul este actualizat la fiecare 12 ore, exprimat în secunde (puteți ajusta acest timp în funcție de nevoile dvs.).

Pentru a optimiza interogarea, WP_Query este utilizat în loc de get_posts pentru a accesa found_posts, care returnează numărul total de posturi fără a fi nevoie să încărcați toate obiectele.

Parametrul fields => "ids" reduce încărcarea memoriei prin extragerea doar a ID-urilor posturilor.

Dacă la un moment dat trebuie să ștergeți manual memoria cache (de exemplu, după publicarea unei noi postări), astfel încât să nu fie afișate date neactualizate, puteți utiliza:

delete_transient('post_count_by_lang_' . $lang);

Dacă preferați să automatizați acest proces, următoarea funcție va șterge tranzitul de fiecare dată când o postare este publicată, actualizată sau ștearsă. Dacă o adăugați în functions.php al șablonului dvs., cârligul va fi activat pentru toate aceste acțiuni:

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

Iar acesta șterge automat memoria cache în funcție de o serie de scenarii posibile diferite(inclusiv cel de mai sus):

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

Numerele sunt afișate utilizând codul scurt pentru fiecare limbă cu codul corespunzător oriunde doriți să afișați numărul. Acesta arată astfel:

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.

Puteți modifica"post_type" în cod dacă doriți să numărați alte tipuri de conținut (pagini, tipuri de post personalizate etc.).

În acest URL aveți un exemplu de funcționare a codurilor scurte.

Adăugați bannere native Polylang la orice pagină sau post

Deoarece Polylang include o colecție de 249 de stegulețe 16x11 în format .png, le putem utiliza pentru a decora liste, pentru a le adăuga în tabele, paragrafe etc. fără a fi nevoie să scriem HTML sau CSS.

Această funcție vă permite să adăugați imaginea oricărui banner nativ utilizat de plugin prin intermediul unui cod scurt.

Pentru a le face disponibile, adăugați fragmentul în functions.php al temei dvs. copil, într-un plugin personalizat sau cu Code Snippet, dacă îl utilizați.

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

Odată ce ați adăugat codul, puteți utiliza codul scurt cu codul de țară corespunzător pe orice pagină sau postare WordPress , asigurându-vă că se potrivește exact cu numele fișierelor de steaguri din folderul /wp-content/plugins/polylang/flags/.

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

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

Pentru a modifica dimensiunea stegulețelor, modificați pur și simplu valoarea atributului size din shortcode.

Dacă doriți să creați și să utilizați propriile bannere sau să aveți o altă colecție cu un design diferit, trebuie doar să le găzduiți pe cele noi (în .png) într-un folder nou cu un nume diferit (altfel veți pierde modificările atunci când pluginul este actualizat) și să adăugați noua cale la cod. De exemplu:

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

Adăugarea unei pictograme SVG lângă selectorul de limbă

Acest fragment adaugă o pictogramă SVG cu simbolul "Traducere" în stânga selectorului de limbă maternă al Polylang pentru a-l face mai atractiv din punct de vedere vizual și a atrage atenția vizitatorului. În exemplu, pictograma este cea pe care o folosesc în acest blog. Puteți să o căutați pe cea care vă place cel mai mult și să o înlocuiți. Iată câteva dintre ele.

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


Afișarea unui avertisment personalizabil cu privire la existența unei versiuni într-o limbă străină

Această funcție creează un shortcode pentru a afișa un avertisment cu fundal galben care poate fi adăugat oriunde pe o postare sau pagină. Acest mesaj avertizează că articolul are o traducere în engleză cu Polylang și oferă un link către versiunea în engleză.

Am ales acest exemplu pentru că l-am folosit atunci când un articol, în orice limbă, a primit mai mult trafic din țările vorbitoare de limbă engleză și din browserele în limba engleză (ceea ce, de asemenea, nu garantează că persoana din spatele acestuia căuta versiunea în limba engleză). Totuși, este o modalitate de a asigura retenția vizitatorilor în unele cazuri.

Cod de adăugat la 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');

În stil puteți modifica mesajul, dimensiunea textului, culorile textului, fundalul și link-ul după bunul plac.

Pentru a adăuga mesajul oriunde doriți, trebuie doar să utilizați acest cod scurt:

[polylang_translation_notice]

Cu CSS-ul din exemplu arată astfel.

Exemplu de aspect al anunțului, text negru de 14px pe un fundal galben deschis și link albastru.

Dacă doriți să adăugați o notificare la traducerea în altă limbă, trebuie doar să modificați codul limbii în pll_get_post($post_id, 'en'); în 'fr', 'de', 'it' etc. Dacă trebuie să utilizați mai multe posturi, puteți adăuga fragmente diferite, unul pentru fiecare limbă. Le-ați putea adăuga pe toate într-un singur snippet, dar eu am avut nevoie doar de unul.


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

Articole conexe

Lasă un comentariu

Este blog se aloja en LucusHost

Lucushot, el mejor hosting