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

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

ما هي الأدوات التي يقدمها WordPress لجعل هذا السيناريو ممكنًا؟ يتيح لنا تسجيل الخيارات مع النظام واستردادها من خلال معرف مخصص - واجهة برمجة التطبيقات (Options) هي المسؤولة عن ذلك. يوفر WordPress أيضًا واجهة برمجة تطبيقات الإعدادات لإنشاء واجهة المستخدم الرسومية للمشرف لحوارات الخيارات. وبصرف النظر عن أنه يسمح لنا بإضافة عناصر مخصصة في قائمة المشرف بحيث يمكن أن يكون للمكون الإضافي صفحة إعدادات خاصة به. أخيرًا ، يعتني WordPress بأمان المكون الإضافي ويوفر مجموعة من القدرات وطرق التنظيف للتعامل مع إدخال المستخدم بأمان.

دعونا نلقي نظرة مفصلة على كل جزء.

خيارات API

ال خيارات API هي طريقة موحدة لتخزين البيانات المخصصة في قاعدة البيانات. يتم حفظ جميع البيانات في جدول wp_options تحت اسم مخصص محدد ويمكن الوصول إليها من مكان ما في الشفرة. أهم وظائف API هي:

تقوم وظيفة get_option باستخراج قاعدة البيانات من أي معلومات مخزنة تحت اسم معين وإعادتها. تأخذ الدالة update_option اسم الخيار وقيمته وتحديث الإدخال المقابل في قاعدة البيانات. إذا لم يكن هناك مثل هذا الدخول سيتم إنشاؤه تلقائيا. يمكن أن تعمل كلتا الوظيفتين مع المصفوفات وكذلك القيم الفردية. وهذا يعني أنه يمكنك تخزين بيانات الصفيف تحت اسم واحد في قاعدة البيانات ، وستتولى API معالجة إجراءات التسلسل والتمعدن بالنسبة لك. هذه ممارسة موصى بها للمكونات الإضافية: قم بتخزين كل خيارات المكون الإضافي كمصفوفة تحت اسم واحد.

صفحة خيارات المكونات الإضافية

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

قيم المعلمات لا تحتاج إلى شرح ، ولكن يمكنك الرجوع إلى مصدر للتفاصيل. الآن عليك إضافة صفحات داخلية واحدة تلو الأخرى بالطريقة التالية:

كمعلمة $ parent_slug ، يتعين عليك استخدام معرِّف صفحة المستوى الأعلى - في حالة صفحة المستوى العلوي المخصصة ، تكون القيمة التي قدمتها كقائمة $_slug عند التسجيل. إذا لم تكن بحاجة إلى عدة صفحات ، يمكنك إنشاء صفحة إعدادات واحدة ضمن أحد أقسام المستوى الأعلى الموجودة - عادةً ضمن "الإعدادات" (يجب استخدام options-general.php كـ $ parent_slug). بدلا من ذلك هناك وظائف اختصار لإضافة صفحات فرعية في إطار بعض عناصر القائمة المشرف ، في حالة "إعدادات" انها add_options_page () .

واجهة برمجة التطبيقات للإعدادات

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

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

بعد تسجيل خياراتنا والحقول المقابلة لدينا لعرضها على صفحة الإعدادات - يجب استدعاء الوظائف التالية داخل

العلامة:

تقوم وظيفة settings_fields بالعناية بالحقول المخفية الإلزامية لكي تعمل آلية خيارات WordPress الأصلية. تقوم do_settings_sections بإخراج الأقسام والحقول المسجلة مسبقًا.

اعتبارات أمنية

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

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

ضع كل شيء في العمل

دعونا نرى السيناريو بأكمله في العمل.

سنستمر في تطوير نموذج "Hello World" (الذي بدأ في الأجزاء السابقة من السلسلة) والذي يعرض معلومات المؤلف الضيف تحت المشاركة بمساعدة التصنيف المخصص.

كان ترميز كتلة المؤلف من الصعب في السابق في البرنامج المساعد. الآن سنمنح المستخدم القدرة على تحديد قالب لهذا الترميز باستخدام عناصر نائبة للبيانات الخاصة للمؤلف (الاسم ، عنوان url والوصف). لدينا البرنامج المساعد بالفعل اثنين من ملفات PHP القابلة للإلحاق: core.php (التي تحتوي على رمز الرئيسي) و admin.php (التي تحتوي على التعليمات البرمجية المتعلقة بالإدارة).

ما هي التغييرات التي نحتاجها؟

1. إنشاء صفحة خيارات المكونات الإضافية (في admin.php)

/* register menu item */function msp_helloworld_admin_menu_setup(){add_submenu_page('options-general.php','Helloworld Settings','Helloworld','manage_options','msp_helloworld','msp_helloworld_admin_page_screen');}add_action('admin_menu', 'msp_helloworld_admin_menu_setup'); //menu setup/* display page content */function msp_helloworld_admin_page_screen() {global $submenu;// access page settings$page_data = array();foreach($submenu['options-general.php'] as $i => $menu_item) {if($submenu['options-general.php'][$i][2] == 'msp_helloworld')$page_data = $submenu['options-general.php'][$i];}// output?>

