Piecas noderīgas fragmentu izlases Polylang lietojumprogrammai

Seleccionar idioma

Piecas noderīgas fragmentu izlases Polylang lietojumprogrammai 0
Uzņemšana 2025. gada 5. februārī

Lai gan ir dažādi viedokļi par to, kurš ir labākais spraudnis, lai izveidotu daudzvalodu emuāru, un visi no tiem ir daudz attīstījušies kopš to pirmajām versijām, vienkāršojot un atvieglojot uzdevumu, viens no visvairāk izmantotajiem ir Polylang.

Līdz šim ir uzstādīti vairāk nekā 700 000 aktīvo instalāciju, un tas joprojām ir viens no vieglākajiem un efektīvākajiem risinājumiem.

Šeit ir neliels saraksts ar funkcijām un filtriem , kas varētu būt noderīgi kādā brīdī. Visi tie darbojas Polylang bezmaksas versijā un ir pārbaudīti un/vai izmantoti šeit.

Kopēt saturu no sākotnējā amata, izmantojot Polylang bezmaksas versiju

Ja izmantojat WordPress spraudņa Polylang bezmaksas versiju, jūs jau zināt, ka jaunā lapa vai amats, ko tas ģenerē tulkošanai, nekopē oriģinālo saturu. Tā ir viena no tā maksas versijas funkcijām, un bezmaksas versijā saturs ir jāielīmē ar roku.

Lai atrisinātu šo problēmu un paātrinātu procesu, vienkārši pievienojiet šīs funkcijas šablona failā functions.php. Tagad, pievienojot jaunu tulkojumu, tas tiks atvērts ar sākotnējo kopēto saturu (virsrakstu un saturu).

// Copiar contenido al crear una traducción con 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' );
// Copiar título al crear una traducción con 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' );

*Šisfragments tika atrasts piezīmē, kas publicēta 2020. gada decembrī. Lai gan tas joprojām darbojas, nenāktu par ļaunu to pieskatīt, ja ar laiku un turpmākajiem Poylang atjauninājumiem tas neizdotos.

Rādīt kopējo ar Polylang tulkoto amatu skaitu katrā valodā

Šī funkcija ļauj jums pievienot īsceļu katrai valodai, kas parādīs kopējo amatu skaitu, kas publicēti valodā, kurā ir pievienoti tulkojumi, izmantojot Polylang spraudni.

Šī funkcija ir vairāk nekā pārbaudīta un darbojas pareizi manā statistikas lapā, un tā ir noderīga, lai uzturētu automātiski atjaunināto skaitītāju sarakstu.

Šī fragmenta tiek pievienota šablona functions.php:

// Función para mostrar cifra de post publicados por idioma para 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');

    // Verificar si Polylang está activo
    if (!function_exists('pll_languages_list')) {
        return 'Polylang plugin is not active.';
    }

    // Obtener el código de idioma
    $lang = $atts['lang'];
    if (empty($lang)) {
        return 'Language code is required.';
    }

    // Clave única para el transient
    $transient_key = 'post_count_by_lang_' . $lang;

    // Intentar obtener el conteo desde el caché
    $post_count = get_transient($transient_key);

    // Si no hay caché, realizar la consulta
    if (false === $post_count) {
        // Configurar la consulta para contar posts por idioma
        $args = array(
            'lang'        => $lang,
            'post_type'   => 'post', // Tipo de post (puedes cambiarlo si es necesario)
            'post_status' => 'publish', // Solo posts publicados
            'fields'      => 'ids', // Solo obtener IDs para reducir la carga
            'numberposts' => -1, // Todos los posts
        );

        // Realizar la consulta
        $query = new WP_Query($args);

        // Obtener el número total de posts
        $post_count = $query->found_posts;

        // Almacenar en caché por 12 horas (43200 segundos)
        set_transient($transient_key, $post_count, 43200);
    }

    // Devolver la cantidad de posts
    return $post_count;
}
add_shortcode('post_count_by_lang', 'polylang_post_count_by_language');

