Öt hasznos snippet a Polylang számára

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

No comments

 

Öt hasznos snippet a Polylang számára 0
2025. február 5-i felvétel

Bár különböző vélemények vannak arról, hogy melyik a legjobb plugin egy többnyelvű blog létrehozásához, és mindegyik sokat fejlődött az első verzió óta, egyszerűsítve és megkönnyítve a feladatot, az egyik leggyakrabban használt a Polylang.

Több mint 700 000 aktív telepítéssel a mai napig az egyik legkönnyebb és leghatékonyabb megoldás.

Íme egy kis lista a funkciókat és szűrőket tartalmazó szippantásokról , amelyek hasznosak lehetnek valamikor. Ezek mindegyike működik a Polylang ingyenes verziójában, és itt már teszteltük és/vagy használtuk őket.

Tartalom másolása az eredeti bejegyzésből a Polylang ingyenes verziójának használatával

Ha a WordPress Polylang plugin ingyenes verzióját használja, már tudja, hogy a fordításhoz létrehozott új oldal vagy bejegyzés nem másolja az eredeti tartalmat. Ez a fizetős változatának egyik funkciója, az ingyenes változatban pedig kézzel kell beillesztened a tartalmat.

Ennek megoldásához és a folyamat felgyorsításához csak adja hozzá ezeket a funkciókat a sablon functions.php fájljához. Most, amikor új fordítást adsz hozzá, az eredeti, másolt tartalommal (cím és tartalom) fog megnyílni.

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

*Ezegy 2020. decemberi jegyzetben található. Bár még mindig működik, nem árt szemmel tartani, hátha idővel és a jövőbeli Polylang-frissítésekkel meghibásodik.

A Polylanggal lefordított hozzászólások teljes száma minden nyelven

Ez a funkció lehetővé teszi, hogy minden nyelvhez hozzáadjon egy rövidkódot, amely megmutatja az adott nyelven közzétett bejegyzések teljes számát, amelyekhez a Polylang plugin segítségével hozzáadott fordítások vannak.

Ez a funkció több mint tesztelt és megfelelően működik a statisztikáim oldalán, és hasznos az automatikusan frissülő számlálók listájának fenntartásához.

A snippet a sablon functions.php fájljába kerül :

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

Az egyik probléma, amivel itt szembesülünk, hogy ha sok különböző nyelvű bejegyzés van a webhelyen, mint például ebben a blogban, az adatbázis-lekérdezés hatása lelassíthatja a betöltési sebességet. A kód ezt figyelembe veszi, és a lekérdezés optimalizálva van a WP_Query használatával, mezőkkel => 'ids', hogy csökkentse a memória terhelést azáltal, hogy nem egész poszt objektumokat tölt be.

A posztok számát a set_transient használatával tároljuk, és elkerüljük az ismétlődő adatbázis-lekérdezéseket. A példában a gyorsítótár 12 óránként frissül, másodpercekben kifejezve (ezt az időt az Ön igényei szerint módosíthatja).

A lekérdezés optimalizálása érdekében a get_posts helyett a WP_Query-t használjuk a found_posts eléréséhez, amely az összes objektum betöltése nélkül adja vissza a bejegyzések teljes számát.

A fields => 'ids ' paraméter csökkenti a memóriaterhelést azáltal, hogy csak a post ID-ket kéri le.

Ha egy bizonyos ponton manuálisan kell törölni a gyorsítótárat (pl. egy új bejegyzés közzététele után), hogy ne jelenítsen meg elavult adatokat, akkor használhatja:

delete_transient('post_count_by_lang_' . $lang);

Ha inkább automatizálni szeretné ezt a folyamatot, a következő funkció minden alkalommal törli a tranzienseket, amikor egy posztot közzétesz, frissít vagy töröl. Ha a sablon functions.php fájljába beilleszted, a kampó minden ilyen műveletnél aktiválódik:

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

Ez pedig automatikusan törli a gyorsítótárat számos különböző lehetséges forgatókönyv szerint(beleértve a fent említettet is):

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

