WPML

למד כיצד להשתמש בקוד PHP מותאם אישית ובפילטרים של WPML כדי לרשום ידנית וידג'טים מותאמים אישית של Elementor לתרגום.

ישנם שני סוגים של וידג'טים מותאמים אישית של Elementor:

כדי להפוך את הווידג'ט המורכב שלך לניתן לתרגום באמצעות WPML, תוכל להשתמש באחת משתי דרכים:

  1. מומלץ: שימוש ב־wpml-config.xml, קובץ התצורה של WPML. התהליך מתואר במדריך שלנו על כיצד לרשום וידג'טים של תוסף בניית עמודים לתרגום.
  2. ידני: שימוש בקוד PHP מותאם אישית. אם ברצונך להשתמש בשיטה זו, תוכל לעקוב אחר ההנחיות בעמוד זה.

הוספת תמיכת תרגום של WPML באמצעות PHP

כדי להדגים את התהליך הידני, לקחנו את אחד מהווידג'טים של Elementor והרחבנו אותו כך שיכלול תמיכה ב־WPML. תוכל למצוא את הווידג'ט בעמוד GitHub זה.

1. הוספת פילטר של WPML לווידג'ט שלך

עבור כל תוסף וידג'ט מותאם אישית, עליך להוסיף את הפילטר wpml_elementor_widgets_to_translate במהלך פעולת ה־init שלו. WPML משתמש בפילטר זה כדי לאסוף מידע נוסף על טקסטים של הווידג'ט שזקוקים לתרגום.

פילטר של WPML לווידג'טים של Elementor
add_filter( 'wpml_elementor_widgets_to_translate', [ $this, 'wpml_widgets_to_translate_filter' ] );

פילטר זה מעביר את המערך המפרט את כל סוגי הווידג'טים שצריכים תרגום. מערך זה כולל חלקי Elementor כברירת מחדל ומידע על מה שזקוק לתרגום.

עליך להוסיף כל סוג וידג'ט חדש למבנה זה, כפי שמוצג בדוגמה הבאה.

הוספת וידג'טים של Elementor
public function wpml_widgets_to_translate_filter( $widgets ) {
  $widgets[ $this->get_name() ] = [
     'conditions' => [ 'widgetType' => $this->get_name() ],
     'fields'     => [
        [
           'field'       => 'title',
           'type'        => __( 'Hello World Title', 'hello-world' ),
           'editor_type' => 'LINE'
        ],
     ],
  ];

  return $widgets;
}

2. יצירת מחלקה (Class) מותאמת אישית שתטפל בתרגומים

כאשר הפילטר במקומו, צור מחלקה מותאמת אישית לניהול התרגומים של הווידג'ט שלך. ציין את שם המחלקה בשדה integration-class.

ציון מחלקה מותאמת אישית הכוללת וידג'טים מורכבים יותר
public function wpml_widgets_to_translate_filter( $widgets ) {
  $widgets[ $this->get_name() ] = [
     'conditions' => [ 'widgetType' => $this->get_name() ],
     'fields'     => [],
      'integration-class' => 'My_Custom_Widget_WPML_Support’,
     ],
  ];

  return $widgets;
}

במערך fields, תוכל לציין את האלמנטים הבאים:

  1. field – ה־id של השדה. זהה ל־id שבו נעשה שימוש בעת הוספת פקד דרך הפונקציה Control_stack::add_control.
  2. type – סוג השדה. זהו הטקסט המוצג בעורך תרגום של WPML כדי לעזור למתרגם לדעת איזה שדה יש לתרגם.
  3. editor_type – זהו סוג שדה הטקסט המשמש בעורך תרגום של WPML. ערכים חוקיים הם LINE, AREA ו־VISUAL.

3. הטמעת הממשק IWPML_Page_Builders_Module

מחלקת האינטגרציה צריכה להטמיע את הפונקציות get ו־update. הפונקציה get מחזירה את רשימת המחרוזות שזקוקות לתרגום והפונקציה update מעדכנת את נתוני Elementor כאשר מתקבל תרגום.