Viena no problēmām, ar ko mēs šeit saskaramies, ir tā, ka, ja jūsu vietnē ir daudz ierakstu dažādās valodās, kā tas ir šī emuāra gadījumā, datu bāzes vaicājuma ietekme var palēnināt ielādes ātrumu. Kodā tas ir ņemts vērā, un vaicājums ir optimizēts, izmantojot WP_Query ar laukiem => 'ids ', lai samazinātu atmiņas noslodzi, neuzlādējot veselus amatu objektus.

Ierakstu skaits tiek saglabāts, izmantojot set_transient, un tas ļauj izvairīties no atkārtotiem datubāzes pieprasījumiem. Šajā piemērā kešatmiņa tiek atjaunināta ik pēc 12 stundām, kas izteiktas sekundēs (šo laiku varat pielāgot atbilstoši savām vajadzībām).

Lai optimizētu vaicājumu, get_posts vietā tiek izmantots WP_Query, lai piekļūtu found_posts, kas atgriež kopējo amatu skaitu bez nepieciešamības ielādēt visus objektus.

Lauki => 'ids' parametrs samazina atmiņas slodzi, iegūstot tikai amatu ID.

Ja kādā brīdī jums ir nepieciešams manuāli izdzēst kešatmiņu (piemēram, pēc jauna amata publicēšanas), lai tajā netiktu rādīti novecojuši dati, varat izmantot:

delete_transient('post_count_by_lang_' . $lang);

Ja vēlaties automatizēt šo procesu, šāda funkcija izdzēsīs pārejošo katru reizi, kad tiek publicēts, atjaunināts vai dzēsts amats. Ja to pievienosiet sava šablona functions.php, āķis tiks aktivizēts visām šīm darbībām:

//Borrar el transient al publicar, actualizar o eliminar un post
function clear_post_count_transient($post_id) {
    // Verificar si el post es del tipo 'post' (o el tipo que estás contando)
    if (get_post_type($post_id) === 'post') {
        // Obtener el idioma del post usando Polylang
        if (function_exists('pll_get_post_language')) {
            $lang = pll_get_post_language($post_id);
            
            // Si se obtiene el idioma, borrar el transient correspondiente
            if ($lang) {
                delete_transient('post_count_by_lang_' . $lang);
            }
        }
    }
}
add_action('save_post', 'clear_post_count_transient'); // Al publicar o actualizar
add_action('delete_post', 'clear_post_count_transient'); // Al eliminar

Un šī programma automātiski iztīra kešatmiņu atbilstoši vairākiem dažādiem iespējamiem scenārijiem(tostarp iepriekš minētajam):

// Función para borrar el transient cuando sea necesario
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');

// Función para borrar el transient al cambiar el idioma de un 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);

// Función para borrar todos los transients al desinstalar o desactivar 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');

Skaitļi tiek parādīti, izmantojot īskodu katrai valodai ar atbilstošo kodu, kur vien numuru vēlaties parādīt. Tas izskatās šādi:

Para español: [post_count_by_lang lang="es"]
Para inglés: [post_count_by_lang lang="en"]
Para alemán: [post_count_by_lang lang="de"]
Para francés: [post_count_by_lang lang="fr"]
etc.
Puedes modificar el 'post_type' en el código si deseas contar otro tipo de contenido (páginas, custom post types, etc.)

Šajā URL ir redzams īsceļu darbības piemērs.

Pievienojiet dzimtās poļu valodas banerus jebkurai lapai vai ziņojumam

Tā kā Polylang ietver 249 16x11 karodziņu kolekciju .png formātā, mēs varam tos izmantot, lai dekorētu sarakstus, pievienotu tos tabulām, rindkopām utt., nerakstot HTML vai CSS.

Šī funkcija ļauj jums pievienot jebkura spraudņa attēlu, ko izmanto spraudnis, izmantojot īsu kodu.

Lai padarītu tos pieejamus, pievienojiet fragmentu jūsu bērnu tēmas functions.php, pielāgotu spraudni vai ar Code Snippet, ja to izmantojat.

