كيف تكتب إضافة لووردبريس؟

إضافات ووردبريس هي نصوص برمجية تستخدم لتغيير طريقة عمل موقعك أو إضافة ميزات إليه. قد يكون التغيير بسيطاً كإظهار أزرار المشاركة على الشبكات الاجتماعية في نهاية كل مقال، أو كبيراً ومعقداً كإضافة أنواع تدوينات جديدة أو إضافة جداول لقاعدة البيانات.

كيف تكتب إضافة لووردبريس؟

إضافة أو قالب؟

قد يسأل سائل: لم لا أستخدم ملف functions.php ضمن قالبي وأضع البنية البرمجية التي تناسبني؟ متى يجب أن أستخدم الإضافات؟ ولماذا قد أرغب بكتابة إضافة منفصلة؟

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

ولا تنس قبل أن تكتب إضافتك أن تبحث عن وظيفة مشابهة في دليل إضافات ووردبريس، فهو يحوي الكثير من الإضافات التي قد تفي بالغرض لتوفر على نفسك الوقت والجهد، مع احترام الحقوق الفكرية لمطوريها.

كيف تكتب إضافتك الأولى؟

لإنشاء إضافة كل ما عليك أن تفعله هو أن تنشئ دليلاً (مجلداً) جديداً تحت wp-content/plugins وليكن اسمه pluginny على سبيل المثال، وضمن هذا الدليل أنشئ ملف PHP بنفس الاسم أي: pluginny.php، وضمن هذا الملف أدرج التعليق التالي:

<?php
/*
Plugin Name: Pluginny
Plugin URI: http://pluginny-website.com
Description: The greatest plugin in the history of mankind
Version: 1.0
Author: Someone
Author URI: http://someone-website.com
License: GPL2
*/
?>

من كل هذه المعلومات، لست بحاجة فعلياً إلا لسطر اسم الإضافة (Plugin Name)، ولكن في حال رغبت بنشر الإضافة فعليك إضافة أكبر قدر ممكن من المعلومات.

بهذا أصبحت الإضافة جاهزة، يمكنك تفعيلها من الإدارة. بالطبع هي لا تفعل شيئاً بعد، لكنها بنظر نظام ووردبريس إضافة متكاملة.

تنظيم ملفات الإضافة

مع ازدياد وظائف الإضافة يزداد النص البرمجي الذي يرافقها، وهنا قد يكون تنظيم الإضافة ضمن عدة ملفات أو حتى مجلدات أفضل لتنظيم العمل. يمكنك أن تتبع الطريقة التي تناسبك، لكن لا بأس من اتباع بعض النصائح.

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

يمكنك أن تطلع على بنية بعض الإضافات الشهيرة مثل WP-PageNavi أو WP Super Cache لتستلهم الطريقة المناسبة لتنظيم ملفاتك.

تسمية الإضافة والمعرفات البرمجية ضمنها

تضم مواقع ووردبريس عادة العديد من الإضافات المختلفة، وبالنظر أيضاً للنواة البرمجية لووردبريس نفسها، نجد أنها تحوي  الكثير من المعرفات البرمجية بأسماء محجوزة مسبقاً من توابع وإجراءات وأصناف وثوابت.

عليك أولاً أن تختار اسماً مميزاً لإضافتك وألا تختار اسماً عاماً، وبعد اختياره حاول البحث عنه ضمن دليل الإضافات كي لا تفاجئ بأن أحداً قد سبقك إليه.

لكي تضمن عدم تضارب معرفاتك مع أي مما تحويه ووردبريس، يفضل أن تستخدم بادئة (Prefix) مع الأسماء لديك، معظم المطورين يستخدمون اسم الإضافة أو الأحرف الأولى منه كبادئة. ففي مثالنا السابق، عوضاً عن أن نسمي أحد التوابع display_output مثلاً، سنسميه pluginny_display_output.

أمان إضافتك

يجب أن تولي هذه الناحية عناية كبيرة، فأنت هنا تعبث بمواقع الآخرين وليس موقعك فقط.

