Fem nyttige uddrag til Polylang

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

No comments

 

Fem nyttige uddrag til Polylang 0
Optagelse af 5. februar 2025

Selv om der er forskellige meninger om, hvilket plugin der er bedst til at oprette en flersproget blog, og alle har udviklet sig meget siden deres første versioner, der forenklede og lettede opgaven, er et af de mest brugte Polylang.

Med mere end 700.000 aktive installationer til dato er det stadig en af de letteste og mest effektive muligheder.

Her er en lille liste over uddrag med funktioner og filtre, som måske kan være nyttige på et tidspunkt. De fungerer alle sammen i den gratis version af Polylang og er blevet testet og/eller brugt her.

Kopier indhold fra det oprindelige indlæg ved hjælp af Polylang i den gratis version

Hvis du bruger den gratis version af Polylang-plugin 'et til WordPress, ved du allerede, at den nye side eller det nye indlæg, det genererer til oversættelse, ikke kopierer det oprindelige indhold. Dette er en af funktionerne i den betalte version, og i den gratis version skal du indsætte indholdet i hånden.

For at løse dette og fremskynde processen skal du blot tilføje disse funktioner i filen functions.php i din skabelon. Når du nu tilføjer en ny oversættelse, vil den åbne med det originale kopierede indhold (titel og indhold).

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

*Thissnippetblev fundet i en note fra december 2020. Selvom det stadig virker, ville det ikke skade at holde øje med det i tilfælde af, at det med tiden og fremtidige Polylang-opdateringer fejler.

Vis det samlede antal indlæg, der er oversat med Polylang på hvert sprog

Med denne funktion kan du tilføje en kortkode for hvert sprog, som viser det samlede antal indlæg, der er udgivet på et sprog, hvor der er tilføjet oversættelser med Polylang-plugin'et.

Denne funktion er mere end testet og fungerer korrekt på min statistikside og er nyttig til at vedligeholde en liste over tællere, der automatisk opdateres.

Uddraget tilføjes til skabelonens functions.php:

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

Et af de problemer, vi står over for her, er, at hvis du har mange indlæg på mange forskellige sprog på dit websted, som det er tilfældet med denne blog, kan virkningen af databaseforespørgslen sænke indlæsningshastigheden. Koden tager højde for dette, og forespørgslen er optimeret ved hjælp af WP_Query med fields => 'ids' for at reducere hukommelsesoverhead ved ikke at indlæse hele indlægsobjekter.

Antallet af indlæg gemmes ved hjælp af set_transient, så man undgår gentagne databaseforespørgsler. I eksemplet opdateres cachen hver 12. time, udtrykt i sekunder (du kan justere denne tid efter dine behov).

For at optimere forespørgslen bruges WP_Query i stedet for get_posts til at få adgang til found_posts, som returnerer det samlede antal indlæg uden behov for at indlæse alle objekter.

Parameteren fields => 'ids' reducerer hukommelsesbelastningen ved kun at hente indlægs-ID'erne.

Hvis du på et tidspunkt har brug for at rydde cachen manuelt (f.eks. efter at have udgivet et nyt indlæg), så den ikke viser uaktuelle data, kan du bruge den:

delete_transient('post_count_by_lang_' . $lang);

Hvis du foretrækker at automatisere denne proces, vil følgende funktion slette transienten, hver gang et indlæg udgives, opdateres eller slettes. Hvis du tilføjer den i functions.php i din skabelon, vil krogen blive aktiveret for alle disse handlinger:

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

Og denne rydder automatisk cachen i henhold til en række forskellige mulige scenarier(inklusive det ovenstående):

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

Tallene vises ved hjælp af kortkoden for hvert sprog med den tilsvarende kode, uanset hvor du vil vise tallet. Det ser sådan ud:

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.

Du kan ændre'post_type' i koden, hvis du vil tælle andre typer indhold (sider, brugerdefinerede indlægstyper osv.).

I denne URL har du et eksempel på, hvordan kortkoderne fungerer.

Tilføj native Polylang-bannere til enhver side eller ethvert indlæg

Da Polylang indeholder en samling af 249 16x11-flag i .png, kan vi bruge dem til at dekorere lister, tilføje dem til tabeller, afsnit osv. uden at skulle skrive HTML eller CSS.

Denne funktion giver dig mulighed for at tilføje billedet af ethvert indbygget banner, der bruges af pluginet, via en kortkode.

For at gøre dem tilgængelige skal du tilføje snippet i functions.php i dit child theme, i et brugerdefineret plugin eller med Code Snippet, hvis du bruger det.

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

Når du har tilføjet koden, kan du bruge kortkoden med den tilsvarende landekode på en hvilken som helst WordPress-side eller -indlæg og sørge for, at den matcher nøjagtigt navnene på flagfilerne i mappen /wp-content/plugins/polylang/flags/.

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

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

Hvis du vil lege med størrelsen på flagene, skal du blot ændre værdien af størrelsesattributten i kortkoden.

Hvis du vil oprette og bruge dine egne bannere eller have en anden kollektion med et andet design, skal du bare hoste de nye (i .png) i en ny mappe med et andet navn (ellers mister du ændringerne, når plugin'et opdateres) og tilføje den nye sti til koden. For eksempel:

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

Tilføjelse af et SVG-ikon ved siden af sprogvælgeren

Dette uddrag tilføjer et SVG-ikon med "Oversæt"-symbolet til venstre for Polylangs modersmålsvælger for at gøre det mere visuelt tiltalende og fange den besøgendes opmærksomhed. I eksemplet er ikonet det, jeg bruger i denne blog. Du kan finde det, du bedst kan lide, og udskifte det. Her er et par af dem.

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


Vis skræddersyet advarsel om eksistensen af en fremmedsproget version

Denne funktion opretter en kortkode til at vise en advarsel med gul baggrund, som kan tilføjes hvor som helst på et indlæg eller en side. Denne besked advarer om, at artiklen har en engelsk oversættelse med Polylang og giver et link til den engelske version.

Jeg har valgt dette eksempel, fordi jeg har brugt det, når en artikel på et hvilket som helst sprog fik mere trafik fra engelsktalende lande og fra engelsksprogede browsere (hvilket heller ikke garanterer, at personen bag den ledte efter den engelske version). Alligevel er det en måde at sikre, at besøgende bliver hængende i nogle tilfælde.

Kode til at tilføje til 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');

I stilen kan du ændre budskabet, størrelsen på teksten, farverne på teksten, baggrunden og linket efter eget ønske.

For at tilføje beskeden, hvor du vil, skal du bare bruge denne kortkode:

[polylang_translation_notice]

Med CSS'en i eksemplet ser det sådan ud.

Eksempel på udseendet af annoncen, 14px sort tekst på en lysegul baggrund og blåt link.

Hvis du vil tilføje en meddelelse til oversættelsen på et andet sprog, skal du bare ændre sprogkoden i pll_get_post($post_id, 'en'); til 'fr', 'de', 'it' osv. Hvis du skal bruge flere indlæg, kan du tilføje forskellige uddrag, et for hvert sprog. Du kan tilføje dem alle i ét snippet, men jeg havde kun brug for ét.


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

Relaterede artikler

Skriv en kommentar

Este blog se aloja en LucusHost

Lucushot, el mejor hosting

E-mail-abonnement

Modtag gratis, fulde artikler i din indbakke uden reklamer, så snart de udgives. Det fulde indhold af feedet sendes reklamefrit via en ekstern tjeneste.