'؛ رد إجراءات $ ؛} add_filter (' plugin_action_links '،' msp_helloworld_settings_link '، 2، 2)؛

في هذا المقتطف يقوم msp_helloworld_admin_menu_setup بإنشاء صفحة فرعية ضمن قائمة "الإعدادات" (يجب أن يتم تنفيذها على خطاف تصرف "admin_menu" للعمل بشكل صحيح). ثم نخرج نموذج الإعدادات باستخدام msp_helloworld_admin_page_screen. وهي تستخدم وظائف إعدادات API للحقول ووظائف ووردبريس سابقة البناء للعناصر الأخرى للواجهة (مثل زر الإرسال). لاحظ سمة الإجراء الخاصة بـ

tag: يجب أن تشير إلى "options.php" لمعالجة الخيارات بشكل صحيح. وأخيرًا ، ينشئ فلتر msp_helloworld_settings_link رابطًا مختصرًا لصفحة الخيارات على شاشة إدارة المكونات الإضافية.

2. تسجيل خيارات البرنامج المساعد مع النظام وإنشاء الحقول والقواعد الخاصة بهم

/* register settings */function msp_helloworld_settings_init(){register_setting('msp_helloworld_options','msp_helloworld_options','msp_helloworld_options_validate');add_settings_section('msp_helloworld_authorbox','Author's box','msp_helloworld_authorbox_desc','msp_helloworld');add_settings_field('msp_helloworld_authorbox_template','Template','msp_helloworld_authorbox_field','msp_helloworld','msp_helloworld_authorbox');}add_action('admin_init', 'msp_helloworld_settings_init');/* validate input */function msp_helloworld_options_validate($input){global $allowedposttags, $allowedrichhtml;if(isset($input['authorbox_template']))$input['authorbox_template'] = wp_kses_post($input['authorbox_template']);return $input;}/* description text */function msp_helloworld_authorbox_desc(){echo "

Enter the template markup for author box using placeholders: [gauthor_name], [gauthor_url], [gauthor_desc] for name, URL and description of author correspondingly.

";}/* filed output */function msp_helloworld_authorbox_field() {$options = get_option('msp_helloworld_options');$authorbox = (isset($options['authorbox_template'])) ? $options['authorbox_template'] : '';$authorbox = esc_textarea($authorbox); //sanitise output?>

يجب أن أشير إلى أنه يجب تخزين جميع خيارات المكون الإضافي كمصفوفة. على الرغم من حقيقة أن لدينا خيار واحد فقط (authorbox_template) ، فإننا نقوم بتضمينه في صفيف والحقل المقابل في القسم لأغراض العرض. يجب تنفيذ وظيفة التسجيل msp_helloworld_settings_init على خطاف 'admin_init'. تقوم وظيفة msp_helloworld_options_validate بالاهتمام بإدخال المستخدم من خلال تنظيفه مع المستخدم الأصلي wp_kses_post مرشح يعتمد على مكتبة KSES. تقوم الدالة msp_helloworld_authorbox_desc بإنشاء وصف لقسم النموذج و msp_helloworld_authorbox_field يخرج نصا للتعامل مع العلامة المدخلة. لاحظ أننا نقوم بتعيين "CSS-text" لفئات CSS بحيث يتم تطبيق التصميم الإداري المضمّن.

كل هذا ينتج الشاشة التالية في لوحة مدير WordPress.

3. تعديل الدالة التي مربع مخرجات المؤلف (في core.php)

نحن نقوم بذلك حتى يحصل على القالب من قاعدة البيانات ويستبدل بيانات المواضع ([gauthor_name] ، [gauthor_url] ، [gauthor_desc]) بالقيم المقابلة.

/* Create author's box markup */function msp_helloworld_author_block(){global $post;$author_terms = wp_get_object_terms($post->ID, 'gauthor');if(empty($author_terms))return;$name = stripslashes($author_terms[0]->name);$url = esc_url(get_term_link($author_terms[0]));$desc = wp_filter_post_kses($author_terms[0]->description);//get template from option$options = get_option('msp_helloworld_options');$out = (isset($options['authorbox_template'])) ? $options['authorbox_template'] : '';$out = str_replace(array('[gauthor_url]', '[gauthor_name]', '[gauthor_desc]'),array($url, $name, $desc),$out);return $out;}

وأخيرًا ، ينتج المكون الإضافي لدينا (بعد تطبيق بعض الأنماط) مربعًا خاصًا بمؤلف ضيف تحت محتوى ما بعد النشر.

استنتاج

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

ما نوع المكوّنات الإضافية التي ترغب في رؤيتها متاحة لـ WordPress؟ هل بنيت بنفسك باستخدام هذه السلسلة؟ أخبرنا في التعليقات أدناه.

تستخدم صورة مميزة صورة الوحدة عبر Shutterstock