Lima cuplikan berguna untuk Polylang

 

Lima cuplikan berguna untuk Polylang 0
Pengambilan gambar tanggal 5 Februari 2025

Meskipun ada beberapa pendapat yang berbeda tentang plugin mana yang terbaik untuk membuat blog multibahasa, dan semuanya telah berkembang pesat sejak versi pertamanya yang menyederhanakan dan memfasilitasi tugas, salah satu yang paling banyak digunakan adalah Polylang.

Dengan lebih dari 700.000 instalasi aktif hingga saat ini, ini tetap menjadi salah satu opsi yang paling ringan dan paling efektif.

Berikut ini adalah daftar kecil cuplikan dengan fungsi dan filter yang mungkin berguna pada suatu saat nanti. Semuanya berfungsi untuk versi gratis Polylang dan telah diuji dan/atau digunakan di sini.

Menyalin konten dari postingan asli menggunakan Polylang dalam versi gratisnya

Jika Anda menggunakan versi gratis dari plugin Polylang untuk WordPress, Anda sudah tahu bahwa halaman baru atau posting yang dihasilkannya untuk terjemahan tidak menyalin konten asli. Ini adalah salah satu fitur dari versi berbayarnya dan dalam versi gratisnya Anda harus menempelkan konten dengan tangan.

Untuk mengatasi hal ini dan mempercepat prosesnya, cukup tambahkan fungsi-fungsi ini di dalam file functions.php pada templat Anda. Sekarang, ketika Anda menambahkan terjemahan baru, terjemahan tersebut akan terbuka dengan konten asli yang disalin (judul dan konten).

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

*Cuplikan ini ditemukan dalam catatan dari Desember 2020. Meskipun masih berfungsi, tidak ada salahnya untuk tetap mengawasinya jika, seiring berjalannya waktu dan pembaruan Polylang di masa mendatang, gagal.

Tampilkan jumlah total postingan yang diterjemahkan dengan Polylang dalam setiap bahasa

Fungsi ini memungkinkan Anda untuk menambahkan kode pendek untuk setiap bahasa yang akan menunjukkan jumlah total postingan yang diterbitkan dalam bahasa yang memiliki terjemahan yang ditambahkan dengan plugin Polylang.

Fungsi ini sudah lebih dari cukup teruji dan bekerja dengan baik pada halaman statistik saya dan berguna untuk memelihara daftar penghitung yang diperbarui secara otomatis.

Cuplikan tersebut ditambahkan ke functions.php template:

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

Salah satu masalah yang kita hadapi di sini adalah jika Anda memiliki banyak postingan dalam berbagai bahasa di situs Anda, seperti halnya blog ini, dampak dari query database dapat memperlambat kecepatan pemuatan. Kode ini mempertimbangkan hal ini dan kueri dioptimalkan menggunakan WP_Query dengan fields => 'ids' untuk mengurangi overhead memori dengan tidak memuat seluruh objek posting.

Jumlah postingan disimpan menggunakan set_transient dan menghindari kueri basis data yang berulang-ulang. Dalam contoh, cache diperbarui setiap 12 jam, dinyatakan dalam hitungan detik (Anda dapat menyesuaikan waktu ini sesuai dengan kebutuhan Anda).

Untuk mengoptimalkan kueri, WP_Query digunakan sebagai pengganti get_posts untuk mengakses found_posts, yang mengembalikan jumlah total postingan tanpa perlu memuat semua objek.

Parameter fields => 'ids' mengurangi beban memori dengan hanya mengambil ID postingan.

Jika suatu saat Anda perlu menghapus cache secara manual (misalnya setelah menerbitkan postingan baru) agar tidak menampilkan data yang sudah basi, Anda dapat menggunakannya:

delete_transient('post_count_by_lang_' . $lang);

Jika Anda lebih suka mengotomatiskan proses ini, fungsi berikut ini akan menghapus transien setiap kali postingan diterbitkan, diperbarui, atau dihapus. Jika Anda menambahkannya di functions.php templat Anda, pengait akan diaktifkan untuk semua tindakan ini:

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

Dan yang satu ini membersihkan cache secara otomatis sesuai dengan sejumlah skenario yang mungkin terjadi(termasuk yang di atas):

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