ويعتمد أمان الإضافة على نقطتين أساسيتين. الأولى أن تتأكد أن الإضافة لا تساعد في نشر محتوى ضار، وذلك يتضمن فلترة إدخالات المستخدم لضمان عدم احتوائها على نصوص برمجية أو ما شابه ومعالجة النصوص المدخلة لقاعدة البيانات بما يضمن عدم حصول اختراقات من نوع SQL Injection. النقطة الثانية هي الأمن الإداري، أي يكون المستخدم الذي يقوم بعملية ما يملك الصلاحيات الكافية للقيام بها، كأن لا يقوم مستخدم بحذف البيانات إن لم يكن مدير الموقع.

الأمان موضوع ذو أبعاد كثيرة لا يمكن تغطيتها بمقال واحد، لكن لنا عودة إليه في مواضيع مستقبلية.

تنظيف الموقع من مخلفات إضافتك

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

لمساعدتك في ذلك، تقدم لك ووردبريس ثلاث توابع (hooks) تنفذ عند أحداث مختلفة:

  • register_activation_hook
    ينفذ عند تفعيل الإضافة من الإدارة، ويحتاج لتمرير متحولين هما مسار الملف الأساسي للإضافة واسم التابع الذي يجب تنفيذه. يمكنك استخدامه للتحقق من أن الظروف مناسبة لعمل إضافتك (كالتحقق من إصدار PHP).
  • register_deactivation_hook
    مشابه للسابق لكن ينفذ عند إلغاء تفعيل الإضافة، يفضل استخدام التابع التالي لتنظيف الإضافة بشكل كامل. استخدم هذا التابع للقيام ببعض التحسينات مع الاحتفاظ بالبيانات المضافة في حال تم إعادة تفعيل الإضافة.
  • register_uninstall_hook
    ينفذ عند إزالة الإضافة من إدارة الموقع، وهو الطريقة الأمثل لتنظيف الموقع من بيانات الإضافة التي لم تعد لازمة مثل جداول قاعدة البيانات التي لم تعد تلزم لعمل الموقع أو إعدادات عمل الإضافة. عند التنفيذ يقوم بالمرور على كامل ملف الإضافة وينفذه، وهذا قد يولد مشكلة في حال وجود شيفرة برمجية خارج التوابع، وهنا يمكن إنشاء ملف uninstall.php ليقوم بالمهمة. يرجى مراجعة دليل الاستخدام لمزيد من المعلومات.

في حال وجدت أن مدير الموقع قد لا يرغب بحذف البيانات التي ولدتها إضافتك يمكنك أن تدله على مكان وجودها، مع إعطائه الخيار لحذفها أو إبقائها عند الحذف.

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

التوثيق ومراعاة معايير كتابة النص البرمجي

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

بالإضافة إلى أن التوثيق يساعدك أنت في تذكر ما كنت كتبته سابقاً والغرض منه، فنسيان طريقة حل مشكلة ما أمر شائع جداً.

كما قد يساعدك اتباع معيار معين لكتابة النص البرمجي في تنظيم عملك وزيادة قابلية قراءته. ومنها معيار ووردبريس.

مثال عملي

أفضل طريقة لتثبيت ما تعلمناه هو وضعه قيد التجربة. سنبني إضافة تقوم بحساب شعبية (عدد مرات زيارة) كل موضوع في المدونة وعرض النتائج.

مثالنا سيستخدم توابع خاصة تدعى Hooks، وهي توابع تنفذ عند أحداث خاصة في ووردبريس، ولن نسهب في الحديث عنها هنا لأنها ستغطى في وقت لاحق.

التخطيط

بتحليل بسيط للإضافة نجد أنها تحتاج مبدئياً لأربعة توابع:

  • تابع يسجل كل حالة زيارة لموضوع في المدونة.
  • تابع يجلب عدد مرات الزيارة من قاعدة البيانات.
  • تابع لإظهار عدد مرات الزيارة لزوار الموقع.
  • تابع يجلب المواضيع بناء على عدد زياراتها.

