
למרות שיש דעות שונות לגבי התוסף הטוב ביותר ליצירת בלוג רב-לשוני, וכולם התפתחו מאוד מאז הגרסאות הראשונות שלהם, מה שהפך את המשימה לפשוטה וקלה יותר, אחד התוספים הנפוצים ביותר הוא Polylang.
עם יותר מ-700,000 התקנות פעילות נכון להיום, היא עדיין אחת האפשרויות הקלות והיעילות ביותר.
להלן רשימה קצרה של קטעי קוד עם פונקציות ומסננים שיכולים להיות שימושיים מתישהו. כולם פועלים בגרסה החינמית של Polylang ונבדקו ו/או שימשו כאן.
העתקת תוכן מהפוסט המקורי באמצעות Polylang בגרסתו החינמית
אם אתה משתמש בגרסה החינמית של התוסף Polylang ל-WordPress, אתה כבר יודע שהדף או הפוסט החדש שנוצר לצורך תרגום אינו מעתיק את התוכן המקורי. זוהי אחת התכונות של הגרסה בתשלום, ובגרסה החינמית יש להדביק את התוכן ידנית.
כדי לפתור זאת ולהאיץ את התהליך, די להוסיף פונקציות אלה לקובץ functions.php של התבנית שלך. כעת, כאשר תוסיף תרגום חדש, הוא ייפתח עם התוכן המקורי שהועתק (כותרת ותוכן).
// 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' );*מצאתי את הקטע הזה בהערה מדצמבר 2020. למרות שהוא עדיין עובד, כדאי להיות ערניים למקרה שהוא יפסיק לעבוד עם הזמן ועם עדכונים עתידיים של Polylang.
הצג את המספר הכולל של פוסטים שתורגמו באמצעות Polylang בכל שפה
פונקציה זו מאפשרת לך להוסיף קיצור לכל שפה, שיציג את המספר הכולל של הפוסטים שפורסמו בשפה שבה קיימות תרגומים שנוספו באמצעות התוסף Polylang.
פונקציה זו נבדקה היטב ופועלת כראוי בדף הסטטיסטיקה שלי, והיא שימושית לשמירת רשימה עם מונים המתעדכנים אוטומטית.
הקטע מתווסף לקובץ 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');אחת הבעיות שאנו מתמודדים איתן כאן היא שאם בדף שלך יש פוסטים רבים בשפות שונות, כמו במקרה של בלוג זה, ההשפעה של השאילתה למסד הנתונים עלולה להאט את מהירות הטעינה. הקוד לוקח זאת בחשבון והשאילתה מותאמת באמצעות WP_Query עם fields => 'ids' כדי להפחית את העומס על הזיכרון על ידי אי טעינת אובייקטים מלאים של פוסטים.
ספירת הפוסטים מאוחסנת באמצעות set_transient וכך נמנעות שאילתות חוזרות ונשנות למסד הנתונים. בדוגמה, המטמון מתעדכן כל 12 שעות, המוצגות בשניות (ניתן להתאים זמן זה לפי הצורך).
כדי לייעל את השאילתה, משתמשים ב-WP_Query במקום ב-get_posts כדי לגשת ל-found_posts, מה שמחזיר את המספר הכולל של הפוסטים ללא צורך לטעון את כל האובייקטים.
הפרמטר fields => 'ids' מפחית את עומס הזיכרון על ידי אחזור רק מזהי הפוסטים.
אם בשלב כלשהו תצטרך למחוק את המטמון באופן ידני (למשל, לאחר פרסום פוסט חדש) כדי שלא יציג נתונים מיושנים, תוכל להשתמש ב:
delete_transient('post_count_by_lang_' . $lang);אם אתה מעדיף להפוך את התהליך לאוטומטי, הפונקציה הבאה תמחק את ה-transient בכל פעם שפורסם, עודכן או נמחק פוסט. אם תוסיף אותה לקובץ functions.php של התבנית שלך, ה-hook יופעל בכל הפעולות הבאות:
//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ובאמצעות זו האחרת, המטמון נמחק אוטומטית בהתאם למספר תרחישים אפשריים שונים (כולל התרחיש הקודם):
// 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');המספרים מוצגים באמצעות קיצור קוד לכל שפה עם הקוד המתאים שלה בכל מקום שבו ברצונך להציג את המספר. כך:
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.)בכתובת URL זו תמצא דוגמה לשימוש בקודים קצרים.
הוספת דגלים מקוריים של Polylang לכל דף או פוסט
מכיוון ש-Polylang כולל אוסף של 249 דגלים בגודל 16x11 בפורמט .png, אנו יכולים להשתמש בהם כדי לקשט רשימות, להוסיף אותם לטבלאות, פסקאות וכו' ללא צורך לכתוב HTML או CSS.
פונקציה זו מאפשרת להוסיף תמונה של כל דגל מקומי שמשתמש בתוסף באמצעות קיצור קוד.
כדי להשתמש בהן, הוסף את הקטע לקובץ functions.php של ערכת העיצוב המשנה שלך, בתוסף מותאם אישית או באמצעות Code Snippet, אם אתה משתמש בו.
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');לאחר הוספת הקוד, תוכל להשתמש בקוד הקצר עם קוד המדינה המתאים בכל דף או פוסט ב-WordPress, תוך הקפדה על התאמה מדויקת לשמות הקבצים של הדגלים הנמצאים בתיקייה /wp-content/plugins/polylang/flags/
[polylang_flag code="en" size="32"]
[polylang_flag code="fr" size="24"]
//Tamaño original
[polylang_flag code="de"]
כדי לשחק עם גודל הדגלים, פשוט שנה את הערך של התכונה size בקוד הקצר.
אם ברצונך ליצור ולהשתמש בדגלים משלך או להחזיק באוסף אחר עם עיצוב שונה, כל שעליך לעשות הוא לאחסן את הדגלים החדשים (בפורמט .png) בתיקיה חדשה עם שם שונה (אחרת השינויים יאבדו עם עדכון התוסף) ולהוסיף את הנתיב החדש לקוד. לדוגמה:
$flag_path = plugins_url('polylang/nuevas_banderas/' . $atts['code'] . '.png');הוספת סמל SVG ליד בורר השפות
קטע קוד זה מוסיף סמל SVG עם הסימן "תרגם" משמאל לבורר השפות המקורי של Polylang כדי להפוך אותו לאטרקטיבי יותר מבחינה ויזואלית ולמשוך יותר את תשומת לב המבקר. בדוגמה, הסמל הוא זה שאני משתמש בו בבלוג זה. אתה יכול לחפש את הסמל שאתה הכי אוהב ולהחליף אותו. הנה כמה דוגמאות.
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');
הצגת הודעה הניתנת להתאמה אישית על קיומה של גרסה בשפה אחרת
פונקציה זו יוצרת קיצור קוד להצגת הודעה על רקע צהוב שניתן להוסיף בכל מקום בפוסט או בדף. הודעה זו מודיעה כי למאמר יש תרגום לאנגלית באמצעות Polylang ומספקת קישור לגרסה האנגלית.
בחרתי בדוגמה זו כי השתמשתי בה כאשר מאמר, בכל שפה שהיא, קיבל יותר תנועה ממדינות דוברות אנגלית ומדפדפנים בשפה האנגלית (מה שלא מבטיח שהאדם שמאחורי הדפדפן הגיע כדי לחפש את הגרסה האנגלית). עם זאת, זו דרך להבטיח את שימור הביקור במקרים מסוימים.
קוד להוספה לקובץ 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');בסגנון תוכל לשנות לפי טעמך את ההודעה, גודל הטקסט, צבעי הטקסט, הרקע והקישור.
כדי להוסיף את ההודעה במקום הרצוי, פשוט השתמש בקוד הקצר הזה:
[polylang_translation_notice]עם ה-CSS בדוגמה, זה נראה כך.

אם ברצונך להוסיף הודעה לתרגום בשפה אחרת, כל שעליך לעשות הוא לשנות את קוד השפה ב-pll_get_post($post_id, 'en'); ל-'fr', 'de', 'it' וכו'. אם אתה צריך להשתמש במספר הודעות, תוכל להוסיף קטעים שונים, אחד לכל שפה. ניתן להוסיף את כולם באותו קטע, אך אני נזקקתי רק לאחד.
השבת את בורר השפות בדף התשלום של WooCommerce
באמצעות פונקציה זו תוכל למנוע את הצגת בורר השפות של Polylang בעמוד התשלום של WooCoommerce.
// Desactiva el switcher en la página de checkout de WooCommerce
add_filter('pll_the_languages', function($output) {
if (function_exists('is_checkout') && is_checkout()) {
return '';
}
return $output;
});






