خمسة مقتطفات مفيدة لبوليلانج

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

No comments

 

خمسة مقتطفات مفيدة لبوليلانج 0
الاستيلاء على 5 فبراير 2025

على الرغم من وجود آراء مختلفة حول أفضل إضافة لإنشاء مدونة متعددة اللغات، وجميعها تطورت كثيرًا منذ إصداراتها الأولى التي تبسط وتسهل المهمة، إلا أن Polylang هي واحدة من أكثرها استخدامًا.

مع وجود أكثر من 700,000 عملية تركيب نشطة حتى الآن، لا يزال هذا الجهاز أحد أخف الخيارات وأكثرها فعالية.

فيما يلي قائمة صغيرة من المقتطفات التي تحتوي على وظائف وفلاتر قد تكون مفيدة في مرحلة ما. تعمل جميعها مع النسخة المجانية من Polylang وقد تم اختبارها و/أو استخدامها هنا.

نسخ المحتوى من المنشور الأصلي باستخدام Polylang في نسخته المجانية

إذا كنت تستخدم الإصدار المجاني من المكون الإضافي Polylang لـ WordPress، فأنت تعلم بالفعل أن الصفحة أو المنشور الجديد الذي ينشئه للترجمة لا ينسخ المحتوى الأصلي. هذه إحدى ميزات نسخته المدفوعة وفي النسخة المجانية عليك لصق المحتوى يدويًا.

لحل هذه المشكلة وتسريع العملية، ما عليك سوى إضافة هذه الدوال في ملف function.php الخاص بقالبك. الآن، عندما تضيف ترجمة جديدة سيتم فتحها بالمحتوى الأصلي المنسوخ (العنوان والمحتوى).

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

* تم العثور على ثيسنيبتفي ملاحظة من ديسمبر 2020. على الرغم من أنها لا تزال تعمل، إلا أنه لن يضر أن تراقبها في حالة فشلها مع مرور الوقت وتحديثات Polylang المستقبلية.

عرض إجمالي عدد المنشورات المترجمة باستخدام Polylang في كل لغة

تسمح لك هذه الوظيفة بإضافة كود قصير لكل لغة يعرض العدد الإجمالي للمقالات المنشورة بلغة ما والتي توجد بها ترجمات مضافة مع إضافة Polylang.

تم اختبار هذه الوظيفة أكثر من مرة وتعمل بشكل صحيح على صفحة الإحصائيات الخاصة بي وهي مفيدة للاحتفاظ بقائمة العدادات التي يتم تحديثها تلقائيًا.

يُضاف المقتطف إلى وظائف القالب function.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');

تتمثل إحدى المشاكل التي نواجهها هنا في أنه إذا كان لديك الكثير من المنشورات بالعديد من اللغات المختلفة على موقعك، كما هو الحال مع هذه المدونة، فإن تأثير استعلام قاعدة البيانات قد يبطئ من سرعة التحميل. يأخذ الكود هذا الأمر في الحسبان ويتم تحسين الاستعلام باستخدام WP_Query مع الحقول => "المعرّفات" لتقليل الحمل الزائد على الذاكرة من خلال عدم تحميل كائنات المقالة بأكملها.

يتم تخزين عدد المنشورات باستخدام set_transient وتجنب استعلامات قاعدة البيانات المتكررة. في المثال، يتم تحديث ذاكرة التخزين المؤقت كل 12 ساعة، معبراً عنها بالثواني (يمكنك تعديل هذا الوقت وفقاً لاحتياجاتك).

ولتحسين الاستعلام، يتم استخدام WP_Query بدلاً من get_posts للوصول إلى المنشورات التي تم العثور عليها، والتي تُرجع العدد الإجمالي للمنشورات دون الحاجة إلى تحميل جميع الكائنات.

تعمل المعلمة الحقول => 'ids' على تقليل حمل الذاكرة عن طريق استرداد معرّفات المنشورات فقط.

إذا احتجتَ في مرحلة ما إلى مسح ذاكرة التخزين المؤقت يدويًا (على سبيل المثال بعد نشر منشور جديد) حتى لا تظهر بيانات قديمة يمكنك استخدامها:

delete_transient('post_count_by_lang_' . $lang);

إذا كنتَ تفضِّل أتمتة هذه العملية، فإن الدالة التالية ستحذف العابر في كل مرة يتم فيها نشر مقالة أو تحديثها أو حذفها. إذا قمت بإضافتها في functions.php في القالب الخاص بك، فسيتم تنشيط الخطاف لجميع هذه الإجراءات:

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

