تعرف على كيفية استخدام كود PHP مخصص ومرشِّحات WPML لتسجيل ودجات Elementor المخصصة للترجمة يدوياً.
هناك نوعان من ودجات Elementor المخصصة:
- الودجات البسيطة: هي ودجات لا تحتوي على حقول متكررة. يمكنك تسجيل الودجات البسيطة باستخدام إضافة Multilingual Tools من WPML لتجنب كتابة أكواد إضافية في PHP.
- الودجات المعقدة: ودجات ذات هياكل أكثر تعقيداً. قد تتضمن حقلاً متكرراً واحداً أو أكثر.
لجعل ودجت المعقدة الخاصة بك قابلة للترجمة باستخدام WPML، يمكنك استخدام إحدى طريقتين:
- موصى بها: استخدام wpml-config.xml، ملف تكوين WPML. توضح العملية في درسنا التعليمي حول كيفية تسجيل ودجات أداة بناء الصفحات للترجمة.
- يدوية: استخدام كود 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. أنشئ فئة مخصصة ستتولى التعامل مع الترجمات
بعد وضع المرشِّح في مكانه، أنشئ فئة مخصصة لإدارة ترجمات الودجت الخاصة بك. حدد اسم الفئة في حقل 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، يمكنك تحديد العناصر التالية:
- field – id الحقل. وهو نفس id المستخدم عند إضافة عنصر تحكم عبر دالة Control_stack::add_control.
- type – نوع الحقل. هذا هو النص المعروض في محرر ترجمة WPML لمساعدة المترجم على معرفة الحقل المراد ترجمته.
- 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. يتيح لك هذا التمييز بين تكرارات نفس الحقل في عقدة (node).
تكرارات متعددة لنفس الحقل
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 إلى حدوث خطأ فادح.