
Nors yra įvairių nuomonių apie tai, kuris yra geriausias įskiepis daugiakalbiam tinklaraščiui sukurti, ir visi jie nuo pirmųjų versijų, supaprastinančių ir palengvinančių užduotį, labai patobulėjo, vienas iš labiausiai naudojamų yra " Polylang".
Iki šiol įrengta daugiau kaip 700 000 aktyvių įrenginių, todėl tai išlieka vienas lengviausių ir veiksmingiausių variantų.
Čia pateikiamas nedidelis sąrašas fragmentų su funkcijomis ir filtrais, kurie kada nors gali būti naudingi. Visos jos veikia nemokamoje "Polylang" versijoje ir buvo išbandytos ir (arba) naudojamos čia.
Nukopijuokite turinį iš originalaus pranešimo naudodami "Polylang" nemokamą versiją
Jei naudojate nemokamą "WordPress" įskiepio " Polylang" versiją, jau žinote, kad vertimui sukurtas naujas puslapis ar pranešimas nekopijuoja originalaus turinio. Tai viena iš mokamos versijos funkcijų, o nemokamoje versijoje turinį turite įklijuoti ranka.
Norėdami išspręsti šią problemą ir pagreitinti procesą, tiesiog pridėkite šias funkcijas į savo šablono functions.php failą. Dabar, kai pridėsite naują vertimą, jis atsidarys su originaliu nukopijuotu turiniu (pavadinimu ir turiniu).
// 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' );
*Taškasbuvo rastas 2020 m. gruodžio mėn. pastaboje. Nors jis vis dar veikia, nepakenktų jį stebėti, jei laikui bėgant ir ateityje atnaujinus "Polylang" jis nepavyktų.
Parodykite bendrą pranešimų, išverstų naudojant "Polylang", skaičių kiekvienoje kalboje
Ši funkcija leidžia pridėti kiekvienos kalbos trumpąjį kodą, kuris parodys bendrą pranešimų, paskelbtų ta kalba, į kurią yra vertimų, pridėtų naudojant "Polylang" įskiepį, skaičių.
Ši funkcija yra daugiau nei išbandyta ir tinkamai veikia mano statistikos puslapyje ir yra naudinga automatiškai atnaujinamų skaitiklių sąrašui tvarkyti.
Fragmentas įtraukiamas į šablono 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');
Viena iš problemų, su kuriomis susiduriame, yra ta, kad jei svetainėje yra daug įrašų įvairiomis kalbomis, kaip yra šio tinklaraščio atveju, duomenų bazės užklausos poveikis gali sulėtinti krovimo greitį. Kodas į tai atsižvelgia ir užklausa optimizuojama naudojant WP_Query su laukais => "ids ", kad būtų sumažinta atminties apkrova, nes neužkraunami ištisi įrašų objektai.
Pranešimų skaičius saugomas naudojant set_transient, todėl išvengiama pasikartojančių užklausų duomenų bazei. Šiame pavyzdyje talpykla atnaujinama kas 12 valandų, išreiškiama sekundėmis (šį laiką galite koreguoti pagal savo poreikius).
Siekiant optimizuoti užklausą, vietoj get_posts naudojama WP_Query, kad būtų galima pasiekti found_posts, kuri grąžina bendrą įrašų skaičių, neįkeliant visų objektų.
Parametras fields => 'ids ' sumažina atminties apkrovą, nes paimami tik postų ID.
Jei tam tikru metu reikia rankiniu būdu išvalyti talpyklą (pvz., paskelbus naują pranešimą), kad nebūtų rodomi pasenę duomenys, galite naudoti:
delete_transient('post_count_by_lang_' . $lang);
Jei norite automatizuoti šį procesą, toliau nurodyta funkcija ištrins pereinamąjį laikotarpį kiekvieną kartą, kai pranešimas bus paskelbtas, atnaujintas arba ištrintas. Jei pridėsite ją į savo šablono functions.php, kabliukas bus aktyvuotas visiems šiems veiksmams:
//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
Ši programa automatiškai išvalo talpyklą pagal kelis skirtingus galimus scenarijus(įskaitant pirmiau pateiktą):
// 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');
Skaičiai rodomi naudojant kiekvienos kalbos trumpąjį kodą su atitinkamu kodu ten, kur norite rodyti skaičių. Jis atrodo taip:
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.
Jei norite skaičiuoti kitų tipų turinį (puslapius, pasirinktinius postų tipus ir kt.), galite pakeisti kodo parametrą"post_type".
Šiame URL rasite trumpųjų kodų veikimo pavyzdį.
Pridėti gimtąsias "Polylang" reklamines juostas į bet kurį puslapį ar pranešimą
Kadangi į "Polylang" yra 249 16x11 vėliavėlių rinkinys .png formatu, galime jomis papuošti sąrašus, pridėti jas prie lentelių, pastraipų ir t. t. nerašydami HTML ar CSS.
Ši funkcija leidžia pridėti bet kurio įskiepio naudojamo gimtojo banerio vaizdą per trumpąjį kodą.
Norėdami, kad jie būtų prieinami, pridėkite fragmentą į savo vaikiškos temos functions.php, į pasirinktinį įskiepį arba naudodami "Code Snippet", jei jį naudojate.
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');
Pridėję kodą galite naudoti trumpąjį kodą su atitinkamu šalies kodu bet kuriame "WordPress" puslapyje ar pranešime, įsitikinę, kad jis tiksliai atitinka vėliavų failų, esančių aplanke /wp-content/plugins/polylang/flags/ , pavadinimus.
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Original size
[polylang_flag code="de"]
Jei norite keisti vėliavėlių dydį, tiesiog pakeiskite trumpojo kodo atributo size reikšmę.
Jei norite sukurti ir naudoti savo reklaminius skydelius arba turėti kitą kolekciją su kitokiu dizainu, tiesiog patalpinkite naujus reklaminius skydelius (.png formatu) naujame aplanke su kitu pavadinimu (priešingu atveju, atnaujinus įskiepį, pakeitimai bus prarasti) ir į kodą įrašykite naują kelią. Pavyzdžiui:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');
SVG piktogramos pridėjimas šalia kalbos pasirinkimo žymeklio
Ši fragmentas prideda SVG piktogramą su simboliu "Versti" į kairę nuo "Polylang" gimtosios kalbos parinkiklio, kad jis būtų vizualiai patrauklesnis ir atkreiptų lankytojo dėmesį. Pavyzdyje pateikta piktograma yra ta, kurią naudoju šiame tinklaraštyje. Galite ieškoti jums labiausiai patinkančios ir ją pakeisti. Štai kelios iš jų.
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');
Rodyti pritaikomą įspėjimą apie užsienio kalbos versijos buvimą
Ši funkcija sukuria trumpąjį kodą, kad būtų rodomas įspėjimas geltoname fone, kurį galima pridėti bet kurioje įrašo ar puslapio vietoje. Šiame pranešime įspėjama, kad straipsnis yra išverstas į anglų kalbą su Polylang, ir pateikiama nuoroda į anglišką versiją.
Pasirinkau šį pavyzdį, nes jį naudojau, kai straipsnis bet kuria kalba sulaukdavo daugiau lankytojų srauto iš anglakalbių šalių ir anglakalbių naršyklių (tai taip pat negarantuoja, kad už jo esantis asmuo ieškojo angliškos versijos). Vis dėlto kai kuriais atvejais tai būdas užtikrinti lankytojų išlaikymą.
Kodas, kurį reikia įtraukti į 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');
Naudodami stilių galite keisti pranešimą, teksto dydį, teksto spalvas, foną ir nuorodą pagal savo pageidavimus.
Norėdami pridėti pranešimą, kur tik norite, naudokite šį trumpąjį kodą:
[polylang_translation_notice]
Naudojant pavyzdyje pateiktą CSS ji atrodo taip.

Jei norite pridėti pranešimą prie vertimo į kitą kalbą, tiesiog pakeiskite kalbos kodą pll_get_post($post_id, 'en'); į 'fr', 'de', 'it' ir t. t. Jei reikia naudoti kelis įrašus, galite pridėti skirtingus fragmentus, po vieną kiekvienai kalbai. Jas visas galėtumėte pridėti į vieną fragmentą, bet man reikėjo tik vieno.