وهذا يقوم بمسح ذاكرة التخزين المؤقت تلقائيًا وفقًا لعدد من السيناريوهات المحتملة المختلفة(بما في ذلك السيناريو أعلاه):

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

يتم عرض الأرقام باستخدام الرمز القصير لكل لغة مع الرمز المقابل لها أينما تريد عرض الرقم. يبدو هكذا

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.

يمكنك تعديل"نوع_المقالة" في الكود إذا كنت تريد حساب أنواع أخرى من المحتوى (الصفحات، وأنواع المقالات المخصصة، وما إلى ذلك).

في عنوان URL هذا لديك مثال على عمل الرموز القصيرة.

إضافة لافتات Polylang الأصلية إلى أي صفحة أو منشور

نظرًا لأن Polylang يتضمن مجموعة من 249 علامة 16 × 11 في .png، يمكننا استخدامها لتزيين القوائم وإضافتها إلى الجداول والفقرات وما إلى ذلك دون الحاجة إلى كتابة HTML أو CSS.

تتيح لك هذه الوظيفة إضافة صورة أي لافتة أصلية تستخدمها الإضافة عبر رمز قصير.

لجعلها متاحة، يمكنك إضافة المقتطف في function.php في قالبك الفرعي، أو في إضافة مخصصة أو باستخدام Code Snippet، إذا كنت تستخدمه.

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

بمجرد إضافة الرمز يمكنك استخدام الرمز القصير مع رمز البلد المطابق في أي صفحة أو منشور في ووردبريس مع التأكد من تطابقه تمامًا مع أسماء ملفات الأعلام في مجلد /wp-content/plugins/polylang/flags/.

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

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

للتلاعب بحجم الأعلام، ما عليك سوى تغيير قيمة سمة الحجم في الرمز القصير.

إذا كنت ترغب في إنشاء واستخدام لافتاتك الخاصة أو الحصول على مجموعة أخرى بتصميم مختلف، ما عليك سوى استضافة اللافتات الجديدة (بصيغة .png) في مجلد جديد باسم مختلف (وإلا ستفقد التغييرات عند تحديث الإضافة) وإضافة المسار الجديد إلى الكود. على سبيل المثال:

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

إضافة أيقونة SVG بجوار محدد اللغة

يضيف هذا المقتطف أيقونة SVG مع رمز "ترجمة" إلى يسار محدد اللغة الأصلية لـ Polylang لجعلها أكثر جاذبية بصريًا وجذب انتباه الزائر. في المثال، الأيقونة هي الأيقونة التي أستخدمها في هذه المدونة. يمكنك البحث عن الرمز الذي يعجبك أكثر واستبداله. إليك بعض منها.

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


إظهار تحذير قابل للتخصيص بوجود إصدار بلغة أجنبية

تنشئ هذه الدالة رمزًا قصيرًا لعرض تحذير بخلفية صفراء يمكن إضافته في أي مكان على مقالة أو صفحة. تحذر هذه الرسالة من أن المقال يحتوي على ترجمة باللغة الإنجليزية مع Polylang وتوفر رابطًا للنسخة الإنجليزية.

لقد اخترت هذا المثال لأنني استخدمته عندما تلقى مقال، بأي لغة، عددًا أكبر من الزيارات من البلدان الناطقة باللغة الإنجليزية ومن المتصفحات باللغة الإنجليزية (وهذا لا يضمن أيضًا أن الشخص الذي يقف وراءه كان يبحث عن النسخة الإنجليزية). ومع ذلك، فهي طريقة لضمان الاحتفاظ بالزوار في بعض الحالات.

رمز لإضافته إلى function.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');

في النمط يمكنك تعديل الرسالة وحجم النص وألوان النص والخلفية والرابط حسب رغبتك.

لإضافة الرسالة أينما تريد، ما عليك سوى استخدام هذا الرمز القصير:

[polylang_translation_notice]

باستخدام CSS في المثال يبدو الأمر هكذا.

مثال على شكل الإعلان، نص أسود 14 بكسل على خلفية صفراء فاتحة ورابط أزرق.

إذا كنت تريد إضافة إشعار للترجمة بلغة أخرى، ما عليك سوى تغيير رمز اللغة في pll_get_post($post_post_id, 'en')؛ إلى 'fr' أو 'de' أو 'it'، إلخ. إذا كنت بحاجة إلى استخدام عدة منشورات، يمكنك إضافة مقتطفات مختلفة، واحدة لكل لغة. يمكنك إضافتها جميعًا في مقتطف واحد، ولكنني أحتاج إلى مقتطف واحد فقط.


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

مقالات ذات صلة

أضف تعليق