A számok az egyes nyelvekhez tartozó rövidkódok segítségével jelennek meg a megfelelő kóddal, bárhol is szeretné megjeleníteni a számot. Ez így néz ki:

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.

Módosíthatja a kódban a'post_type' értéket, ha más típusú tartalmakat (oldalakat, egyéni poszttípusokat stb.) szeretne számolni.

Ebben az URL-ben van egy példa a rövidkódok működésére.

Natív Polylang bannerek hozzáadása bármely oldalhoz vagy poszthoz

Mivel a Polylang 249 darab 16x11-es zászlót tartalmaz .png formátumban, használhatjuk őket listák díszítésére, táblázatokhoz, bekezdésekhez, stb. való hozzáadásra anélkül, hogy HTML-t vagy CSS-t kellene írnunk.

Ez a funkció lehetővé teszi, hogy a plugin által használt bármely natív banner képét egy rövidkódon keresztül hozzáadja.

Ahhoz, hogy elérhetővé tegye őket, hozzáadja a snippet a functions.php a gyermek téma, egy egyéni plugin vagy a Code Snippet, ha használja.

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

Miután hozzáadtad a kódot, használhatod a rövidkódot a megfelelő országkóddal bármelyik WordPress oldalon vagy bejegyzésben , ügyelve arra, hogy pontosan megegyezzen a /wp-content/plugins/polylang/flags/ mappában található zászlófájlok nevével.

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

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

A zászlók méretével való játékhoz egyszerűen változtassa meg a rövidkódban a size attribútum értékét.

Ha saját bannereket szeretne létrehozni és használni, vagy egy másik gyűjteményt szeretne más dizájnnal, akkor az újakat (.png formátumban) csak egy új mappában, más néven kell elhelyezni (különben a plugin frissítésekor elveszíti a változtatásokat), és az új elérési utat hozzá kell adni a kódhoz. Például:

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

SVG ikon hozzáadása a nyelvválasztó mellé

Ez a snippet egy SVG ikont ad a "Fordítás" szimbólummal a Polylang anyanyelvi választójának bal oldalán, hogy vizuálisan vonzóbbá tegye és felkeltse a látogató figyelmét. A példában az ikon az az ikon, amelyet ebben a blogban használok. Megkeresheti azt, amelyik a legjobban tetszik, és kicserélheti. Itt van néhány közülük.

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


Testreszabható figyelmeztetés megjelenítése az idegen nyelvű verzió létezéséről

Ez a funkció egy rövidkódot hoz létre egy sárga hátterű figyelmeztetés megjelenítéséhez, amely bárhová hozzáadható egy poszthoz vagy oldalhoz. Ez az üzenet figyelmeztet arra, hogy a cikknek van angol fordítása Polylanggal, és linket ad az angol verzióhoz.

Azért választottam ezt a példát, mert használtam már, amikor egy cikk, bármilyen nyelven, több látogatót kapott az angol nyelvű országokból és az angol nyelvű böngészőkből (ami szintén nem garantálja, hogy a mögötte álló személy az angol nyelvű változatot kereste). Mégis, ez egy módja annak, hogy bizonyos esetekben biztosítsuk a látogatók megtartását.

A functions.php fájlhoz hozzáadandó kód

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

A stílusban tetszés szerint módosíthatja az üzenetet, a szöveg méretét, a szöveg színeit, a hátteret és a linket.

Az üzenet hozzáadásához, ahol csak akarod, csak használd ezt a rövidkódot:

[polylang_translation_notice]

A példában szereplő CSS-szel ez így néz ki.

Példa a hirdetés kinézetére, 14px-es fekete szöveg világossárga háttéren és kék link.

Ha egy másik nyelven szeretne értesítést hozzáadni a fordításhoz, csak módosítsa a pll_get_post($post_id, 'en'); nyelvi kódját 'fr', 'de', 'it', stb. nyelvre. Ha több posztot kell használnia, akkor különböző snippeteket adhat hozzá, egyet-egyet minden nyelvhez. Az összeset hozzáadhatod egy snippetben is, de nekem csak egy kellett.


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

Kapcsolódó cikkek

Szólj hozzá!