function polylang_flag_shortcode($atts) {
    // Atributos del shortcode
    $atts = shortcode_atts(array(
        'code' => '', // Código de la bandera (ej: 'es', 'en', 'fr')
        'size' => '16', // Tamaño de la bandera (ancho en píxeles)
    ), $atts, 'polylang_flag');

    // Verificar si se proporcionó un código de bandera
    if (empty($atts['code'])) {
        return 'Código de bandera no proporcionado.';
    }

    // Ruta base de las banderas de Polylang
    $flag_path = plugins_url('polylang/flags/' . $atts['code'] . '.png');

    // Crear el HTML de la imagen de la bandera
    $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');

Kad esat pievienojis kodu, varat izmantot saīsnes kodu ar atbilstošo valsts kodu jebkurā WordPress lapā vai amatā, pārliecinoties, ka tas precīzi atbilst karoga failu nosaukumiem mapē /wp-content/plugins/polylang/flags/.

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

//Tamaño original
[polylang_flag code="de"]

Lai mainītu karodziņu lielumu, vienkārši mainiet lieluma atribūta vērtību īsajā kodā.

Ja vēlaties izveidot un izmantot savus karodziņus vai citu kolekciju ar atšķirīgu dizainu, jums vienkārši ir jāuzglabā jaunie karodziņi (.png formātā) jaunā mapē ar citu nosaukumu (pretējā gadījumā jūs zaudēsiet izmaiņas, kad spraudnis tiks atjaunināts) un pievienojiet kodam jauno ceļu. Piemēram:

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

SVG ikonas pievienošana blakus valodas selektoram

Šis fragments pievieno SVG ikonu ar simbolu "Tulkot" pa kreisi no Polylang dzimtās valodas atlasītāja, lai padarītu to vizuāli pievilcīgāku un piesaistītu apmeklētāja uzmanību. Šajā piemērā ikona ir tā, ko es izmantoju šajā emuārā. Jūs varat sameklēt sev tīkamāko un aizstāt to ar citu. Šeit ir dažas no tām.

function polylang_add_translate_icon($output) {
    // Icono SVG de "traducir"
    $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>';

    // Añadir el icono antes del selector
    return $translate_icon . '<span style="margin-left: 5px;">' . $output . '</span>';
}
add_filter('pll_the_languages', 'polylang_add_translate_icon');


Rādīt pielāgojamu brīdinājumu par svešvalodas versijas esamību

Šī funkcija izveido īskodu, lai parādītu brīdinājumu ar dzeltenu fonu, ko var pievienot jebkurā vietā uz amata vai lapas. Šis ziņojums brīdina, ka rakstam ir angļu valodas tulkojums ar Polylang, un sniedz saiti uz angļu valodas versiju.

Es izvēlējos šo piemēru, jo esmu to izmantojis, kad raksts jebkurā valodā saņēma lielāku datplūsmu no angliski runājošām valstīm un angļu valodas pārlūkprogrammām (kas arī negarantē, ka persona, kas to meklēja, meklēja angļu valodas versiju). Tomēr dažos gadījumos tas ir veids, kā nodrošināt apmeklētāju saglabāšanu.

Kods, ko pievienot functions.php

  // Aviso de versión en inglés
function polylang_translation_notice_shortcode() {
    // Verifica si el plugin Polylang está activo
    if (!function_exists('pll_the_languages')) {
        return '';
    }

    // Obtener el ID del post actual
    $post_id = get_the_ID();

    // Obtiene la traducción en inglés del post actual
    $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 '';
    }

    // Obtiene el enlace a la versión en inglés
    $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');

Veidlapā varat mainīt ziņojumu, teksta lielumu, teksta krāsas, fonu un saiti pēc savām vēlmēm.

Lai pievienotu ziņu, kur vien vēlaties, vienkārši izmantojiet šo saīsnes kodu:

[polylang_translation_notice]

Izmantojot šajā piemērā redzamo CSS, tas izskatās šādi.

Reklāmas izskata piemērs, 14px melns teksts uz gaiši dzeltena fona un zila saite.

Ja vēlaties pievienot paziņojumu tulkojumam citā valodā, vienkārši mainiet valodas kodu pll_get_post($post_id, 'en'); uz 'fr', 'de', 'it' utt.. Ja nepieciešams izmantot vairākus ziņojumus, varat pievienot dažādus fragmentus, pa vienam katrai valodai. Varētu tos visus pievienot vienā fragmentā, bet man vajadzēja tikai vienu.

Related articles

Este blog se aloja en LucusHost

LucusHost, el mejor hosting