דוגמה למחלקה מותאמת אישית הכוללת וידג'טים מורכבים יותר
/**
* Class IWPML_Page_Builders_Module
*/
interface IWPML_Page_Builders_Module {
  /**
   * @param string|int $node_id
   * @param mixed $element
   * @param WPML_PB_String[] $strings
   *
   * @return WPML_PB_String[]
   */
  public function get( $node_id, $element, $strings );

  /**
   * @param string|int $node_id
   * @param mixed $element
   * @param WPML_PB_String $string
   *
   * @return array
   */
  public function update( $node_id, $element, WPML_PB_String $string );
}

4. טיפול במופעים מרובים של אותו שדה בבלוק באמצעות field_id

אם יש לך מופעים מרובים של אותו שדה בתוך בלוק, השתמש ב־field_id כדי לתאר שדה בתוך בלוק של Elementor. זה מאפשר לך להבדיל בין מופעים של אותו שדה בצומת.

מופעים מרובים של אותו שדה
public function wpml_widgets_to_translate_filter( $widgets ) {
 $widgets[ $this->get_name() ] = [
    'conditions' => [ 'widgetType' => $this->get_name() ],
    'fields'     => [
       'title_1' => [
          'field'       => 'title',
          'field_id'   => 'title_1',
          'type'        => __( 'Hello World Title', 'hello-world' ),
          'editor_type' => 'LINE'
       ],
       'title_2' => [
          'field'       => 'title',
          'field_id'   => 'title_2',
          'type'        => __( 'Hello World Title', 'hello-world' ),
          'editor_type' => 'LINE'
       ],
    ],
 ];

 return $widgets;
}

5. טיפול בווידג'טים עם רשימות של אלמנטים אחרים באמצעות המחלקה WPML_Elementor_Module_With_Items

חלק מהווידג'טים של Elementor, כמו הווידג'ט Slides, מכילים רשימות של אלמנטים (למשל, שקופיות מרובות עם כותרות וכפתורים). אם הווידג'ט המותאם אישית שלך כולל רשימות דומות, תוכל להרחיב את המחלקה WPML_Elementor_Module_With_Items כדי לטפל בתרגום עבור כל פריט בנפרד.

דוגמה למחלקה מותאמת אישית הכוללת רשימה של אלמנטים אחרים
/**
* Class WPML_Elementor_Slides
*/
class WPML_Elementor_Slides extends WPML_Elementor_Module_With_Items {

  /**
   * @return string
   */
  public function get_items_field() {
     return 'slides';
  }

  /**
   * @return array
   */
  public function get_fields() {
     return array( 'heading', 'description', 'button_text' );
  }

  /**
   * @param string $field
   *
   * @return string
   */
  protected function get_title( $field ) {
     switch( $field ) {
        case 'heading':
           return esc_html__( 'Slides: heading', 'wpml-string-translation' );

        case 'description':
           return esc_html__( 'Slides: description', 'wpml-string-translation' );

        case 'button_text':
           return esc_html__( 'Slides: button text', 'wpml-string-translation' );

        default:
           return '';
     }
  }

  /**
   * @param string $field
   *
   * @return string
   */
  protected function get_editor_type( $field ) {
     switch( $field ) {
        case 'heading':
        case 'button_text':
           return 'LINE';

        case 'description':
           return 'VISUAL';

        default:
           return '';
     }
  }

}

תוכל למצוא דוגמאות נוספות בתיקייה הבאה של תוסף הליבה של WPML:

  • ..\wp-content\plugins\sitepress-multilingual-cms\addons\wpml-page-builders\classes\Integrations\Elementor\modules\

הקפד לטעון את המחלקות בהוק init. החל מ־WPML 4.5, טעינת המחלקות לפני הוק הפעולה init גורמת לשגיאה קריטית.

נכתב על ידי Amir · עודכן לאחרונה: 7 בנובמבר 2024