Fem nyttige utdrag for Polylang

 
Fem nyttige utdrag for Polylang 0
Fangst av 5. februar 2025

Selv om det er ulike meninger om hvilken plugin som er den beste for å lage en flerspråklig blogg, og alle har utviklet seg mye siden de første versjonene forenklet og lettet oppgaven, er Polylang en av de mest brukte.

Med mer enn 700 000 aktive installasjoner til dags dato er det fortsatt et av de letteste og mest effektive alternativene.

Her er en liten liste over utdrag med funksjoner og filtre som kan være nyttige på et eller annet tidspunkt. Alle fungerer for gratisversjonen av Polylang og har blitt testet og/eller brukt her.

Kopier innhold fra det opprinnelige innlegget ved hjelp av Polylang i gratisversjonen

Hvis du bruker gratisversjonen av Polylang-plugin-modulen for WordPress, vet du allerede at den nye siden eller det nye innlegget som genereres for oversettelse, ikke kopierer det opprinnelige innholdet. Dette er en av funksjonene i den betalte versjonen, og i gratisversjonen må du lime inn innholdet for hånd.

For å løse dette og øke hastigheten på prosessen, legger du bare til disse funksjonene i functions.php-filen i malen din. Når du nå legger til en ny oversettelse, åpnes den med det opprinnelige kopierte innholdet (tittel og innhold).

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

*Thissnippetble funnet i et notat fra desember 2020. Selv om det fortsatt fungerer, kan det være lurt å holde et øye med det i tilfelle det skulle svikte med tiden og fremtidige Polylang-oppdateringer.

Vis det totale antallet innlegg som er oversatt med Polylang på hvert språk

Med denne funksjonen kan du legge til en kortkode for hvert språk som viser det totale antallet innlegg som er publisert på et språk der det er lagt til oversettelser med Polylang-tillegget.

Denne funksjonen er mer enn testet og fungerer som den skal på statistikksiden min, og den er nyttig for å vedlikeholde en liste over tellere som oppdateres automatisk.

Snutten legges til i malens 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 av problemene vi står overfor her, er at hvis du har mange innlegg på mange forskjellige språk på nettstedet ditt, slik tilfellet er med denne bloggen, kan virkningen av databasespørringen redusere innlastingshastigheten. Koden tar hensyn til dette, og spørringen er optimalisert ved hjelp av WP_Query med felter => 'ids' for å redusere minnebelastningen ved å ikke laste inn hele innleggsobjekter.

Antall innlegg lagres ved hjelp av set_transient, slik at du unngår gjentatte databaseforespørsler. I eksempelet oppdateres hurtigbufferen hver 12. time, uttrykt i sekunder (du kan justere denne tiden etter dine behov).

For å optimalisere spørringen brukes WP_Query i stedet for get_posts for å få tilgang til found_posts, som returnerer det totale antallet innlegg uten at det er nødvendig å laste inn alle objekter.

Parameteren fields => 'ids' reduserer minnebelastningen ved å hente bare innleggs-ID-ene.

Hvis du på et tidspunkt trenger å tømme hurtigbufferen manuelt (f.eks. etter å ha publisert et nytt innlegg), slik at den ikke viser foreldede data, kan du bruke den:

delete_transient('post_count_by_lang_' . $lang);

Hvis du foretrekker å automatisere denne prosessen, vil følgende funksjon slette transienten hver gang et innlegg publiseres, oppdateres eller slettes. Hvis du legger den til i functions.php i malen din, vil kroken bli aktivert for alle disse handlingene:

//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 tømmer hurtigbufferen automatisk i henhold til en rekke forskjellige mulige scenarier(inkludert det ovenfor):

// 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 hjelp av kortkoden for hvert språk med tilhørende kode der du ønsker å vise tallet. Det ser slik ut:

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 endre"post_type" i koden hvis du ønsker å telle andre typer innhold (sider, egendefinerte innleggstyper osv.).

I denne URL-en har du et eksempel på hvordan kortkodene fungerer.

Legg til egne Polylang-bannere på alle sider eller innlegg

Siden Polylang inneholder en samling med 249 16x11-flagg i .png-format, kan vi bruke dem til å dekorere lister, legge dem til i tabeller, avsnitt osv. uten å måtte skrive HTML eller CSS.

Med denne funksjonen kan du legge til bildet av et hvilket som helst innfødt banner som brukes av plugin-modulen via en kortkode.

For å gjøre dem tilgjengelige legger du til snippet i functions.php i barnetemaet ditt, i en tilpasset plugin eller med Code Snippet, hvis du bruker 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 lagt til koden, kan du bruke kortkoden med den tilsvarende landskoden på en hvilken som helst WordPress-side eller -innlegg og sørge for at den samsvarer nøyaktig med navnene på flaggfilene 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 endre størrelsen på flaggene, endrer du bare verdien på størrelsesattributtet i kortkoden.

Hvis du vil lage og bruke dine egne bannere eller ha en annen samling med et annet design, er det bare å legge de nye bannerne (i .png) i en ny mappe med et annet navn (ellers vil du miste endringene når plugin-modulen oppdateres) og legge til den nye banen i koden. For eksempel:

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

Legge til et SVG-ikon ved siden av språkvelgeren

Dette utdraget legger til et SVG-ikon med "Oversett"-symbolet til venstre for Polylangs morsmålsvelger for å gjøre det mer visuelt tiltalende og fange den besøkendes oppmerksomhet. I eksempelet er ikonet det jeg bruker i denne bloggen. Du kan finne det du liker best og erstatte det. Her er noen av 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 tilpassbar advarsel om at det finnes en fremmedspråklig versjon

Denne funksjonen oppretter en kortkode for å vise en advarsel med gul bakgrunn som kan legges til hvor som helst på et innlegg eller en side. Denne meldingen advarer om at artikkelen har en engelsk oversettelse med Polylang og gir en lenke til den engelske versjonen.

Jeg har valgt dette eksempelet fordi jeg har brukt det når en artikkel, uansett språk, har fått mer trafikk fra engelskspråklige land og fra engelskspråklige nettlesere (noe som heller ikke garanterer at personen bak den var ute etter den engelske versjonen). Det er likevel en måte å sikre at besøkende blir værende i noen tilfeller.

Kode som skal legges til i 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 endre budskapet, tekststørrelsen, tekstfargene, bakgrunnen og lenken etter eget ønske.

For å legge til meldingen hvor du vil, bruker du bare denne kortkoden:

[polylang_translation_notice]

Med CSS i eksempelet ser det slik ut.

Eksempel på annonsens utseende, 14px svart tekst på lysegul bakgrunn og blå lenke.

Hvis du vil legge til en merknad i oversettelsen på et annet språk, endrer du bare språkkoden i pll_get_post($post_id, 'en' ); til 'fr', 'de', 'it' osv. Hvis du trenger å bruke flere innlegg, kan du legge til forskjellige utdrag, ett for hvert språk. Du kan legge til alle i ett utdrag, men jeg trengte bare ett.

Suscripción por email

Related articles

Este blog se aloja en LucusHost

LucusHost, el mejor hosting