البحث في الموقع
المحتوى عن 'مدخل إلى برمجة إضافات ووردبريس'.
-
مقدمة من أهم أسباب انتشار ووردبريس وسيطرته على سوق أنظمة إدارة المحتوى هو الكم الهائل من إضافاته المجانية والمدفوعة والتي تقدم العديد من الخصائص والمميزات والتحسينات الإضافية التي لا تتوفر بصورة افتراضية في قلب ووردبريس WordPress Core. في هذا المقال سنتعرف سوّيًا على أساسيات إنشاء إضافة لووردبريس لكن قبل الدخول في لب الموضوع دعنا نجب على سؤال مُهمّ وكذلك تعريف إضافات ووردبريس. لماذا ننشئ إضافات ووردبريس هنالك قاعدة مهمة في تطوير ووردبريس، وهي: إياك أن تلمس الشيفرات Codes الأساسية لووردبريس أي لا تُعدّل على قلب ووردبريس WordPress Core وذلك لأنه عند التحديث سيتمّ استبدال بعض أو كل ملفات ووردبريس الأساسية، وبالتّالي ستفقد التعديلات التي قمت بها، ولهذا السبب نلجأ إلى تطوير إضافات عند الحاجة لإضافة التحسينات والخصائص الجديدة على النّظام. تعريف إضافات ووردبريس إضافة ووردبريس عبارة عن دالة أو مجموعة دوال (حزمة شيفرات code package) مكتوبة بلغة php تقوم بإضافة بعض الخصائص لنظام إدارة المُحتوى. وتندمج شيفرات الإضافة معه من خلال واجهة برمجية API يوفرها له. بالإضافة لملفات php يمكن أن تحتوي الإضافة على ملفات أخرى مثل ملفات JavaScript, CSS وبعض الصور. إنشاء إضافة ووردبريس هذه بعض الخطوات المهمة عند إنشاء أي إضافة ووردبريس وبعض الأمور التي يجب مراعاتها. اختيار اسم الإضافة في البدء عليك أن تقوم باختيار اسم فريد للإضافة التي تود إنشائها بحيث لا يكون الاسم مستخدما من قبل من إحدى إضافات ووردبريس حتى لا يحدث تعارض بين الإضافات مستقبلا. إنشاء مجلد الإضافة بعد اختيار اسم الإضافة تقوم بإنشاء مجلد لها بالاسم الذي اخترناه ويكون هذا المجلد داخل مجلد plugins الخاص بالإضافات والموجود داخل مجلد wp-content كما موضح بالصّورة. يمكنك إنشاء ملف php بنفس الاسم بدلًا عن إنشاء مُجلّد كامل لكن يُفضّل أن تنشئ مُجلّدًا خاصًّا حتى يستوعب بقية ملفات الإضافة، ما لم تكن الإضافة تحتوي على ملف php واحد فقط. إنشاء الملف الأساسي للإضافة بعد إنشائك للمُجلّد في الخطوة أعلاه عليك أن تقوم بإنشاء ملف php له نفس اسم المجلد السابق، وهذا الملف هو الملف الأساسي للإضافة والذي سيستخدمه ووردبريس للتّعرف على بعض الأمور المُتعلّقة بالإضافة مثل اسمها واسم المُبرمج ورخصة الإضافة وغيرها، وهذا يتم من خلال استخدام ترويسة للملف الأساسي للإضافة وهذه هي الصّيغة العامة لها: <?php /** * Plugin Name: هنا تكتب اسم الإضافة والذي يجب أن يكون فريدًا * Plugin URI: هنا تكتب رابط موقع الإضافة * Description: هنا نبذة مختصرة عن الإضافة * Version: رقم نسخة الإضافة، مثلا 1.0.0 * Author: اسم مطور الإضافة * Author URI: رابط موقع مطور الإضافة * License: اسم رخصة الإضافة */ السّطر الإجباري هو سطر اسم الإضافة فقط، ويتمّ استخدام بقية السطور (في حال ورودها) في إنشاء معلومات الإضافة التي تظهر في لوحة تحكم الإضافات عند استعراض الإضافة. برمجة الإضافة قبل أن تبدأ في برمجة الإضافة تحتاج لمعرفة بعض الأمور العامة في برمجة ووردبريس بالإضافة لبعض التسهيلات التي يقدمها ووردبريس للمبرمجين مثل الواجهات البرمجية الجاهزة WordPress API's. الخطافات في ووردبريس WordPress Hooks ( الدخول الى عمق ووردبريس) من أهم المفاهيم في ووردبريس مفهوم الخطافات hooks والتي تنقسم إلى قسمين: الأحداث actions والمُرشّحات filters. 1- الإجراءات في ووردبريس WordPress Actions فلنفترض أنه لدينا دالة معينة نريد أن يتم تنفيذها في لحظة معينة أثناء دورة حياة ووردبريس أو عند حدوث حدث معين، كيف يمكننا إنجاز هذا الأمر؟ أحد الخيارات أن نقوم بمناداة هذه الدالة بالطريقة العادية في المكان الذي نريدها أن تُنفّذ فيه، لكن هذا الأمر يتطلّب التّعديل على ملفات ووردبريس الأساسية. لك القاعدة التي ذكرناها مسبقا: إياك أن تلمس الشيفرات الأساسية لووردبريس تمنعنا من القيام بذلك. الحل الآخر هو أن نستخدم الإجراءات actions وهي عبارة عن آليّة رائعة يوفرها ووردبريس تمكّنك من إضافة الدّوال الخاصّة بك لتُنفّذ في وقت معين أثناء تنفيذ الشيفرات الخاصة بووردبريس إذًا، يمكننا أن نعرف الإجراءات بأنها طريقة تمكننا من إخبار ووردبريس بتنفيذ دالة معينة عند حصول حدث معين وبهذه الطريقة نستطيع الدخول إلى عمق ووردبريس من دون التعديل المباشر على ملفاته الأساسية Core files. يتم هذا كله من خلال ربط الدّوال التي تريدها مع الأحداث الجاهزة التي يوفرها ووردبريس والتي يقوم بتنفيذها أثناء دورة حياته وهذا ما يجعلك قادرا على تنفيذ الدّوال الخاصة بك في أي مكان تريده تقريبا. إذا كنّا نريد مثلا تنفيذ الدّالة my_function عندما ينفذ ووردبريس الحدث my_action علينا ببساطة أن نخبره بذلك من خلال إضافة هذه الدالة إلى هذا الحدث. ويتم ذلك من خلال الدالة add_actions بالطريقة التالية add_action('my_action', 'my_function'); 1-1مثال للإجراءات في ووردبريس فلنأخذ هذا المثال الذي يقوم بإرسال بريد إلى مدير الموقع (الدالة المراد تنفيذها) كلما نشر مقالًا جديدًا (الحدث الذي تنفذ عنده الدالة) add_action('publish_post', 'email_admin'); function email_admin(){ // هنا يتم إرسال البريد الإلكتروني إلى مدير الموقع } 2-المرشحات في ووردبريس WordPress Filters المُرشّحات هي النوع الثاني من الخطّافات التي يوفرها ووردبريس وهي مختصّة أكثر بالبيانات حيث أنها تتيح لنا إمكانية التعديل على قيم المتغيرات (اسم المقال مثلا) قبل حفظها في قاعدة البيانات أو قبل عرضها للمستخدم، وكما هو ظاهر من اسمها فهي تتيح لنا إمكانية ترشيح البيانات، بمعنى إدخالها إلى filter مُعيّن يُعدّل عليها قبل إخراجها من الجانب الآخر من هذا المُرشّح . بطبيعة الأمر وكما هو الحال بالنّسبة للأحداث فإن ووردبريس يُوفّر لك إمكانية إدخال أغلب مُتغيّراته في المُرشّحات التي تريدها من خلال اسم المتغير، ويمكنك الاطّلاع على المُتغيّرات التي يمكنك تمريرها عبر المُرشّحات بزيارة التوثيق الرسمي للمرشحات. يتم إضافة فلتر معين my_filter لبيانات معينة my_data من خلال الدّالة add_filter بالطريقة التالية add_filter( 'my_data', 'my_filter' ); حيث أن my_filter هي الدّالة التي ستقوم بالتعديل على البيانات ويتم تمرير البيانات لها من قبل ووردبريس أي أنها يجب أن تستقبل my_data كمعامل parameter. 2-1مثال للمرشحات في ووردبريس هذا المثال يقوم بتعديل محتوى المقال the_content حيث يقوم بإضافة التّوقيع لمُحتويات كل مقال في الموقع add_filter ( 'the_content', 'add_signiture' ); function add_signiture($the_content){ // هنا نقوم بإضافة الشيفرات التي تضيف التّوقيع لمحتويات المقال return $the_content; // بعد ذلك تقوم الدّالة بإرجاع القيم الجديدة لمحتويات المقال } هذه نظرة سريعة فقط على الخطافات في ووردبريس ولكن ما زال هنالك العديد من الأشياء المتعلقة بهذه الآلية الرّائعة التي يوفرها ووردبريس منها: إمكانية إضافة الـhooks الخاصة بك. تعديل أولوية تنفيذ الدّوال التابعة لنفس الـhook. ويمكنك التعرف على المزيد حول موضوع الخطافات في التّوثيق الرسمي لPlugin API وسوم القالب Template Tags قد تبدو الترجمة الحرفية مُضلّلة نوعًا ما خصوصا إذا علمت أن المقصود من وسوم القالب هو مجموعة من الدّوال الجاهزة التي يوفرها ووردبريس والتي تختصر لك الكثير من العمل، لذلك من الجيد أن تلقي نظرة عليها قبل البدء في برمجة الإضافة الخاصة بك. الجدير بالذّكر أن يتم استخدام كثير من هذه الدّوال داخل الحلقة الخاصّة بجلب المقالات في ووردبريس WordPress Loop والتي تستخدم بكثرة في القوالب، ولعل هذا هو سرّ تسميتها بوسوم القالب. حفظ بيانات/ الإضافة في قاعدة البيانات الكثير من إضافات ووردبريس إن لم يكن معظمها تحتاج لاستقبال بعض البيانات من مدير الموقع (خيارات الإضافة مثلا) وحفظها في قاعدة البيانات لاسترجاعها واستخدامها لاحقا، ولهذا السبب يتيح لنا ووردبريس عدّة طرق لحفظ البيانات في قاعدة بيانات الموقع واختيار الطريقة المناسبة يعتمد على نوع البيانات المراد حفظها. هذه الطرق هي: 1- استخدام آلية "الخيارات options" التي يوفرها ووردبريس وهذه الطريقة مناسبة في حالة كون البيانات المراد حفظها صغيرة نسبيا ولا تتغير كثيرا مثل البيانات التي تتوقع من مدير الموقع إدخالها بعد تنصيب الإضافة مباشرة (خيارات الإضافة) والتي نادرا ما تتغير. في هذه الطريقة يتم حفظ بيانات الإضافة في جدول wp_options والذي يستخدمه ووردبريس لحفظ خياراته الخاصة. 2-استخدام البيانات الوصفية الخاصة بالمقالات Post Meta وهذه الطريقة مناسبة في حالة البيانات المتعلقة بمقال أو صفحة مفردة (مثلا مزاج الكاتب عند كتابة المقال) 3-استخدام الفئات المخصّصة وهذه مناسبة لتصنيف البيانات مثل تصنيف المقالات أو المستخدمين أو التعليقات. 4- إنشاء جدول جديد في قاعدة البيانات هذه الطريقة مناسبة مع البيانات التي لا يصلح معها أي نوع من الأنواع الثلاثة السابقة والتي تتوقع أن تتزايد مع الزمن والتي لا يمكن حصرها في اسم محدد. الاستفادة من الواجهات البرمجية API's التي يوفرها ووردبريس يحتوي ووردبريس على مجموعة ضخمة من الدّوال والأصناف Classes المفيدة التي تمثل بوّابات تربطك بقلب ووردبريس WordPress Core بالإضافة إلى توفيرها لدوال مفيدة في كثيرا من الأمور البرمجية العامة في مجال الويب، وهذه أمثلة لبعض الواجهات البرمجية التي يوفرها ووربريس Plugin API: تتيح لك الدّوال المستخدمة في الاستفادة من ميكانيكية الخطافات وكذلك الدّوال المساعدة لإنشاء الخطافات الخاصة بك. Database API : واجهة برمجية تسهل التعامل مع قاعدة بيانات ووردبريس. Rewrite API: تتيح لك إمكانية تغير صيغة روابط المقالات والموقع عموما والتحكم فيها. Filesystem API: للتعامل مع نظام الملفات في نظام التشغيل. وغيرها الكثير من الواجهات البرمجية ويمكنك الإطلاع عليها من هنا أمور عامة عليك مراعاتها عند برمجة الإضافة 1- الاهتمام بأمن الشيفرة Code Security كما هو الحال عند برمجة أي سكربت من خلال لغة php عليك مراعاة أن يكون خاليا من الثغرات التي قد تعرض الموقع لخطر الاختراق، نفس الأمر ينطبق على إضافات ووردبريس فعليك الاهتمام بإغلاق الثّغرات المعروفة وحماية المدخلات وكذلك ملفات الإضافة بمنع الوصول المباشر لها عن طريق استخدام الشيفرة التالية مثلا defined( 'ABSPATH' ) or die( 'ممنوع الوصول المباشر' ); هنالك أشياء أخرى يجب مراعاتها خصوصا إذا أردت نشر إضافتك في مستودع إضافات ووردبريس، بعض هذه الأمور إجباري وتحتاج لعمله حتى يتم قبول إضافتك ونشرها في المستودع، من هذه الأمور: 2- ملف اقرأني Readme File هو ملف تقوم بتضمينه في مجلد الإضافة باسم readme.txt ويستخدمه مستودع الإضافات لأخذ بعض المعلومات بالإضافة للمعلومات التي تظهر في صفحة الإضافة في المستودع، يمكنك استخدام هذا المُوّلد لإنشائه 3- جعل الإضافة قابلة للترجمة من الأمور الأخرى التي عليك مراعاتها هو جعل الإضافة قابلة للترجمة لعدة لغات localized حيث يمكنك استخدام مكتبة gettext التي يوفرها ووردبريس والتي تجعل من عملية جعل الكلمات قابلة للترجمة أمر سهل، وبعد ذلك يتم إرفاق ملفات اللغة مع الإضافة، ويمكنك قراءة المزيد عن هذا الأمر من هنا 4- استخدام معايير تطوير وودبريس معايير التّطويرCoding Standard هي بعض القواعد العامة التي عليك مراعاتها عند كتابة الشيفرة لتجنب أخطاء التشفير Coding وتسهيل عملية كتابة الشيفرات ومراجعتها وقراءتها خصوصا في حالة تعاون أكثر من شخص في برمجة شيء ما. لووردبريس قواعده الخاصة أيضا والتي يحاول من خلالها المحافظة على قواعد ثابتة في شيفرات ووردبريس وكذلك شيفرات الإضافات والقوالب لذلك يفضل أن تلتزم بهذه القواعد عند كتابة شيفرات الإضافة الخاصة بك. يمكنك قراءة المزيد عن هذه القواعد من هنا. 5- تحديث الإضافة يستخدم مستودع إضافات ووردبريس نظام Subversion لتحديث ولمعرفة آلية القيام بذلك، زر هذه الصّفحة كانت هذه كانت مقدمة سريعة ونبذة مختصرة حاولنا أن نجعلها كمدخل لبرمجة إضافات ووردبريس وما زال هنالك المزيد لمعرفته عن برمجة إضافات ووردبريس في مقالات قادمة.
-
في الدرس السابق من هذه السلسلة بدأنا بتطوير إضافة عداد المشاهدات حيث قمنا بإضافة عدد المشاهدات لكل مقال ومتابعته كما قمنا بتوفير شيفرة مختصرة Shortcode لعرض عدد مشاهدات أي مقال، وتبقى لنا أن نبرمج ويدجت لعرض المقالات الأكثر مشاهدة وهذا ما سنقوم به في هذا الدرس بالإضافة لبعض الإقتراحات لتطوير الإضافة في نسخها القادمة ونختم هذا الدرس والذي هو الأخير في هذه السلسلة باستعرض بعض الأدوات المفيدة لمطوري إضافات ووردبريس. برمجة ويدجت المقالات الأكثر مشاهدةلبرمجة ودجت جديد في ووردبريس تقوم ببساطة بإنشاء صنف class جديد يرث الصنف الأساسي للويدجات الذي يوفره ووردبريس حيث تعتمد هذه الجزئية على البرمجة الكائنية ولكن لا تقلق إن كان هذا المصطلح لم يمر عليك من قبل فإن التطبيق لا يحتاج منا سوى كتابة أربعة دوال: الأولى هي الدالة الأساسية للويدجت والتي نعرف فيها اسم ووصف الودجت. والثانية لعرض خيارات الويدجت في لوحة تحكم ووردبريس (في القائمة المظهر – الودجات) .والثالثة لحفظ خيارات الويدجت عندما يقوم المستخدم بتعديلها.والرابعة هي ما سيتم عرضه في واجهة الموقع (الشريط الجانبي) عند إستخدام الويدجت. وإذا أردت أن تتعمق أكثر في برمجة الويدجات يمكنك مراجعة مقال كيف تبني ودجت لووردبريس. ملف widget.phpبالطبع سنكتب جميع الشيفرات المتعلقة ببرمجة الويدجت في هذا الملف، ولنبدأ بكتابة صنف الودجت وفيه الدوال الأربعة السابقة بدون تفصيل كالآتي: class HA_Views_Widget extends WP_Widget { // البيانات الأساسية للودجت (مثل اسم ووصف الودجت) public function __construct() { } // عرض خيارات الويدجت في لوحة تحكم ووردبريس public function form( $instance ) { } // لحفظ خيارات الويدجت عندما يقوم المستخدم بتعديلها public function update( $new_instance, $old_instance ) { } // ما سيتم عرضه في واجهة الموقع (المقالات الأكثر مشاهدة) public function widget($args, $instance ) { } }الأن سنقوم بإعلام ووردبريس أنه لدينا ودجت جديد من خلال تسجيله كالآتي: // تسجيل الويدجت من خلال إضافة الدالة أدناه للحدث widget_init add_action( 'widgets_init', 'ha_widget_init' ); function ha_widget() { register_widget( 'HA_Views_Widget' ); }لاحظ أن الدالة ()register_widget تستقبل مُعاملًا واحدًا وهو اسم صنف الودجت الذي نود تسجيله وهو في حالتنا هذه HA_Views_Widget كما اخترناه في الأعلى. بعد ذلك لنقم بكتابة تفاصيل الدوال التي عرفناها أعلاه. الدالة constructفي هذه الدالة نقوم ببناء الودجت من خلال تمرير البيانات الأساسية للودجت وهي الاسم والوصف بالإضافة للمعرف وكذلك اسم صنف CSS الذي سيقوم ووردبريس بإضافة للودجت، ويتم ذلك بهذه الطريقة: $widget_details = array( 'classname' => 'ha_views_widget', 'description' => 'ودجت لعرض المقالات الأكثر مشاهدة' ); parent::__construct( 'ha_views_widget', 'المقالات الأكثر مشاهدة', $widget_details );الان ستجد أن الودجت ظهرت في لوحة تحكم ووردبريس بالاسم والوصف اعلاه. الدالة formنود أن نضيف للمستخدم خيار لاختيار عدد المقالات الأكثر مشاهدة التي يود عرضها في واجهة الموقع وخيار آخر لاختيار عنوان الودجت الذي سيظهر أعلى المقالات، وهذا ما ستقوم به هذه الدالة فهي المسؤولة عن إنشاء النموذج form الذي سيظهر للمستخدم في لوحة التحكم، وهذه هي الصورة النّهائية لها: public function form( $instance ) { $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'count' => '' ) ); $title = strip_tags($instance['title']); $count = $instance['count']; ?> <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('العنوان:'); ?></label> <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p> <p><label for="<?php echo $this->get_field_id('count'); ?>"><?php _e('عدد المقالات:'); ?></label> <input class="widefat" id="<?php echo $this->get_field_id('count'); ?>" name="<?php echo $this->get_field_name('count'); ?>" type="text" value="<?php echo $count; ?>" /></p> <?php }الدّالة updateهذه الدالة مهمتها بسيطة جدا وهي حفظ خيارات المستخدم عندما يقوم بتعديلها من خلال الضغط على زر الحفظ، وهي ببساطة تقوم بإرجاع القيم الجديدة للخيارات بالصورة التالية: public function update( $new_instance, $old_instance ) { return $new_instance; }الدالة widgetسنقوم من خلال هذه الدالة بعرض اكثر المقالات مشاهدة وذلك من خلال استخدام حلقة ووردبريس لجلب المقالات وذلك باستخدام صنف WP_Query والذي يمكننا من تحديد المقالات التي نود جلبها وفي حالتنا هذه نود جلب أعلى المقالات مشاهدة اعتمادًا على قيمة الميتا post_meta التي استخدمناها سابقا لحفظ عدد المقالات، أي أننا نود جلب المقالات مرتبة على حسب قيمة الميتا ha_post_views_count ولحسن الحظ يوفر صنف WP_Query طريقة سهلة لإنشاء مثل هذا الاستعلام. وهذه هي صورة الاستعلام: $count = ( ! empty( $instance['count'] ) ) ? $instance['count'] : 5 ; $query_args = array( 'meta_key' => 'ha_post_views_count', 'orderby' => 'meta_value_num', 'posts_per_page' => $count ) $query = new WP_Query($query_args);حيث أننا باختيار قيمة orderby لتكون على حسب meta_value_num أي على حسب قيمة الميتا وهي قيمة عددية، وكذلك قمنا باختيار عدد المقالات المعروض ليساوي count$ وهي القيمة التي سيدخلها المستخدم والتي نستطيع التوصل إليها من خلال المتغير instance$ الذي يتم تمريره للدالة والذي من خلاله يمكنك الوصول للبيانات التي قام المستخدم بإدخالها في لوحة التحكم. في حالة لم يقم المستخدم باختيار عدد المقالات المعروضة سيتم عرض 5 مقالات. الآن لم يتبقَ لنا سوى إنشاء الحلقة وعرض عناوين وروابط المقالات وكذلك عنوان الودجت لتصبح الصورة النهائية لهذه الدالة كالاتي: public function widget($args, $instance ) { $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : 'المقالات الأكثر مشاهدة' ; $count = ( ! empty( $instance['count'] ) ) ? $instance['count'] : 5 ; $query_args = array( 'meta_key' => 'ha_post_views_count', 'orderby' => 'meta_value_num', 'posts_per_page' => $count ); $query = new WP_Query($query_args); if($query->have_posts()): ?> <?php echo $args['before_widget']; ?> <?php if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; } ?> <ul> <?php while ( $query->have_posts() ) : $query->the_post(); ?> <li> <a href="<?php the_permalink(); ?>"><?php get_the_title() ? the_title() : the_ID(); ?></a> </li> <?php endwhile; ?> </ul> <?php echo $args['after_widget']; ?> <?php wp_reset_postdata(); endif; }وبهذا نكون قد أكملنا برمجة الودجت ولا تنس إضافة بعض التنسيقات للودجت في ملف widget.css والذي قمنا بصفه سابقا. اقتراحات لتطوير الإضافةكانت هذه النسخة الأولى من الإضافة بالتالي تحتوي على المميزات الأساسية ويمكنك إضافة المزيد من المميزات في النسخ القادمة وسنقترح عليك بعض التطوير لتتدرب عليها، وهي: إضافة خيار في الشيفرة المختصرة shortcode لإدخال معرف المقال الذي تود عرض عدد مشاهداته، فربما يود المستخدم عرض عدد مشاهدات مقال ما داخل مقال آخر.إضافة المزيد من الخيارات للودجت مثل اختيار المدة الزمنية للمقالات المعروضة، مثلا أشهر المقالات خلال هذا الأسبوع.التعديل على ما يعرضه الويدجت وكذلك تنسيقه، كأن تعرض مثلا صور بارزة للمقالات الأكثر مشاهدة.يمكنك تحميل أو نسخ الإضافة من هذا الرابط. أدوات مفيدة لمطوري إضافات ووردبريسهنالك بعض المصادر والمواقع والأدوات التي توفر لك كثيرًا من الجهد والوقت عند برمجة إضافات ووردبريس خصوصا مع شهرة ووردبريس فهذا يعني أن هنالك العديد من الأسئلة التي قد تخطر ببالك قد تم الإجابة عنها مسبقا وبعض الأشياء التي تود برمجتها ربما سبقك بها بعض المطورين وقاموا بإتاحتها لمجتمع المطورين ولا ننسى المصادر الرائعة التي لا غنى لك عنها في كثير من الأحيان، وإليك بعض هذه الأدوات. مكتبات وفئات Classes جاهزة1- WordPress Plugin Boilerplateوهي عبارة عن نموذج جاهز أو أساس يمكنك استخدامه لبناء إضافتك، وما يميزها أنه تم بناءها من قبل المطور المشهور Tom McFarlin كما أنه تم بنائها بأسلوب برمجة الكائنات Object Oriented Programming بالتّالي تعتبر بالفعل أساسًا جيّدًا لإضافة قابلة للتطوير. فوق ذلك هنالك مولد يمكنك استخدامه لإنشاء ملفات إضافتك بالاعتماد على هذا النموذج. 2- CMB2وهذه عبارة عن مكتبة جاهزة للتعامل مع الحقول المُخصصة Custom fields لأنواع المقالات المختلفة Post Types وكذلك الحقول والبيانات الخاصة بالمستخدمين User Meta كما يمكنك استخدامها لإنشاء صفحات الخيارات Options Page ويمكنك دمجها في مشروعك بسهولة. تدعم هذه المكتبة عددًا كبيرًا جدًا من الحقول المتقدمة ويمكنك إضافة أنواع جديدة بسهولة حيث توفر مجموعة كبيرة من الخطافات Hooks التي تسهل من عملية التعديل عليها وزيادة مميزاتها بدون لمس الشيفرات الأساسية. ولا ننسى أن نذكر أن هذه المكتبة والنسخة الأولى منها CMB لقيت قبول ورواج كبير بين مطوري ووردبريس. 3- Settings API Classفي بعض الأحيان يكون التعامل مع Settings API بطيئًا وربما مُتعبًا بعض الشّيء، في مثل هذه الحالات يمكنك استخدام هذه الصّنف الجاهز التي تُسهّل التّعامل مع هذه الواجهة البرمجية، خصوصا إذا لم ترد أن تُثقل مشروعك بمكتبات كبيرة. إضافات للمطورين1- إضافة Developerهذه الإضافة تساعدك في عملية التطوير وبعد تنصيب الإضافة تعرض عليك اختيار ما تقوم بتطويره (إضافة، قالب) وبعدها تعرض عليك مجموعة من الإضافات التي تعمل معها لتنصيبها كما موضح في الصورة: وإليك بعض أهم هذه الإضافات: Debug Bar وكما يظهر من اسمها حيث تعرض قائمة لعمل Debug للاستعلامات Query والـ Cache ومجموعة أخرى من المعلومات المفيدة لعمل Debug.Rewrite Rules Inspector وهي عبارة عن أداة لتحليل قواعد إعادة كتابة الروابط links rewrite rules.log Viewer توفر لك طريقة سهلة لعرض ملفات Log عن طريق لوحة تحكم ووردبريس مباشرة.2- إضافة Query Monitorتقوم هذه الإضافة بعرض معلومات متعلقة باستعلامات قاعدة البيانات مثل الأداء Performance للاستعلامات وكذلك الخطافات Hooks وغيرها من المعلومات المفيدة التي تساعدك في تتبع الأخطاء وزيادة كفاءة وسرعة استعلامات قاعدة البيانات. مواقع ومصادر1- التّوثيق الرّسمي لووردبريس WordPress Codexببساطة إذا أردت احتراف برمجة ووردبريس فليكن هذا مصدرك الأول. يحتوي على توثيق للدوال والأصناف والخطافات التي يوفرها ووردبريس كما يحتوي على بعض المصادر والمراجع بل وحتى على كُتب للمطورين. 2- القسم الخاص بووردبريس في موقع StackExchangeفي كثير من الأحيان تقابلك بعض المشاكل التي قد لا تجد لها إجابة في المصادر المعروفة وعندها ربما تحتاج الى طرح هذه المشكلة على المختصين وهذا الموقع من أنسب المواقع لطرح الأسئلة المتعلقة بووردبريس. 3- مجموعة Advanced WordPress على فيس بوكنعم هذه مجموعة على فيس بوك لكنها مختلفة نوعا ما فهي تجمع مجموعة كبيرة من محترفي ووردبريس ومطوري بعض الإضافات الشهيرة مثل Joost de Valk مطور إضافة WordPress SEO by Yoast المشهورة. 4- رابطة مطوري ووردبريس (باللغة العربية)على غرار المجموعة السابقة هذه مجموعة أخرى تجمع عدد كبير من مستخدمي ومطوري ووردبريس العرب، بالتالي هي مكان جيد لتبادل الأفكار والآراء وحتى الأسئلة. 5- موقع ManageWP.orgهذا الموقع يبقيك على إطلاع دائم على آخر المقالات المتعلقة بووردبريس من مختلف المواقع، حيث يمكن للأعضاء مشاركة المواضيع المتعلقة بووردبريس وتقييمها، لذلك يستحسن أن يكون هذا الموقع في مفضلتك للعودة إليه بصورة يومية. 6- موقع wpsnippمجموعة من الشيفرات الجاهزة لعمل أشياء مختلفة ربما تفيدك. 7- موقع WP-Snippetsشبيه بالموقع السابق.
-
كما ذكرنا في الدرس السابق (مدخل إلى برمجة إضافات ووردبريس) من هذه السلسلة فإن الخطّافات تعد من أهم الخصائص التي يوفرها ووردبريس والتي جعلته مرنًا flexible وقابل للتمدد extensible بصورة قل أن تجد لها نظيرًا في برمجيات الويب حيث يعتمد على توفير نقاط ربط تمكن المطورين من تنفيذ الدّوال التي يريدونها أثناء دورة حياة ووردبريس، وذلك باعتماده على معمارية Event Driven. يوفر ووردبريس للمطورين الاستفادة من هذه الميزة من خلال ما يعرف بالواجهة البرمجية للإضافة Plugin API والتي نحن بصدد الإطلاع على أهم الدّوال التي توفرها في جانبي الإجراءات Actions والمُرشّحات Filters وبعض الأمثلة التوضيحية التي ترسخ فهم هذه الدّوال والمفاهيم المتعلقة بها. الإجراءات في ووردبريسالدالة add_actionذكرنا سابقًا أنه يمكنك إضافة إجراء لحدث معين من خلال الدالة add_action لكننا لم نذكر الصّيغة العامة للدالة وتفاصيل المعاملات التي تقبلها، وهذه هي الصّيغة العامة للدّالة: add_action( $hook, $function_to_add, $priority, $accepted_args );حيث: $hook : هو الحدث الذي تريد أن تربط به الدالة الخاصة بك، أي الحدث التي تريد أن تنفذ دالتك عند حدوثه. ويمكنك الإطلاع على الأحداث التي يوفرها ووردبريس من هنا.$function_to_add:اسم الدالة (الإجراء) التي تريد إضافتها للحدث أعلاه. أي التي ستنفذ عند حصول الحدث $hook .$priority (اختياري): هذه هي أولوية تنفيذ الدالة عند هذا الحدث، بمعنى أنه إذا كان هنالك أكثر من دالة تم إضافتها باستخدام الدالة add_action إلى نفس الحدث فإن قيمة هذا المعامل ستحدد أي الدّوال ستنفذ أولا وأيها ثانيا وهكذا. قيمة هذا المعامل يجب أن تكون من النوع int، وقيمته الافتراضية 10 والحدث ذو القيمة الأقل سينفذ أولا، بمعنى أن الدالة التي لديها قيمة 5 ستنفذ قبل الدالة التي لديها 20 وهكذا.$accepted_args (اختياري): عدد المعاملات التي تقبلها الدالة المطلوب تنفيذها $function_to_add، فمثلا الإجراء publish_post يقوم بتمرير معرف المقال الذي تم نشره للدالة المطلوب تنفيذها. وعادة يتم تحديد هذه من قبل الخطاف نفسه.استخدام add_action مع الفئات Classesأحيانًا قد تود استخدام الدالة add_action لإضافة دالة تابعة لفئة أو لكائن Object معين حينئذ ينبغي عليك استخدام add_action كما في المثال التالي: class MyPluginClass { public function __construct() { add_action( 'save_post', array( $this, 'myplugin_save_posts' ) ); } public function myplugin_save_posts() { // do stuff here... } } $mypluginclass = new MyPluginClass(); وتلاحظ أننا استخدمنا اسم الحدث save_post وفي المعامل الثاني أشرنا إلى الدالة من خلال المصفوفة array( $this, 'myplugin_save_posts' )حيث تشير $this إلى الكائن الحالي وmyplugin_save_posts تشير إلى اسم الدالة التي نود إضافتها للحدث. الدالة remove_actionتعُتبر دالة remove_action الدالة العكسية للدالة add_action حيث تقوم بحذف الدالة التي تريدها من الحدث الذي تريده وتأخذ الصّيغة العامة التالية: remove_action( $tag, $function_to_remove, $priority );حيث: $tag : اسم الحدث الذي تم إضافة الدالة إليه$function_to_remove : الدالة التي تود حذفها من الحدث $tag$priority (اختياري): أولوية الدالة التي تريد حذفها والتي تم تعريفها مسبقا عند إضافة الدالة إلى الحدث عن طريق add_actionالدالة has_actionتستخدم دالة has_action لاختبار إذا كانت دالة معينة قد أضيفت إلى حدث معين، والصّيغة العامة لهذه الدالة هي: has_action( $tag, $function_to_check )حيث $tag : الحدث الذي تود معرفة إذا ما كانت الدالة قد أضيفت إليه.$function_to_check : الدالة التي تود معرفة إذا ما كانت أضيفت إلى الحدث $tag أما لا.القيمة المرجعة من الدالة: ترجع هذه الدالة قيمة false إذا كانت الدالة $function_to_check غير مضافة للحدث $tag وترجع أولوية تنفيذها priority إذا كانت مضافة للحدث $tag.الدالة do_actionيستخدم ووردبريس الدّالة do_action لتحديد المكان الذي سينفذ فيه الإجراء، وبالتالي في هذا المكان الذي تتواجد فيه الدالة يقوم بتنفيذ كل الدّوال التي تم إضافتها لهذا الحدث المعين، وتأخذ الصّيغة العامة do_action( $tag, $arg );حيث: $tag : اسم الإجراء الذي تود تنفيذه. وكما أسلفنا فإن هذه الدالة عند مناداتها ستنفذ كل الدّوال التي تم إضافتها لهذا الحدث $tag.$arg (اختياري): المعامل الذي يتم تمريره للدوال المرتبطة بالحدث $tagهذه الدالة في الأساس يستخدمها ووردبريس ليحدد مكان تنفيذ الأحداث التي يوفرها لكن يمكنك أيضا استخدامها لإنشاء أحداث خاصة بك في حالة أردت مثلا أن تتيح للمطورين نقاط معينة داخل إضافتك (أو قالبك) لينفذوا فيها دوالهم الخاصة، وبهذه الطريقة يمكن إنشاء إضافات قابلة لتشتغل عليها إضافات أخرى أو ما يمكن أن نطلق عليه اسم Extensions وهنالك عدة أمثلة لإضافات ناجحة توفر هذه الميزة نذكر منها على سبيل المثال إضافة Bbpress المشهورة وكذلك إضافة Woocommernce حيث أن هاتين الإضافتين تعمل فوقهما عدة إضافات أخرى تزيد من مميزاتهما، وتقريبا معظم إضافات ووردبريس توفر مجموعة من الخطافات hooks للمطورين، لذلك في حالة فكرت في إنشاء إضافة لنشرها في مجتمع ووردبريس من الجيد أن تجعل نظرتك مستقبلية وتوفر بعض الخطافات للمطورين. يحسن التنبيه إلى أن الدالة do_action يمكن أن تستدعى بأكثر من معامل بالصّيغة التالية do_action( $tag, $arg_a, $arg_b, $etc );وكما أسلفنا في تعريف معاملات الدالة add_action تستطيع تحديد المعاملات التي تقبلها الدالة المضافة إلى add_action، ولتحديد القيمة هناك عليك أن ترى عدد المعاملات الموجودة هنا في do_action. أمثلة عملية للخطافات في ووردبريسالتعامل مع ملفات جافاسكربتفي ووردبريس إذا أردت أن تضيف ملف جافاسكربت للموقع فإن أفضل طريقة -غالبًا- هي استخدام الحدث wp_enqueue_scripts والذي تستطيع من خلاله إضافة ملفاتك إلى بقية ملفات جافاسكربت (أو CSS) وتترك لووردبريس مهمة ربطها في ترويسة الموقع وهذا ما تفعله الشيفرات التالية function my_scripts_method() { wp_enqueue_script( 'myscript', // اسم ملف جافاسكربت plugins_url( '/js/newscript.js' , __FILE__ ) // مكان ملف الجافاسكربت ); } add_action( 'wp_enqueue_scripts', 'my_scripts_method' ); لاحظ أننا في السطر الأخير أضفنا الدالة my_scripts_method إلى الحدث wp_enqueue_scripts وبالتالي سيتم تنفيذ هذه الدالة عندما ينادي ووردبريس الإجراء wp_enqueue_scripts، أما الدالة نفسها فقد قمنا بداخلها باستخدام دالة أخرى وهي الدالة wp_enqueue_script والتي تتولى مهمة إضافة السكربت حيث تأخذ اسم السكربت (الذي تريده) ومكانه وتتولى بقية المهمة. إضافة قائمة جانبية Sidebar جديدةهذا المثال متعلق أكثر بالقوالب لكن لا مانع من أن نطلع عليه لتعرف أن مفهوم الأحداث يمتد حتى إلى برمجة القوالب، وفي هذا المثال سنقوم بإضافة قائمة جانبية Sidebar جديدة للقالب من خلال الشيفرات التالية function create_my_widget() { register_sidebar(array( 'name' => __( 'My Sidebar'), // اسم القائمة الجانبية 'id' => 'my_sidebar', // معرف القائمة الجانبية )); } add_action( 'widgets_init', 'create_my_widget' );لاحظ أننا في السطر الأخير أضفنا الدالة create_my_widget إلى الحدث widget_init والذي يستخدمه ووردبريس لتعريف جميع القوائم الجانبية، وداخل الدالة قمتا باستخدام دالة أخرى وهي الدالة register_sidebar والتي تأخذ اسم القائمة الجانبية ومعرفها الفريد وتتولى مهمة تسجيلها. إنشاء خطاف إجراء action hook خاص بكلعمل ذلك كل ما عليك هو إضافة الدالة do_action إلى المكان الذي تود أن تنفذ فيه الدّوال التي تربط بهذا الخطاف وبالطبع ستمرر للدالة do_action الاسم الذي تود أن تسمي به الخطاف، بالصّيغة التالية do_action('my_action_hook');وبالطبع يمكنك إضافة بقية المعاملات التي ذكرناها في تعريف الدالة do_action كلما اقتضت الحاجة. المرشحات في ووردبريسبنفس الطريقة التي اتبعناها في الأحداث أعلاه سنتعرف على أهم الدّوال الخاصة بالمرشحات التي يوفرها ووردبريس الدالة add_filterتستخدم دالة add_filter لإضافة مرشح جديد لأحد المتغيرات وتأخذ الصّيغة العامة: add_filter( $tag, $function_to_add, $priority, $accepted_args );لاحظ أن الدالة شبيهة جدا بالدالة add_action وكذلك المعاملات هي نفسها تقريبا، لكن لا باس من إعادة تعريفها: $tag: اسم خطاف المرشح filter hook الذي تود أن تضيف له الدالة $function_to_add لكي تعدل على قيمة المتغير الذي يمثله الخطاف.$function_to_add: الدالة التي ستتولى عملية التعديل على المتغير الذي يشير اليه الخطاف $tag. وهذه الدالة تقوم بإرجاع القيمة الجديدة للمتغير الذي تستقبله.$priority : أولوية التنفيذ للدوال المضافة لنفس الخطاف، حيث تحدد قيمة هذا المتغير ترتيب تنفيذ الدّوال المرتبطة بهذا المرشح. ويأخذ المتغير $priority قيمة من النوع int.الدّوال التي لها $priority أقل تنفذ أولا، وإذا كان هنالك أكثر من دالة لها نفس قيمة المتغير $priority حينئذ يتم تنفيذها على حسب ترتيب تعريفها.$accepted_args: عدد المعاملات arguments التي تقبلها الدالة $function_to_add. حيث يمكن تعريف أكثر من معامل للخطاف عند تنفيذه من خلال apply_filters كما سنرى في الفقرات القادمة. وعدد المعاملات عادة يتم تحديد من خلال الخطاف نفسه.الدالة remove_filterكما يظهر من اسمها فإن remove_filter الدالة العكسية لـadd_filter وتأخذ الصّيغة التالية remove_filter( $tag, $function_to_remove, $priority );حيث: $tag: اسم خطاف المرشح الذي تود إزالة الدالة عنه.$function_to_remove: اسم الدالة التي تود إزالتها.$priority (اختياري): أولوية الدالة التي تود إزالتها كما تم تعريفها باستخدام add_filterالدالة has_filterتقوم الدّالة has_filter باختبار ما إذا كان هنالك دالة تم إضافتها لخطاف معين، وتأخذ الصّيغة التالية has_filter( $tag, $function_to_check ); حيث: $tag: اسم خطاف المرشح.$function_to_check: اسم الدالة التي تريد التأكد من وجودهاالدالة apply_filtersتقوم دالة apply_filters بتنفيذ الدّوال المرتبطة بالخطاف الذي يمرر لها كمعامل وتأخذ الصّيغة العامة apply_filters( $tag, $value, $var ... ); حيث: $tag : اسم الخطاف المراد تنفيذ الدّوال التي تم إضافتها له من خلال add_filter$value : القيمة الأصلية للمتغير والتي يتم تغيرها من خلال الدّوال المربوطة بالخطاف، أي القيمة التي ترشح من خلال الدّوال.$var (اختياري): متغير إضافي أو أكثر يتم تمريرها إلى الدّوال المرتبطة بالخطاف $tag وكنا قد ذكرنا أنه بالإمكان تحديد عدد المتغيرات التي تستقبلها الدالة المربوطة بالخطاف من خلال المعامل $accepted_args للدالة add_filter حيث تقوم بعد المعاملات هنا وتحديد عددها عند إضافة أي دالة لهذا الخطاف.أمثلة للمرشحات في ووردبريستعديل عدد كلمات المقتطففي هذا المثال سنستخدم الخطاف excerpt_length الذي يوفره ووردبريس للتعديل على قيمة طول نص المقتطف function excerpt_length_example( $words ) { return 15; } add_filter( 'excerpt_length', 'excerpt_length_example' );قمنا بإنشاء دالة ترجع القيمة الجديدة لطول المقتطف (15)، ثم بعد ذلك أضفناها إلى المرشح excerpt_length باستخدام الدالة add_filter إنشاء خطاف مرشح filter hook لأحد متغيراتكفلنفرض أنك تريد أن تتيح للمطورين إمكانية التعديل على نص معين قبل عرضه، يمكن أن توفر لهم خطاف مرشح ليضيفوا له الدّوال التي يودون أن تقوم بعميلة التعديل على النص، وذلك من خلال تعريف المتغير بالصّيغة التالية $text = apply_filters("my_text", $text);بهذه الصورة فإنه سيقوم ووردبريس بتطبيق جميع الدّوال المضافة للخطاف my_text على المتغير $text في الجانب الأيمن من المعادلة قبل إسناده للمتغير في الجانب الأيسر، وهذا هو المطلوب. أسماء الخطافات المتغيرة Variable Hook Namesالخطافات التي اطلعنا عليها أعلاه ليست كل ما يوفره ووردبريس بل هنالك المزيد من المرونة المتاحة من خلال أسماء الخطافات المتغيرة فمثلا لنلقى نظرة على الخطاف publish_post وهو عبارة عن خطاف حدث action hook يوفره ووردبريس ويتم تنفيذ الدّوال المرتبطة به كلما تم نشر publish مقال post وهذا في الحقيقة خطاف جميل جدا يمكنك من تنفيذ أي دالة تريدها عندما يتم نشر أي مقال لكن ماذا إن أردت تنفيذ دالة معينة عند نشر نوع مقالات مخصص ولتكن مثلا منتجات، أي نريد تنفيذ الدالة my_function عندما يتم نشر publish منتج product، هذا الأمر انتبه له المطورون ولذلك قاموا بإضافة هذا الخطاف ذو الاسم العام {$new_status}_{$post->post_type} وكما ترى فإنه يوفر مرونة عالية جدا حيث يمكنك اختيار الحالة التي تريد التنفيذ عنها وأصبح الأمر ليس مقتصرا على النشر فقط publish بل يمكنك مثل تنفيذ شئ معين عند حذف delete مقال أو عموما تغير حالة المقال إلى أي حالة {$new_status}. كما أن الأمر لم يعد مقتصرا على المقالات فقط بل يمكنك تحديد نوع المقال {$post->post_type} وهكذا اصبح الخطاف publish_post حالة خاصة من خطاف أعم له الاسم العام {$new_status}_{$post->post_type}. هذا مثال واحد فقط لأسماء الخطافات المتغيرة وهنالك خطافات متغيرة غيره يوفرها ووردبريس لإتاحة المزيد من المرونة للمطورين. خاتمةرغم أننا أردنا أن نلقي نظرة شاملة على الخطافات لكن ما زال هنالك المزيد لاكتشافه لكن ما تناولناه يعتبر مغطيا بصورة كبيرة لأهم الأشياء التي تحتاج إليها عند بداية مشوارك مع تطوير إضافات ووردبريس وسنتركك لتكتشف المزيد بنفسك عند التعمق في عالم ووردبريس.
-
بعد أن تطرّقنا إلى أساسيات تطوير إضافات ووردبريس حان الوقت لنقوم بإنشاء إضافة لتطبيق بعض ما تعلمناه. وهذا ما سنقوم به في هذا الدرس والدرس الذي يليه من خلال إنشاء إضافة تقوم بإضافة مربع جانبي لعرض المقالات الأكثر مشاهدة في موقع ووردبريس مع إمكانية عرض عدد المشاهدات في كل مقالة. التخطيط للإضافةلنبدأ بتحديد الأمور التي ستقوم بها الإضافة: إحصاء عدد المشاهدات لكل مقال.توفير شيفرة مختصرة Shortcode لعرض عدد مشاهدات المقال في أي مكان.توفير ودجت Widget لعرض المقالات الأكثر مشاهدة.وذلك من خلال: الاستفادة من البيانات الإضافية للمقال Post Meta لإضافة حقل بيانات جديد للمقالات يستخدم في حفظ واسترجاع عدد المشاهدات.الاستفادة من Shortcode API التي يوفرها ووردبريس لإنشاء الشيفرة المختصرة.الاستفادة من Widget API التي يوفرها ووردبريس لإنشاء الودجت واستخدام صنف WP_Query للحصول على المقالات مرتبة على حسب عدد المشاهدات.برمجة الإضافةدعنا في البداية نقوم بالتخطيط لجميع الملفات والمجلدات التي سنقوم بإنشائها لبرمجة الإضافة. تركيبة الملفات والمجلداتلنبدأ أولا بإنشاء مجلد للإضافة يحمل الإسم: ha-views-widget وأظن أنه اختصار جيد لاسم الإضافة واستخدامنا في البداية الحرفين ha كاختصار ل Hsoub Academy :). وبالطبع سنضع هذا المجلد في مجلد إضافات ووردبريس (ونحن نفترض أنك قمت بتنصيب ووردبريس مسبقا) والموجود في المسار wp-content/plugins. بعد ذلك سنقوم بإنشاء ملف php بنفس اسم المجلد وهو ha-views-widget.php وهذا الملف هو الملف الأساسي للإضافة وسيحتوي على الترويسة التي بها معلومات الإضافة والتي تعرفنا عليه في الدرس الأول من هذه السلسلة وبالتالي سيحتوي على هذه الترويسة: /** * Plugin Name: Hsoub Views Widget * Plugin URI: http://academy.hsoub.com/ * Description: إضافة صغيرة تقوم بإضافة مربع جانبي لعرض المقالات الأكثر مشاهدة في موقع ووردبريس مع إمكانية عرض عدد المشاهدات في كل مقالة. * Version: 1.4.0 * Author: Adil Elsaeed * Author URI: http://adilelsaeed.com * Text Domain: ha-widgets * Domain Path: /lang/ * License: GPL2 */بالطبع يمكننا أن نكتب جميع شيفرات php الخاصة بالإضافة في هذا المجلد لكن هذه ليست فكرة جيدة خصوصا إذا أردنا إنشاء إضافة سهلة التطوير والمراجعة، لذلك سنخصص ملفًا لإنشاء ومتابعة عدد المشاهدات وليكن باسم views.php وملف آخر لإنشاء الودجت وليكن باسم widget.php (لاحظ أنه داخل مجلد الإضافة يمكنك تسمية الملفات بأي اسم بدون خوف من التعارض مع ملفات ووردبريس الأخرى)، كما أننا سنحتاج لملف آخر لإنشاء الشيفرة المختصرة وليكن باسم shortcode.php ويمكننا أن نضع هذه الملفات الثلاثة داخل مجلد باسم includes للمحافظة على المجلد الرئيسي للإضافة مرتبًا. وبالطبع ما دمنا سنكتب بعض شيفرات html فإننا سنحتاج لتنسيقها من خلال CSS وهذا يعني أننا نحتاج لملف لوضع شيفرات CSS هذه، لذلك سنقوم بإنشاء مجلد أخر باسم css وبداخله ملف widget.css. هذه كل الملفات والمجلدات التي سنحتاج إليها في هذه النسخة الأولى من الإضافة. الملف الأساسي للإضافةفي الملف الأساسي للإضافة سنقوم أولا بتعريف بعض الثوابت التي سنحتاج إليها لاحقا، حيث سنحتفظ بكل من مسار الإضافة ورابطها URL وكذلك النسخة الحالية للإضافة كثوابت بالصورة التالية: if ( !defined( 'SDG_PLUGIN_DIR' ) ) { define( 'HA_VIEWS_DIR', plugin_dir_path( __FILE__ ) ); } if ( !defined( 'HA_VIEWS_URL' ) ) { define( 'SDG_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); } if ( !defined( 'HA_VIEWS_VER' ) ) { define( 'SDG_PLUGIN_VER', '1.1.0' ); }لاحظ أننا استخدمنا الدالتين plugin_dir_path و plugin_dir_url اللتين يوفرهما ووردبريس حيث تُرجعان مسار الإضافة ورابطها على التوالي. ثانيا سنقوم بتضمين ملفات php التي أنشأناها سابقا حتى ينفذ ووردبريس الشفرات الموجودة فيها ويتم تضمينها من خلال require_once كالآتي: // الملف المسؤول عن عدد المشاهدات require_once HA_VIEWS_DIR . 'includes/views.php'; // الملف المسؤول عن الويدجت require_once HA_VIEWS_DIR . 'includes/widget.php'; // الملف المسؤول عن الكود المختصر require_once HA_VIEWS_DIR . 'includes/shortcode.php';ثالثا وأخيرًا سنقوم بصف ملف الCSS الخاص بتنسيق الويدجت من خلال استخدام الحدث wp_enqueue_scripts ويمكنك معرفة المزيد حول التعامل مع ملفات CSS في ووردبريس بالإطلاع على مقال صف و تسجيل ملفات CSS في ووردبريس. وهذه هي الطريقة التي سنصف بها ملف widget.css: add_action('wp_enqueue_scripts', 'ha_scripts'); function ha_scripts(){ wp_enqueue_script( 'sdg-admin', HA_VIEWS_URL . 'css/widget.css', array(), HA_VIEWS_VER); }حفظ وتحديث عدد المشاهداتلننتقل الآن إلى ملف views.php حيث سنقوم بإضافة عداد المشاهدات لكل مقال من خلال بيانات الميتا الخاصة بالمقال post meta حيث سنقوم بإنشاء الدالة ha_set_post_views والتي تقوم بتحديث عدد المشاهدات للمقال عند زيارته ولنضمن تنفيذها عند كل مقال سنقوم بإضافتها للحدث wp_head والذي يتم تنفيذه في ترويسة Header كل صفحات الموقع. ويتم إضافة الدالة إلى هذا الحدث بالصورة التالية: add_action('wp_head', 'ha_set_post_views');أما بالنسبة للدالة نفسها فهذه هي صورتها: function ha_set_post_views() { // إذا لم يكن هذا مقال مفرد (صفحة أو مقال) لا تنفذ أي شيء if(!is_singular()){ return; } // الوصول إلى بيانات المقال الحالي global $post; $post_id = $post->ID; $count_key = 'ha_post_views_count'; // استرجاع العدد الحالي للمشاهدات $count = get_post_meta($post_id, $count_key, true); if($count==''){ // هذا يعني أنه لم يتم إنشاء الميتا الخاص بحفظ عدد المشاهدات حتى الان $count = 0; delete_post_meta($post_id, $count_key); add_post_meta($post_id, $count_key, '0'); // إنشاء الميتا الخاص بحفظ عدد المشاهدات }else{ // زيادة عدد المشاهدات بمقدار مشاهدة واحدة $count++; // حفظ الميتا التي حفظنا فيه عدد المشاهدات update_post_meta($post_id, $count_key, $count); } }لعل التعليقات تشرح الدالة بصورة واضحة لكن دعنا نوضح الأمور أكثر، قمنا في هذه الدالة أولا باستخدام الدالة is_singular والتي تتحقق إن كان المعروض حاليا صفحة مقال مفرد (مقال، صفحة، مقال مخصص) أم لا (صفحة تصنيف مثلا أو أرشيف أو غيرهما) وفي حالة لم يكن المقال مفردًا يتوقف تنفيذ الدالة لأن مهمتها تحديث عدد المشاهدات للمقالات والصفحات والمقالات المخصصة فقط وليس بقية صفحات الموقع (الأرشيفات أو التصنيفات أو غيرها). ثانيا قمنا باستخدام المتغير العام (global) الذي يوفره ووردبريس وهو post$ والذي يحفظ فيه بيانات المقال الحالي (الذي يتم عرضه) حتى نحصل على معرف المقال الحالي من أجل استخدامه في تحديث عدد مشاهداته. ثالثا قمنا باستخدام الدوال update_post_meta، get_post_meta، add_post_meta و delete_post_meta والتي تمكننا من إضافة ميتا مخصصة للمقال واسترجاعها وحذفها وتحديثها على التوالي. وكما تلاحظ قمنا بالتأكد من أن عدد المشاهدات لا يساوي قيمة خالية (غير موجود) وفي حالة أنه غير موجود يتم إنشاؤه وفي حالة أنه موجود يتم زيادته بمقدار واحد وهذه كل مهمة الدالة. استرجاع عدد المشاهداتفي هذا الملف أيضا (أعني ملف view.php) سنقوم بإنشاء دالة أخرى تقوم باسترجاع عدد المشاهدات للمقال الحالي حتى نستخدمها لاحقا في الشيفرة المختصرة shortcode، وهذه هي الدالة: function ha_get_post_views(){ // الوصول إلى بيانات المقال الحالي global $post; $post_id = $post->ID; $count_key = 'ha_post_views_count'; $count = get_post_meta($post_id, $count_key, true); if($count==''){ delete_post_meta($post_id, $count_key); add_post_meta($post_id, $count_key, '0'); return "0 مشاهدة"; } return $count.' مشاهدة'; }ليس هنالك الكثير مما يحتاج إلى شرح فقط قمنا باستخدام الدالة get_post_meta لاسترجاع قيمة الميتا ha_post_views_count وإعادتها في حالة كانت القيمة غير خالية وإعادة صفر في حالة كانت القيمة خالية وفي هذه الحالة تقوم أيضا بإضافة الميتا. برمجة الشيفرة المختصرة shortcodeفي هذه الجزئية سنعتمد على الواجهة البرمجية التي يوفرها ووردبريس حيث سنستخدم الدالة add_shortcode والتي لها الصورة التالية: <?php add_shortcode( $tag , $func ); ?>حيث: tag$ هو اسم الشيفرة المختصرة التي سيستخدمها المستخدم في حالتنا هذه سنسميها ha_views وسيقوم المستخدم بإستدعائها بالصورة التالية [ha_views] في المقال أو الصفحة. func$ هي الدالة المسؤولة عن إرجاع محتويات الشيفرة المختصرة أي ما تقوم به الشيفرة المختصرة وفي حالتنا هذه الدالة عبارة عن دالة ترجع عدد المشاهدات للمقال الحالي وهذه هي الشيفرة النهائية في ملف shortcode.php function ha_views_shortcode( $atts ){ return ha_get_post_views(); } add_shortcode( 'ha_views', 'ha_views_shortcode' );لاحظ أن الدالة ha_views_shortcode تقوم فقط بإرجاع القيمة المرجعة من الدالة ha_get_post_views والتي عرفناها مسبقا في ملف views.php والتي بدورها ترجع عدد المشاهدات للمقال الحالي. ولن نتطرق إلى شرح المزيد من التفاصيل حول الدالة add_shortcode تجنبا للإطالة وربما نخصص لها مقالا مفردا بعد نهاية هذه السلسلة إن شاء الله. سنكتفي بهذا القدر في هذا الدرس وفي الدرس الأخير من هذه السلسة سنكمل –إن شاء الله- برمجة الإضافة (حيث تبقى فقط برمجة الويدجت الذي يعرض أكثر المقالات مشاهدة)، كما سنلقي بعض الضوء على مجموعة من الأدوات والمواقع المفيدة لمطوري إضافات ووردبريس.
-
من أهم الأمور التي ينبغي على مطور ووردبريس الإلمام بها ومعرفتها هي قاعدة بيانات ووردبريس حيث أنها المستودع الرئيسي للبيانات في نظام إدارة المحتوى كما أنها تعكس التركيبة الخاصة بووردبريس وأهم محتوياته الأساسية وطريقة تمديده بصورة مثالية ويظهر هذا جليًَا عند اطلاعنا على جداول meta في الفقرات القادمة. في هذا المقال سنحاول تقديم نبذة عن جداول قاعدة بيانات ووردبريس ودور كل جدول بالإضافة لأهم محتوياته وارتباطه بالجداول الأخرى، بالإضافة إلى ذكر بعض الطرق التي يوفرها ووردبريس للتعامل مع البيانات. جداول قاعدة بيانات ووردبريس انقر على الصورة لمُشاهدتها بحجمها الكامل هذا التفصيل الذي سنذكره قد لا تجده حتى في التّوثيق الرّسمي لووردبريس وبالتالي سيكون مرجعًا مُفيدًا لمن أراد دراسة قاعدة البيانات بتعمّق. جدول wp_optionsتطرقنا من قبل لهذا الجدول في مقال استقبال وحفظ الخيارات حيث ذكرنا أنّ ووردبريس يستخدمه لحفظ الخيارات الخاصة به وكذلك يتيح لك حفظ خيارات القوالب أو الإضافات التي تبرمجها فيه من خلال توفير الواجهة البرمجية للإعدادات والتي أسهبنا في الكلام عنها في المقال آنف الذّكر. يحتوي هذا الجدول على أربعة أعمدة وهي option_id، option_name, option_value, autoload وهي نفس المعاملات التي تقوم بتمريرها للدّالة add_options التي تكلّمنا عنها سابقا. لا يرتبط هذا الجدول بصورة مباشرة بأيّ من الجداول الأخرى في قاعدة البيانات. جدول wp_usersكما هو واضح من اسمه خاص بحفظ بيانات المستخدمين لموقع ووردبريس بجميع رتبهم سواء تعلّق الأمر بالمدير admin أو بغيره من الرّتب. هذا الجدول مكون من عشرة أعمدة وهي: ID: وهو المعرف الخاص بالمستخدم، ويجب أن يكون فريدًا وهو المفتاح الرئيسي للجدول Primary key. user_login: اسم المستخدم أو اسم الدخول. user_pass: كلمة مرور المستخدم وتحفظ مشفرة في قاعدة البيانات. user_nicename: الاسم اللطيف للمستخدم. user_email: البريد الإلكتروني للمستخدم. user_url: الموقع الإلكتروني للمستخدم. user_registered: تاريخ تسجيل المستخدم. user_activation_key: المفتاح المستخدم عند استعادة كلمة المرور، يقوم ووردبريس بتوليده عند طلب استعادة المرور ويقوم بمسحه بعد استعماله مباشرة. user_status: تم التخلي عن هذا العمود deprecated وربما يتم إسقاطه في النسخ القادمة من ووردبريس. display_name: اسم العرض للمستخدم والذي يظهر في واجهة الموقع. جدول المستخدمين مرتبط بعدة جداول في قاعدة بيانات ووردبريس حيث يرتبط بجدول المقالات لأن كل مقال يكون منسوبًا لكاتب (مستخدم) معين، وكذلك مرتبط بجدول التّعليقات لنسبة كل تعليق لكاتبه إن كان من المُسجًّلين في الموقع، وأخيرًا يرتبط بجدول wp_usermeta وهو الجدول التالي في شرحنا. جدول wp_usermetaكما رأينا فإن جدول المستخدمين مكون من أعمدة مُحدّدة بالتّالي عندما تحتاج لإضافة بيانات معينة للمستخدم مثل روابطه في الشبكات الاجتماعية مثلًا ستضطر إلى إضافة المزيد من الأعمدة في جدول المستخدمين لكن هذه الطريقة غير عملية لذلك يأتي جدول wp_usermeta ليُمكّنك من إضافة المزيد من البيانات meta للمستخدمين بدون التعديل على تركيبة الجداول (الأعمدة) وبإضافة المزيد من الصفوف لهذا الجدول. يحتوي هذا الجدول على أربعة أعمدة وهي umeta_id: وهو المعرف الخاص بهذه الـmeta التي تريد إضافتها وهو فريد حيث أنه المفتاح الرئيسي لهذا الجدول. user_id: معرف المستخدم الذي تعود له هذه البيانات meta وهو عبارة عن مفتاح أجنبي foreign key يعود إلى جدول wp_user وبهذه الطريقة يتم الربط بين الجدولين كما هو معلوم في قاعدة البيانات العلائقية Relational Database. meta_key: مفتاح البيانات meta (اسمها) والذي يتم استدعاؤها به برمجيًّا حيث أن لكل meta مفتاح وقيمة كما هو في الخيارات. meta_value: قيمة البيانات meta. هذه الطريقة المستخدمة في إضافة المزيد للبيانات للمستخدمين بدون التعديل على جدول wp_user وذلك من خلال إتاحة جدول wp_usermeta مستخدمة أيضا مع المقالات post والتعليقات comment حيث يستخدم جداول غير الجداول الأساسية لإضافة بيانات غير البيانات الأساسية لكل من المقالات والتعليقات كما سنرى في الفقرات التالية، ولعل الفكرة العامة لهذه الطريقة وضحت من خلال الجدول الأساسي wp_user وجدوله المساعد wp_usermeta. جدول wp_postsيمكن أن نعتبر هذا الجدول هو الجدول الأساسي في ووردبريس حيث أنه الرّكيزة الأساسية لأنواع المقالات والتي يمكن أن نعتبرها المحتويات في نظام إدارة المحتوى، أي أنها العنصر الأساسي الذي تم من أجله إنشاء النظام. تجدر الإشارة أن هذه الجدول ليس مُختصًّا بالمقالات فقط بل بكل أنواع المقالات والتي تشمل الصفحات أيضا وأي نوع مقالات أخر يتم إنشاؤه، وإن كنت لم تتطلع من قبل على أنواع المقالات المخصصة فأشير إليك بقراءة هذا المقال المختصر عن أنواع المقالات المُخصّصة في ووردبريس. يحتوي هذا الجدول على ثلاثة وعشرين عمودًا وإليك تفاصيلها ID: معرف فريد للمقال. post_author: كاتب المقال. post_date: تاريخ المقال. post_date_gmt: تاريخ المقال بتوقيت جرينتش. post_content: محتويات المقال (النّصّ الفعلي للمقال). post_title: عنوان المقال. post_excerpt: مُقتطف المقال (نصّ اختياري يمكن للمستخدم أن يدخله). post_status: حالة المقال (منشور، مسودة، تحت المراجعة، ... الخ). comment_status: حالة التّعليقات (هل التعليقات مفتوحة أم مغلقة). ping_status: حالة التّنبيه (هل التنبيهات مفعلة أم لا). post_password: كلمة مرور للمقال (في حالة كان مغلقا بكلمة مرور). post_name: رابط المقال أو ما يسمى بالاسم اللطيف. to_ping: روابط المقالات التي سيتم تنبيهها (أي المشار لها في المقال الحالي) وهذه لي حالة أن المقال لم ينشر بعد. pinged: روابط المقالات التي تم تنبيهها وهذه في حالة أن المقال قد تم نشره. post_modified: تاريخ آخر تعديل للمقال. post_modified_gmt: تاريخ آخر تعديل للمقال بتوقيت جرينتش. post_content_filtered: تستخدم لتخزين نسخة cache لـpost_content المشار لها سابقا (عادة بعد تطبيق الخطافات المرتبطة بالمُرشح the_content عليها). post_parent: معرف المقال الأب لهذا المقال (في حالة كان نوع المقالات هرمي hierarchical مثل الصّفحات. guid: اختصار لـGlobal Unique Identifier وهي عبارة عن الرابط الحقيقي للمقال. في حالة الصفحات يكون هذا هو الرابط الفعلي إمّا في حالة الملفّات المرفقة attachments يكون هذا هو الرابط للملف المرفق. menu_order: قيمة عددية (0، 1، 2، ...) تُحدّد ترتيب المقال وتعمل مع أنواع المقالات الهرمية مثل الصفحات وليس المقالات العادية. post_type: نوع المقال (مقال، صفحة، منتج، ملف مرفق، ..الخ). post_mime_type: تعمل فقط مع الملفات المرفقة attachments حيث تحتوي على نوع الميديا للملف MIME type. comment_count: عدد التعليقات مضاف إليه عدد التنبيهات pings والتعقيبات trackbacks. يرتبط جدول المقالات wp_posts مع مجموعة من الجداول وهي جدول wp_user: كما تم الإشارة إلى هذا الأمر سابقا حيث أن لكل مقال كاتب. جدول التعليقات wp_comments وهذا واضح ليربط كل مقال بالتّعليقات عليه. جدول wp_term_relationships وسيتم شرح هذا في الفقرات القادمة. جدول wp_postmeta: وهو الجدول التّالي في شرحنا جدول wp_postmetaكما هو الأمر بالنسبة للمستخدمين قد تحتاج لإضافة المزيد من البيانات للمقال غير البيانات الأساسية الموجودة في جدول المقالات wp_post فمثلا إذا كان لديك نوع مقالات يُسمّى منتجات قد تحتاج لإضافة بيانات إضافية لكل منتج مثل السّعر والكمّيّة المُتوفّرة وغيرها من البيانات وكما هو الحال بالنسبة للمستخدمين يتم استخدام جدول إضافي وهو جدول wp_postmeta لإضافة مثل هذه البيانات وربطها بالمقال المعين. يتكون هذا الجدول من أربعة حقول وهي meta_id: وهو المعرف الخاص بهذه الـmeta التي تريد إضافتها وهو فريد حيث أنه المفتاح الرئيسي لهذا الجدول. post_id: معرف المقال الذي تعود له هذه البيانات meta وهو عبارة عن مفتاح أجنبي foreign key يعود إلى جدول wp_post وبهذه الطريقة يتم الربط بين الجدولين. meta_key: مفتاح البيانات meta (اسمها) والذي يتم استدعاؤها به برمجيًّا حيث أن لكل meta مفتاح وقيمة كما هو في جدول wp_usermeta. meta_value: قيمة البيانات meta. يرتبط هذا الجدول بجدول المقالات wp_posts فقط. جدول wp_commentsوكما هو واضح من الاسم هذا هو الجدول الذي يتم فيه حفظ التعليقات، وله مجموعة من الحقول لن نتطرق لها الآن حتى لا نطيل الشرح كما أنه يمكنك الاطلاع عليها في الصورة أعلاه. يرتبط هذا الجدول بجدول المستخدمين wp_users إذا كان التعليق من مستخدم مسجل في الموقع، كما يرتبط بالطّبع بجدول المقالات حيث أن التعليق يعود لمقال معين حيث يكون معرف المقال ID هو المفتاح الأجنبي والذي يقوم بعميلة الربط. أيضا يرتبط هذا الجدول بجدول wp_commentmeta وهو الجدول التالي في الشرح. جدول wp_commentmetaومثل هذا الجدول والعلاقة التي تربطه بجدول wp_commetnts هو مثل العلاقة بين كل من wp_posts و wp_postmeta وكذلك wp_users و wp_usermeta. وأظن أن الصورة قد أصبحت واضحة بالنسبة لهذه الطريقة التي يستخدمها ووردبريس في الربط بين البيانات. جدول wp_linksيستخدم لحفظ البيانات المتعلقة بميزة الروابط links والتي أصبحت ملغية deprecated ورغم أنه يمكنك إعادة تفعيلها من خلال إضافة Link Manager إلا أننا لن نتطرق لشرح هذا الجدول (حتى الإضافة لم تحدث منذ أكثر من عامين). جدول wp_term_taxonomyهذا الجدول يُعرّف العلاقة بين ما يسمى بالفئات أو الأنواع Taxonomies والـterms الموجودة في الموقع. كل نوع Taxonomy عبارة عن طريقة لتنصيف المقالات وفق شيء معين، مثلا يأتي ووردبريس بعدة أنواع افتراضية منها التصنيفات والوسوم وهما للمقالات، لكن يمكنك إضافة المزيد من الأنواع لأي نوع من أنواع المقالات طالما أنه يدعمها. كل واحد من الأنواع (الوسوم مثلا) يحتوي على عدد من الـterms وهي عبارة عن الوسوم نفسها وكل وسم يحتوي على عدة مقالات أو يمكن أن نقول أن كل مقال له عدة وسوم وكذلك عدة تصنيفات وهكذا يكون المقال له عدد من الـterms. إذن يمكن أن نعتبر أن كل نوع Taxonomy عبارة عن أب أو طريقة لتجميع عدد من الـterms أو أن كل term يتبع لنوع معين. الصورة التالية توضح مفهومي الأنواع Taxonomies وكذلك الـTerms والعلاقة بينهما انقر على الصورة لمُشاهدتها بحجمها الكامل هذا الجدول يحتوي على ستة أعمدة وهي term_taxonomy_id: معرف العلاقة بين النوع Taxonomy والـterm. term_id: معرف الـterm (مثلا 1 أو 7). taxonomy: اسم النوع الذي يتبع له هذا الـterm (مثلا تصنيفات أو وسوم). description: وصف للعلاقة. parent: الأب لهذا الـterm. count: عدد المقالات في هذا الـterm. هذا الجدول يرتبط بجدولي wp_term_relationships وwp_terms التّاليين. جدول wp_termsهذا الجدول يعرف فيه الـterms (مثلا التصنيفات أو الوسوم) الموجودة في الموقع ويرتبط بالجدول السابق ليربط كل term مع النوع taxonomy الخاص به. يتكون هذا الجدول من أربعة عمدة هي term_id: معرف الـterm وهذا هو المفتاح الأساسي لهذا الجدول. name: اسم الـterm. slug: الاسم اللطيف للterm. term_group: هذا العمود مضاف لإضافة خاصية تسمح بوجود عدة مسميات لنفس الـterm لكن يبدو أن هذه الخاصية لم تدعم حتى الآن في ووردبريس، وهذا وفقا لأحدى الإجابات على موقع Stack Exchange . جدول wp_term_relationshipsلاحظ أنّه في الجدولين السّابقين كان التركيز على كل من الـterms والأنواع والعلاقة بينهما لكن حتى الآن ليس هنالك ربط فعلي بين التصنيفات والمقالات وعموما بين الـterms والمقالات، وهذه مهمة هذا الجدول حيث يربط المقالات مع معرف جدول wp_term_taxonomy والذي كما ذكرنا يعرف العلاقة بين الأنواع والـterm التابعة لها. يتكون هذا الجدول من أربعة أعمدة هي object_id: وهو معرف المقال الذي يراد ربطه بالـterm الخاص به وهذا هو المفتاح الأساسي لهذا الجدول. term_taxonomy_id: وهو عبارة عن مفتاح أجنبي عبارة عن المفتاح الأساسي في جدول wp_term_taxonomy. term_order: ترتيب الـterm. هذا الجدول بالطّبع يرتبط مع جدولي wp_posts وكذلك جدول wp_term_taxonomy وأيضا يرتبط مع جدول wp_links الذي ذكرنا أنه أصبح deprecated. التعامل مع قاعدة بيانات ووردبريسبالطبع يمكنك استخدام دوال my_sqli الأساسية المتاحة مع لغة php للتّواصل مع قاعدة البيانات أو حتى استخدام فئة PDO لكن يفضل دوما استخدام الطرق التي يقدمها ووردبريس ما دام ذلك مُمكنًا للحصول على توافقية أكبر للإضافة مع بقية مكونات ووردبريس بالإضافة للاستفادة من الفئات والتسهيلات التي يوفرها ووردبريس، وإليك طريقتين يُوفرهما ووردبريس للتعامل مع قاعدة بياناته: 1- استخدام الحلقة The Loopهذا المصطلح في ووردبريس يرمز لأحد أهم المكونات في ووردبريس والتي تستخدم بكثرة في تطوير قوالب ووردبريس، وهي ببساطة طريقة لجلب المقالات (أو أنواع المقالات المخصصة) وعرضها في القالب أو الإضافة وهذه هي الصورة العامة للحلقة <?php if ( have_posts() ) : // التحقق من وجود المقالات ?> <?php /* بدء الحلقة */ ?> <?php while ( have_posts() ) : the_post(); // تجهيز بيانات المقال ?> // هنا يتم استخدام وسوم القالب لجلب البيانات المتعلقة بالمقال الحالي // لاحظ أن ما بداخل الحلقة يتكرر في كل مرة حتى يصل إلى عدم تحقق الشرط في السطر الأول <?php endwhile; ?> <?php endif; ?>داخل الحلقة يتم استخدام بعض الدّوال التي يوفرها ووردبريس والتي تسمى بوسوم القالب Template Tags وهي عبارة عن دوال جاهزة تستخدم لجلب بيانات المقال والبيانات المرتبطة به مثل اسم الكاتب وتصنيفات المقال وغيرها من المحتويات. إذن استخدام الحلقة يوفر لنا إمكانية استخدام مجموعة كبيرة جدا من الدّوال الجاهزة التي توفر كثيرا من الجهد والوقت. يمكن أن نقول أن هنالك نوعان من الحلقات، الأولى هي الحلقة الأساسية التي مثلنا لها أعلاه والثانية يمكن إنشاؤها عن طريق إنشاء كائن Object من الفئة WP_Query بالصورة التالية: <?php $args = array(); // هنا يتم تعريف المعاملات التي ستمرر في الأسفل ?> <?php $query = new WP_Query($args); // تعريف الكائن الذي سيستخدم لجلب المقالات في الحلقة ?> <?php if ( $query->have_posts() ) : // التّحقق من وجود المقالات ?> <?php /* بدء الحلقة */ ?> <?php while ( $query->have_posts() ) : $query->the_post(); // تجهيز بيانات المقال ?> // ما بداخل الحلقة مشابه للحلقة الأساسية <?php endwhile; ?> <?php endif; ?>عند إنشاء الكائن تقوم بتمرير بعض المعاملات التي تحدد لووردبريس المقالات التي تود جلبها فمثلا قد ترغب بجلب جزئية فقط من المقالات والتي تُحقّق شرطًا مُعيّنًا مثل المقالات التّابعة لتصنيف مُعيّن وهكذا، وهذا أيضا ينطبق على أنواع المقالات المُخصّصة حيث تُمرر نوع المقالات المُخصّصة الذي تود جلبه بالإضافة لبقية المعاملات التي تود تمريرها. بالطبع فإن الحلقة محدودة على جلب البيانات المُتعلّقة بالمقالات وأنواع المقالات المُخصّصة بالتّالي لن تستخدمها إلا عندما تود جلب هذا النوع من البيانات وإلا فستنتقل إلى طريقة أخرى، لكن طالما أنّك تود جلب هذا النوع من البيانات فلا تعدل عن استخدام الحلقة أو على الأقل استخدام الدالة get_posts التي تشبه الحلقة في معاملاتها لكنها ترجع البيانات في شكل مصفوفة. 2- استخدام صنف wpdbهذا الصّنف يحتوي على مجموعة من الدّوال يستخدمها ووردبريس في التعامل مع قاعدة بياناته، ويمكنك الوصول لهذه الدّوال من خلال استخدام الكائن $wbdb وهو عبارة عن global object وهذا مثال لطريقة استخدامه global $wpdb; $results = $wpdb->get_results( 'SELECT * FROM wp_options WHERE option_id = 1', OBJECT );تستطيع من خلال هذا الكائن الوصول إلى مجموعة كبيرة من الدّوال التي يوفّرها الصّنف wpdb، كما تستطيع أيضا الوصول إلى متغيرات هذا الصّنف والتي من ضمنها جداول قاعدة البيانات التي ذكرناها سابقا. هل تفضل استخدام طريقة أخرى إذا كان الأمر كذلك فلا تنس التّحقق الجيد من البيانات قبل إدخالها واسترجاعها من قاعدة البيانات، حتى لا تحتوي الإضافة على ثغرات أمنية تسهل من اختراق الموقع. خاتمةيمكن أن نقول أننا أنهينا الجانب النّظري لبعض أساسيات ووردبريس لمطوري الإضافات، ولم يتبق لنا سوى تقديم مثال عملي لإضافة حقيقية يربط هذه المفاهيم التي تعرفنا عليها ويوضّحها بصورة أكبر، وهذا ما سنقدمه في المقال القادم إن شاء الله.
-
كنا قد ذكرنا في الدرس الأول لهذه السلسلة أنّ هناك مجموعة من الطرق يتيحها ووردبريس لحفظ واسترجاع البيانات ومن ضمن هذه الطرق استخدام الواجهة البرمجية للخيارات Options API التي يوفرها ووردبريس وهي الطريقة الأنسب لحفظ الخيارات العامة للإضافة في كثير من الأحيان. في هذا المقال سنلقي الضوء على هذه الطريقة وذلك بتناول أهم الدّوال التي يوفرها ووردبريس في الواجهة البرمجية للخيارات وكذلك طريقة إضافة صفحة إعدادات Settings Page في لوحة التحكم تمكن مستخدم الإضافة من إدخال وتعديل الخيارات الخاصة بالإضافة والتي سنستخدم فيها الواجهة البرمجية للإعدادات Settings API. الواجهة البرمجية للخيارات Options APIتوفر هذه الواجهة البرمجية مجموعة من الدّوال لإنشاء الخيارات وحفظها واسترجاعها حيث تستخدم قاعدة بيانات ووردبريس وبالتحديد جدول wp_options لحفظ البيانات. وإليك نظرة على أهم الدّوال في هذه الواجهة الدالة add_optionكما هو واضح من اسمها تمكننا دالة add_option من إضافة خيار جديد إلى قاعدة البيانات وهذه هي الصورة العامة لها add_option( $option, $value, $deprecated, $autoload ); حيث: $option (مطلوب) : هو عبارة عن اسم الخيار ويجب أن لا يتعدى 64 حرفًا ويُستحسن أن يكون بالإنجليزية ويتم استخدام الشرطة السفلية (_) للفصل بين الكلمات.$value (اختياري): قيمة هذا الخيار وهي القيمة الفعلية التي تود استقبالها من المستخدم واستخدمها فيما بعد (وعموما القيمة التي تود حفظها).$deprecated (اختياري): تم التخلي عن هذا المعامل في النسخة 2.3 من ووردبريس.$autoload (اختياري): هنا تحدد ما إذا أردت أن يتم تضمين الخيار في object cache في كل تحميل للصفحة. وهي متعلقة بما يعرف بالكاش cache.الدالة delete_optiondelete_option عبارة عن الدالة العكسية للدالة السّابقة، حيث تقوم بمسح الخيار من قاعدة البيانات. والصورة العامة لهذه الدالة هي: delete_option( $option ); حيث $option هو اسم الخيار الذي تود مسحه الدّالة get_optionتستخدم الدّالة get_option لاسترجاع الخيارات من قاعدة البيانات وهذه هي الصورة العامة لاستخدامها echo get_option( $option, $default );حيث: $option (مطلوب): اسم الخيار الذي تود استرجاعه$default (اختياري): القيمة الافتراضية للخيار في حالة لم يتم إيجاد قيمته في قاعدة البيانات.لاحظ أننا استخدمنا echo لعرض الخيار لكن يمكنك مثلا استرجاع الخيار وحفظه في أي متغير أو إجراء أي عملية عليه. إذا لم يوجد الخيار المطلوب في قاعدة البيانات ولم يتم تحديد قيمة للمعامل $default يتم إرجاع القيمة FALSE. هنالك مجموعة من الخيارات الخاصة بووردبريس والمحفوظة في جدول الخيارات يمكنك الوصول إليها من خلال الدالة get_option منها على سبيل المثال: admin_email: البريد الإلكتروني لمدير الموقع.blogname: اسم الموقع.siteurl: رابط الموقعوغيرها. الدالة update_optionتستخدم الدالة update_option لتحديث قيمة الخيار في قاعدة البيانات وتأخذ الصورة العامة update_option( $option, $new_value );حيث: $option (مطلوب): اسم الخيار المراد تحديثه.$new_value (مطلوب): القيمة الجديدة للخيار.هذه الدالة تقوم بفحص ما إذا كان الخيار $option موجودًا مُسبقا في قاعدة البيانات وفي حالة عدم وجوده تقوم باستخدام الدالة add_option لإنشائه بالصّورة التالية add_option('option_name', 'option_value')وبالتالي يمكنك استخدامها لاختبار ما إذا كان الخيار موجودًا وإنشائه إن لم يكن موجودًا، لكن لاحظ أنك لن تستطيع تحديد المعامل $autoload عند إنشاء الخيار. ترجع الدالة update_option القيمة TRUE في حالة تم تحديث قيمة الخيار بنجاح وترجع FALSE إذا لم يتم التحديث بنجاح. الواجهة البرمجية للإعدادات Settings APIتُمكّنك هذه الواجهة من عمل الميكانيكية التي تستطيع من خلالها استقبال الخيارات من المستخدم وحفظها في قاعدة البيانات وتعمل سويًّا مع الواجهة البرمجية للخيارات لإنجاز المهمة. هنالك ثلاثة مكونات أساسية للواجهة البرمجية للإعدادات، وهي: الإعدادات: وهي الخيارات الفعلية والتي يتم حفظها في قاعدة البيانات وتستطيع الوصول إليها بعد ذلك عن طريق الدالة get_option التي تم شرحها أعلاه.الحقول Field: وهي حقول النموذج Form الذي يتم عرضه في صفحة الإعدادات والتي تمكن المستخدم من إدخال قيم البيانات.،الأقسام Section: وهي عبارة عن طريقة لتقسيم الإعدادات إلى مجموعات، أي أن كل مجموعة من الحقول يتم جمعها تحت قسم.بعد إنشاء أقسام وحقول الإعدادات التي تريدها (سنرى طريقة عمل ذلك في الفقرات القادمة) عليك أن تقرر ما إذا كنت تريد إضافة هذه الحقول والأقسام إلى: صفحة إعدادات موجودة حاليًا مثل الصفحات الموجودة في القائمة الفرعية للإعدادات في لوحة تحكم ووردبريس (عام، كتابة، قراءة، ..الخ).أو إنشاء صفحة خيارات جديدة وسنرى في الفقرة التالية طريقة إنشائها.إنشاء صفحة خيارات في لوحة تحكم ووردبريسيتم ذلك من خلال استخدام الدالة add_options_page التي لها الصورة العامة add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function);حيث: $page_title (مطلوب): عنوان الصفحة.$menu_title (مطلوب): عنوان القائمة والذي سيظهر في لوحة تحكم ووردبريس.$capability (مطلوب): صلاحيات المستخدم الذي يستطيع التّعديل على هذه الصفحة.$menu_slug (مطلوب): الاسم اللطيف للقائمة (والذي سيظهر في رابط الصفحة).$function (اختياري): الدالة المسؤولة من عرض المحتويات في هذه الصفحة، أي التي سيناديها ووردبريس ويعرض ما تخرجه في هذه الصفحة.يتم مناداة هذه الدالة (بالمعاملات المطلوبة) داخل دالة أخرى مثلا my_plugin_admin وتربط الدالة my_plugin_admin بالخطاف admin_menu وبهذه الطريقة ستظهر الصفحة في لوحة تحكم ووردبريس. إنشاء قسم إعدادات Setting Sectionلإنشاء قسم إعدادات حتى نربط به حقول الإعدادات نقوم باستخدام الدالة add_settings_section والتي لها الصورة العامة: add_settings_section( $id, $title, $callback, $page );حيث: $id (مطلوب): معرف فريد Unique لهذا القسم.$title (مطلوب): عنوان القسم.$callback (مطلوب): الدالة التي ستقوم بعرض محتويات هذا القسم من الحقول والتي عليك إنشاؤها لاحقا. ويجب أن تقوم الدالة بعمل echo لمحتويات القسم.$page (مطلوب): صفحة الخيارات التي سيتم إضافة هذا القسم لها (مثلا التي أنشأناها في الخطوة السابقة) ويجب أن تطابق قيمة هذا المعامل قيمة المعامل $menu_slug.ملاحظة: دالة الـ callback تستقبل معاملًا واحدًا اختياريًّا وهو عبارة عن مصفوفة لها ثلاث عناصر، مثال: add_settings_section( 'myplugin_setting_section', 'مثال لقسم إعدادت للإضافة', 'myplugin_setting_section_callback_function', 'my_plugin_admin_page' ); function myplugin_setting_section_callback_function( $arg ) { // echo section intro text here echo '<p>المعرف: ' . $arg['id'] . '</p>'; // المعرف: myplugin_setting_section echo '<p>العناون: ' . $arg['title'] . '</p>'; // العنوان: مثال لقسم إعدادت للإضافة echo '<p>دالة الcallback: ' . $arg['callback'] . '</p>'; // دالة الcallback: myplugin_setting_section_callback_function }إنشاء حقول الإعدادات Settings Fieldsيتم إنشاء حقول الإعدادات عن طريق الدالة add_settings_field والتي لها الصورة العامة: add_settings_field( $id, $title, $callback, $page, $section, $args );حيث: $id (مطلوب): معرف فريد للحقل.$title (مطلوب): عنوان الحقل.$callback (مطلوب): الدالة المسئولة من عرض الحقل. يتم تمرير معامل واحد لهذه الدالة وهو المصفوفة $args. ويجب على هذه الدالة أن تقوم بعمل echo لمخرجاتها.$page (مطلوب): الصفحة التي سيتم عرض الحقل فيها، ويجب أن يطابق $menu_slug الموجود في الدالة add_options_page.$section (اختياري): قسم الإعدادات الذي يتبع له هذا الحقل.$args (اختياري): معاملات إضافية يتم تمريرها لدالة الـcallback.تسجيل الإعداداتالخطوة التالية هي أن نُعلم ووردبريس بأننا نريد تسجيل إعدادات للإضافة وذلك من خلال استخدام الدالة register_setting والتي لها الصورة العامة: register_setting( $option_group, $option_name, $sanitize_callback );حيث: $option_group (مطلوب): هذا عبارة عن اسم لمجموعة الخيارات ويستخدم فيما بعد عند عرض render محتويات صفحة الإعدادات.$option_name (مطلوب): اسم الخيارات والذي سنستخدمه في الدالة get_option لاسترجاع الخيارات.$sanitize_callback (اختياري): الدالة المسؤولة من عمل sanitizes للخيارات.يجب أن يربط تسجيل الخيارات بالخطاف admin_ini بالصورة التالية function register_my_setting() { register_setting( 'my_options_group', 'my_option_name', 'intval' ); } add_action( 'admin_init', 'register_my_setting' ); مثال متكامل لإنشاء صفحة الخيارات وإضافة الإعدادات لهاadd_action( 'admin_menu', 'my_plugin_menu' ); function my_plugin_menu() { add_options_page( 'عنوان صفحة الإضافة', 'عنوان القائمة', 'manage_options', 'my_plugin_admin_page', 'my_plugin_options_page' ); } // ------------------------------------------------------------------ // أنشاء الحقول والأقسام وتعريف الإعدادات يربط بالخطاف admin_init // ------------------------------------------------------------------ // function myplugin_settings_api_init() { // إضافة قسم الإعدادات لصفحة الخيارات التي عرفناها أعلاه add_settings_section( 'myplugin_setting_section', 'مثال لقسم إعدادات للإضافة', 'myplugin_setting_section_callback_function', 'my_plugin_admin_page' ); // إضافة حقل الخيارات add_settings_field( 'myplugin_setting_name', 'مثال لاسم الحقل', 'myplugin_setting_callback_function', 'my_plugin_admin_page', 'myplugin_setting_section' ); // تسجيل الخيارات حتى يستطيع ووردبريس حفظ الإعدادات لنا register_setting( 'my_plugin_admin_page', 'myplugin_setting_name' ); } // إضافة الدالة أعلاة للخطاف المناسب وهو admin_init add_action( 'admin_init', 'myplugin_settings_api_init' ); // ------------------------------------------------------------------ // دالة الcallback لقسم الإعدادات // ------------------------------------------------------------------ function eg_setting_section_callback_function() { echo '<p>نص في بداية قسم الإعدادات</p>'; } // ------------------------------------------------------------------ // دالة الcallback لحقل الإعدادات // ------------------------------------------------------------------add_options_page // إنشاء مربع إختيار checkboxز بالطبع يمكنك إنشاء أنواع أخرى من الخقول function eg_setting_callback_function() { echo '<input name="myplugin_setting_name" id="myplugin_setting_name" type="checkbox" value="1" class="code" ' . checked( 1, get_option( 'eg_setting_name' ), false ) . ' /> مصال'; } // الدالة المسؤولة عن عرض بيانات صفحة خيارات الإضافة كما عرفناها اعلاه function my_options_page() { ?> <div class="wrap"> <h2>صفحة خيارات الإضافة</h2> <form action="options.php" method="POST"> <?php settings_fields( 'my_plugin_admin_pagep' ); ?> <?php do_settings_sections( 'myplugin_setting_section' ); ?> <?php submit_button(); ?> </form> </div> <?php } في البداية قمنا بإنشاء صفحة الخيارات عن طريق الدالة add_options_page وكما تلاحظ قمنا بوضعها داخل دالة وإضافة الدالة للخطاف المناسب وهو admin_menu. بعد ذلك قمنا بعمل دالة جديدة وبداخلها قمنا بعمل ثلاثة أشياء وهي: إضافة قسم إعدادات عن طريق الدالة add_settings_section، وبالطبع قمنا بتعريف دالة الـcallback الخاصة بهذا القسم والمسؤولة من عرضها وقمنا بإضافتها بعد هذه الدالة. إضافة حقل واحد للإعدادات عن طريق الدالة add_settings_field ومررنا لها اسم دالة الـcallback المسؤولة عن عرض هذا الحقل والتي أضفناها بعد هذه الدالة. تسجيل الإعدادات عن طريق الدالة register_setting لنخبر ووردبريس عن هذه الإعدادات حتى يقوم بعملية حفظ هذه الإعدادات بالنيابة عنا. بعد ذلك قمنا بإضافة هذه الدالة إلى الخطاف المناسب وهو الخطاف admin_init. أخيرًا قمنا بإنشاء الدالة المسؤولة من عرض محتويات صفحة الخيارات وكما تلاحظ استخدمنا فيها الدالة do_settings_sections والتي تضيف أقسام الإعدادات المرتبطة بهذه الصفحة وكذلك الدالة settings_fields المسؤولة عن إخراج ما يعرف ب nonce وهو متعلق بتأمين النموذج form. وأخيرًا قمنا بمناداة الدالة submit_button والتي ستعرض زر الحفظ. استرجاع البياناتلاسترجاع بيانات الإضافة حتى تستخدمها يمكنك استخدام الدالة التي عرفناها سابقا وهي get_option حيث سنمرر لها اسم الخيارات $option_name الذي عرفناه سابقا خلال تسجيل الإعدادات من خلال الدالة register_settings. خاتمةيوفر التعامل مع Setting API و Option API الكثير من المجهود المُتعلّق بحفظ الخيارات واسترجاعها بالصورة التقليدية والتي تتطلب القيام بكل عمليات الاتصال مع قاعدة البيانات والتأكد من تأمين البيانات والتعامل مع نماذج الحفظ وغيرها من العمليات، لكن في البداية قد تجد صعوبة في التعامل مع هاتين الواجهتين خصوصا فيما يتعلق في حفظ أسماء الدوال ومعاملاتها وارتباطها مع بعضها البعض، لكن سيتغيّر الأمر بعد التّعامل معها لفترة قصيرة.