تهيئة الإضافة

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

<?php
/*
Plugin Name: Awesomely Popular
Plugin URI: http://awesomelypopularplugin.com
Description: A plugin that records post views and contains functions to easily list posts by popularity
Version: 1.0
Author: Mr. Awesome
Author URI: http://mayawesomefillyourbelly.com
License: GPL2
*/
?>

تسجيل عدد الزيارات

ذكرنا أن التوابع من نوع Hook تعمل ضمن ووردبريس كأحداث، حيث يتم تسجيل اسم التابع المطلوب استدعاؤه عند الوصول للحدث. لذا فلنكتب التابع في البداية:

/**
* Adds a view to the post being viewed
*
* Finds the current views of a post and adds one to it by updating
* the postmeta. The meta key used is "awepop_views".
*
* @global object $post The post object
* @return integer $new_views The number of views the post has
*
*/
function awepop_add_view() {
    if(is_single()) {
        global $post;
        $current_views = get_post_meta($post->ID, "awepop_views", true);
        if(!isset($current_views) OR empty($current_views) OR !is_numeric($current_views) ) {
            $current_views = 0;
        }
        $new_views = $current_views + 1;
        update_post_meta($post->ID, "awepop_views", $new_views);
        return $new_views;
    }
}

كما ترى، فقد أضفنا في البداية تعليقاً بطريقة phpDocumentor يشرح عمل التابع ثم يصف كلاً من متحولاته.

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

كل هذا منطقي، لكن التابع لم يتم استدعاؤه بعد، وهنا يأتي دور الخطاف (hook). يمكنك بالطبع أن تقوم باستدعاء التابع من ملف القالب، ولكن ذلك يعني أن استدعاء التابع سيتوقف في حال تغيير القالب. يوجد خطاف اسمه wp_head يتواجد عادة قبل إغلاق وسم HEAD في ملفات القوالب وهو ما سنعتمد عليه:

add_action("wp_head", "awepop_add_view");

من المفروض أن يزيل هذا بعض الغموض عن توابع Hooks بالنسبة لك، كل ما هنالك أننا نطلب تنفيذ تابع معين عند الوصول لنقطة معينة من التنفيذ. لا يهم إدراج تنفيذ الخطاف قبل أو بعد تعريف التابع.

جلب عدد الزيارات وعرضه

عند كتابة التابع السابق، قمنا باستخدام get_post_meta لجلب عدد الزيارات، لذا فقد تظهر كتابة تابع منفصل لذلك إسهاباً غير مبرر، لكن ذلك أقرب للبرمجة غرضية التوجه، كما أنه يعطي مرونة أكبر عند تطوير الإضافة.

/**
* Retrieve the number of views for a post
*
* Finds the current views for a post, returning 0 if there are none
*
* @global object $post The post object
* @return integer $current_views The number of views the post has
*
*/
function awepop_get_view_count() {
    global $post;
    $current_views = get_post_meta($post->ID, "awepop_views", true);
    if(!isset($current_views) OR empty($current_views) OR !is_numeric($current_views) ) {
        $current_views = 0;
    }
    return $current_views;
}

يستخدم هذا التابع نفس المنطق الموجود في التابع السابق، لذا يمكنك تعديل التابع السابق ليستخدم هذا التابع، وهنا تظهر فائدة تحديدة مهمة واحدة لكل تابع حيث يمكنك معالجة وتعديل طريقة المعالجة في مكان واحد لتستخدمه حيث يلزم.

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

/**
* Shows the number of views for a post
*
* Finds the current views of a post and displays it together with some optional text
*
* @global object $post The post object
* @uses awepop_get_view_count()
*
* @param string $singular The singular term for the text
* @param string $plural The plural term for the text
* @param string $before Text to place before the counter
*
* @return string $views_text The views display
*
*/
function awepop_show_views($singular = "view", $plural = "views", $before = "This post has: ") {
    global $post;
    $current_views = awepop_get_view_count();

    $views_text = $before . $current_views . " ";

    if ($current_views == 1) {
        $views_text .= $singular;
    }
    else {
        $views_text .= $plural;
    }

    echo $views_text;

}