Angka-angka ditampilkan menggunakan kode pendek untuk setiap bahasa dengan kode yang sesuai di mana pun Anda ingin menampilkan angka tersebut. Tampilannya seperti ini:

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.

Anda dapat memodifikasi'post_type' di dalam kode jika Anda ingin menghitung jenis konten lainnya (halaman, jenis postingan khusus, dll.).

Di URL ini Anda memiliki contoh cara kerja kode pendek.

Tambahkan banner Polylang asli ke halaman atau postingan mana pun

Karena Polylang menyertakan koleksi 249 bendera 16x11 dalam format .png, kita dapat menggunakannya untuk menghias daftar, menambahkannya ke tabel, paragraf, dll. tanpa harus menulis HTML atau CSS.

Fungsi ini memungkinkan Anda untuk menambahkan gambar banner asli yang digunakan oleh plugin melalui shortcode.

Untuk membuatnya tersedia, Anda dapat menambahkan snippet di functions.php tema anak Anda, di plugin kustom atau dengan Code Snippet, jika Anda menggunakannya.

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

Setelah Anda menambahkan kode, Anda dapat menggunakan kode pendek dengan kode negara yang sesuai pada halaman atau postingan WordPress mana pun dengan memastikan bahwa kode tersebut sama persis dengan nama-nama file bendera di folder /wp-content/plugins/polylang/flags/.

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

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

Untuk bermain dengan ukuran bendera, cukup ubah nilai atribut ukuran di dalam shortcode.

Jika Anda ingin membuat dan menggunakan banner Anda sendiri atau memiliki koleksi lain dengan desain yang berbeda, cukup host yang baru (dalam format .png) di folder baru dengan nama yang berbeda (jika tidak, Anda akan kehilangan perubahan saat plugin diperbarui) dan tambahkan jalur baru ke kode. Sebagai contoh:

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

Menambahkan ikon SVG di samping pemilih bahasa

Cuplikan ini menambahkan ikon SVG dengan simbol "Terjemahkan" di sebelah kiri pemilih bahasa asli Polylang untuk membuatnya lebih menarik secara visual dan menarik perhatian pengunjung. Dalam contoh, ikon tersebut adalah ikon yang saya gunakan di blog ini. Anda bisa mencari ikon yang paling Anda sukai dan menggantinya. Berikut ini beberapa di antaranya.

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


Menampilkan peringatan yang dapat disesuaikan tentang keberadaan versi bahasa asing

Fungsi ini membuat kode pendek untuk menampilkan peringatan dengan latar belakang kuning yang dapat ditambahkan di mana saja pada postingan atau halaman. Pesan ini memperingatkan bahwa artikel tersebut memiliki terjemahan bahasa Inggris dengan Polylang dan menyediakan tautan ke versi bahasa Inggris.

Saya memilih contoh ini karena saya telah menggunakannya ketika sebuah artikel, dalam bahasa apa pun, menerima lebih banyak lalu lintas dari negara-negara berbahasa Inggris dan dari peramban berbahasa Inggris (yang juga tidak menjamin bahwa orang di belakangnya mencari versi bahasa Inggris). Namun, ini adalah cara untuk memastikan retensi pengunjung dalam beberapa kasus.

Kode untuk ditambahkan ke 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');

Dalam gaya, Anda dapat memodifikasi pesan, ukuran teks, warna teks, latar belakang, dan tautan sesuai keinginan Anda.

Untuk menambahkan pesan di mana pun Anda inginkan, cukup gunakan kode pendek ini:

[polylang_translation_notice]

Dengan CSS pada contoh, terlihat seperti ini.

Contoh tampilan iklan, teks hitam 14px dengan latar belakang kuning muda dan tautan biru.

Jika Anda ingin menambahkan pemberitahuan pada terjemahan dalam bahasa lain, cukup ubah kode bahasa di pll_get_post($post_id, 'en'); menjadi 'fr', 'de', 'it', dsb. Jika Anda perlu menggunakan beberapa postingan, Anda dapat menambahkan potongan yang berbeda, satu untuk setiap bahasa. Anda dapat menambahkan semuanya dalam satu cuplikan, tetapi saya hanya membutuhkan satu.

Suscripción por email

Artikel terkait

Este blog se aloja en LucusHost

LucusHost, el mejor hosting