عرض مجموعة مواضيع بناء على عدد زياراتها

لتنفيذ هذه المهمة، سنكتب تابعاً يمكن استدعاؤه من أي مكان ضمن القالب المستخدم، التابع ينفذ استعلاماً من قاعدة البيانات ويمر على النتائج ليعرضها ضمن قائمة بسيطة من العناوين.

/**
* Displays a list of posts ordered by popularity
*
* Shows a simple list of post titles ordered by their view count
*
* @param integer $post_count The number of posts to show
*
*/
function awepop_popularity_list($post_count = 10) {
    $args = array(
        "posts_per_page" => 10,
        "post_type" => "post",
        "post_status" => "publish",
        "meta_key" => "awepop_views",
        "orderby" => "meta_value_num",
        "order" => "DESC"
    );

    $awepop_list = new WP_Query($args);

    if($awepop_list->have_posts()) { echo "<ul>"; }

    while ( $awepop_list->have_posts() ) :
        $awepop_list->the_post();
        echo '<li><a href="'.get_permalink($post->ID).'">'.the_title('', '', false).'</a></li>';
    endwhile;

    if($awepop_list->have_posts()) { echo "</ul>";}
}

نبدأ بتمرير مجموعة من المتحولات لإنشاء غرض من صنف WP_Query، حيث يقوم هذا الغرض بالجزء الصعب من المهمة: إيجاد عشرة مواضيع تملك خاصية awepop_views ويرتبها تنازلياً بحسب هذه قيمة هذه الخاصية.

في حال وجود مجموعة مواضيع وفق القيود الموضوعة، يتم فتح قائمة غير مرتبة لإدراج العناصر ضمنها حيث يكون كل عنصر فيها هو عنوان الموضوع مع رابط إلى صفحة الموضوع، وفي النهاية يتم إغلاق القائمة.

استدعاء awepop_popularity_list من أي مكان من القالب سيعرض قائمة من 10 مواضيع كحد أقصى مرتبة بحسب عدد مرات زيارتها.

للتأكد من عدم حصول أخطاء أثناء الاستدعاء نتيجة إيقاف تفعيل الإضافة أو حذفها، يجب أن يكون الاستدعاء ضمن القالب بالشكل التالي:

if (function_exists("awepop_popularity_list")) {
    awepop_popularity_list();
}

الخلاصة

من خلال المقدمات النظرية عند تطوير إضافات ووردبريس، والتعرف على التوابع المرتبطة بها من خلال مثال عملي، أصبحت تملك القدرة على تطوير إضافات خاصة بك. بالطبع مثالنا كان بسيطاً ويحتمل الكثير من التطوير، إنما كان الهدف وضع الأدوات بين يديك.

المصدر

هذه المقالة مع الأمثلة مترمجة بتصرف عن How To Crate a WordPress Plugin.

تابعونا للمزيد من المقالات والترجمات عن مواضيع actions، filters، hooks وغيرها مما يلزم للعمل على ووردبريس.

محمود الدعاس

من مواليد دمشق. ابتدأ بعد التخرج كمبرمج ويب عام 2005 مع شركة إيميا، انتقل بعدها إلى شركة تكنوليد للأتمتة المتكاملة ومنها إلى شقيقتها أتمتة للحلول المتقدمة كمصمم غرافيك ومصمم ومطور ويب. أسس مع مجموعة من زملاء الدراسة موقع HOMELESS-PRO.com لنشر قصص مصورة باللغة العربية للشباب، و Guestra كوكالة تصميم وتطوير.

مواضيع الكاتبموقع الكاتب

لمتابعة الكاتب:
TwitterFacebookPinterest

أضف تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *