تطوير إضافات ووردبريس المتعمقة: إنشاء أول إضافة مخصصة لك من الصفر

قراءة 4 دقائق
2026-03-13
2026-06-03
1,898
أنا أحصل على عمولة عند التسوق عبر الروابط أدناه، ولا يُضاف أي تكلفة عليك.

أساسيات إضافات ووردبريس وبيئة التطوير

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

من أجل التطوير بكفاءة، تحتاج إلى بيئة تطوير محلية. يمكنك استخدام أدوات مثل XAMPP أو MAMP أو Local by Flywheel أو Docker لإنشاء خادم يحتوي على PHP و MySQL بسرعة. بعد ذلك، قم بتثبيت نسخة حديثة من WordPress. أثناء عملية التطوير، يُنصح بالعمل على…wp-config.phpتم تفعيل الميزة داخل الملف.WP_DEBUG، من أجل الكشف عن الأخطاء في الوقت المناسب.

“قلب” الإضافة هو ملف PHP رئيسي. التعليقات الموجودة في بداية هذا الملف تعتبر بمثابة "بطاقة الهوية" الخاصة به، ويقوم ووردبريس بقراءة هذه المعلومات الوصفية للتعرف على الإضافة وإدارتها في الخلفية. التعليقات الموجودة في بداية ملف الإضافة الرئيسي القياسي تكون كما يلي:

القراءة الموصى بها ما هي قوالب ووردبريس

<?php
/**
 * Plugin Name: 我的第一个自定义插件
 * Plugin URI:  https://example.com/my-first-plugin
 * Description: 这是一个用于学习插件开发的简单插件,它将在文章末尾添加自定义内容。
 * Version:     1.0.0
 * Author:      开发者名称
 * License:     GPL v2 or later
 * Text Domain: my-first-plugin
 */

قم بإنشاء أول إضافة (plugin) وظيفية خاصة بك.

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

خادم ووردبريس من شركة UltaHost
ضمان استرداد المال خلال 30 يومًا، عرض نطاق ترددي وقواعد بيانات غير محدودين، حماية مجانية ضد هجمات DDoS، خصم 50% عند الشراء لمدة 3 سنوات (السعة المتاحة: 501–4 تيرابايت).

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

أولاً، في ووردبريس…wp-content/pluginsقم بإنشاء مجلدًا جديدًا في الدليل، على سبيل المثال.my-first-pluginداخل هذا المجلد، قم بإنشاء الملف الرئيسي للغة PHP، ويمكن تسميته…my-first-plugin.phpقم بنسخ كود التعليقات العلوية واضفه إلى المكان المناسب.

بعد ذلك، نحتاج إلى طريقة آمنة لتنفيذ كود تهيئة الإضافة (البرنامج الإضافي). أفضل ممارسة هي تغليف جميع الوظائف داخل فئة (class)، أو استخدام دوال ضمن مساحات أسماء (namespaces). في هذه الحالة، سنستخدم فئة بسيطة لتنظيم الكود. بعد التعليقات في بداية الملف الرئيسي، أضف تعريف الفئة كما يلي:

if ( ! defined( 'ABSPATH' ) ) {
	exit; // 防止直接访问文件
}

class My_First_Plugin {
    public function __construct() {
        // 构造函数,在这里挂载钩子
    }
}

// 初始化插件
new My_First_Plugin();

if ( ! defined( ‘ABSPATH’ ) )هذا السطر من الكود يتوافق مع معايير الأمان المستخدمة في تطوير إضافات ووردبريس (WordPress plugins)، ويهدف إلى منع المستخدمين من الوصول مباشرة إلى ملفات الإضافة عبر عنوان الرابط (URL).

استخدم الخطافات (hooks) لإضافة محتوى قاعدة الصفحة للمقالات.

تعتمد بنية إضافات ووردبريس (WordPress Plugins) على نظام “الخطافات” (Hooks)، والذي ينقسم إلى نوعين: الإجراءات (Actions) والمرشحات (Filters). تسمح الإجراءات (Actions) بتنفيذ كود في أوقات محددة، بينما تسمح المرشحات (Filters) بتعديل البيانات.

القراءة الموصى بها دليل شامل لتحسين أداء مواقع ووردبريس: من الإعدادات الأساسية إلى تحليل أدوات التخزين المؤقت بالتفصيل

هدفنا هو إضافة نص بعد محتوى المقالة، وهذه عملية “تصفية” للمحتوى. لذلك، سنستخدم…the_contentهذا المرشح… قم بتعديل المُنشئ (constructor) والطرق (methods) داخل الفئة على النحو التالي:

class My_First_Plugin {
    public function __construct() {
        // 将自定义方法挂载到‘the_content’过滤器上
        add_filter( 'the_content', array( $this, 'add_footer_to_content' ) );
    }

/**
     * 在文章内容后添加自定义页脚
     *
     * @param string $content 原始文章内容。
     * @return string 修改后的文章内容。
     */
    public function add_footer_to_content( $content ) {
        // 确保只在主循环的单篇文章页面显示
        if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
            $custom_footer = '<div class="my-plugin-footer"><p>شكرًا لقراءتك هذا المقال! تم إنشاؤه بواسطة 【My First Plugin】.</p></div>';
            $content .= $custom_footer;
        }
        return $content;
    }
}

add_filter()الدالة تستخدم طريقة الفئة (class method).add_footer_to_contentتسجيل الدخولthe_contentالمرشح (Filter): عندما يستعد ووردبريس لعرض محتوى المقال، يتم استدعاء الدالة التي قمنا بكتابتها، ويتم تمرير المحتوى الأصلي إليها. نقوم بتنفيذ تحكمات شرطية لضمان إضافة القسم السفلي (الفوتر) فقط إلى صفحة المقال نفسها، وتجنب إعادة إضافته إلى الصفحة الرئيسية أو صفحات الأرشيف. في النهاية، نقوم بإضافة الكود HTML المخصص إلى المحتوى ونعي

إضافة خيارات لواجهة إدارة الإضافة (Plugin Management Interface)

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

استضافة.كوم استضافة مشتركة
أداء عالٍ مع وحدات المعالجة المركزية AMD EPYC، ووحدات تخزين NVMe SSD وLiteSpeed، ودعم داخلي متخصص على مدار الساعة طوال أيام الأسبوع، وتدابير أمنية متقدمة بما في ذلك SSL، وقوة الغاشمة، والحماية من البرامج الضارة والحماية من DDoS، وتوفير ما يصل إلى 731 تيرابايت 4 تيرابايت

إنشاء صفحة قائمة الإعدادات

نحتاج إلى إضافة صفحة فرعية تحت قائمة “الإعدادات” في واجهة إدارة ووردبريس. ولتحقيق ذلك، سنستخدم…add_options_page()الدالة (Function)، عادةً ما يتم تثبيتها (Mounting) على…admin_menuعلى خطاف الحركة.

أولاً، أضف طريقة جديدة في فئة الإضافات (plugins) لتسجيل القوائم (menus) والصفحات (pages):

class My_First_Plugin {
    // ... 之前的构造函数和方法 ...

public function __construct() {
        add_filter( 'the_content', array( $this, 'add_footer_to_content' ) );
        // 挂载后台管理菜单
        add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
        // 挂载初始化设置选项
        add_action( 'admin_init', array( $this, 'settings_init' ) );
    }

public function add_admin_menu() {
        add_options_page(
            '我的第一个插件设置', // 页面标题
            '自定义页脚设置',     // 菜单标题
            'manage_options',     // 所需权限
            'my-first-plugin',    // 菜单slug
            array( $this, 'options_page_html' ) // 回调函数,用于输出页面HTML
        );
    }
}

حقول إعدادات التسجيل وصفحة العرض

بعد ذلك، نحتاج إلى استخدام واجهة برمجة التطبيقات (API) الخاصة بإعدادات ووردبريس (WordPress Settings API) لتسجيل الخيارات وحفظها والتحقق من صحتها بشكل آمن. وهذا يتضمن…register_setting(), add_settings_section()وadd_settings_field()وغيرها من الدوال.

القراءة الموصى بها ما هو WooCommerce؟ مقالة تشرح بالتفصيل وظائفه الأساسية وسيناريوهات استخدامه.

public function settings_init() {
    // 注册一个设置选项组
    register_setting( 'my_first_plugin_settings', 'my_first_plugin_options' );

// 在页面中添加一个设置区域
    add_settings_section(
        'my_first_plugin_section',
        '页脚内容配置',
        array( $this, 'section_callback' ),
        'my-first-plugin'
    );

// 向该区域添加一个字段
    add_settings_field(
        'footer_text',
        '页脚显示文本',
        array( $this, 'footer_text_field_render' ),
        'my-first-plugin',
        'my_first_plugin_section'
    );
}

public function section_callback() {
    echo '<p>قم بتكوين النص الذي سيتم عرضه في نهاية المقال هنا.</p>';
}

public function footer_text_field_render() {
    $options = get_option( 'my_first_plugin_options' );
    $value = $options['footer_text'] ?? '感谢阅读本文!由【我的第一个插件】生成。'; // 默认值
    ?&gt;
    <input type='text' name='my_first_plugin_options[footer_text]' value='<?php echo esc_attr( $value ); ?>' style='width: 400px;'>
    <p class="description">يدعم استخدام علامات HTML البسيطة، مثل… <strong>, <em>, <a>。</p>
    
    <div class="wrap">
        <h1></h1>
        <form action='/ar/options.php/' method='post' data-trp-original-action="options.php">
            
        <input type="hidden" name="trp-form-language" value="ar"/></form>
    </div>
    أنا لا أعرف ماذا أقول.

أخيرًا، قم بتعديل دالة الإخراج الأمامية (الفرينت إند).add_footer_to_contentلقراءة النصوص من خيارات قاعدة البيانات، يجب استخدام الكود التالي:

public function add_footer_to_content( $content ) {
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        $options = get_option( 'my_first_plugin_options' );
        $footer_text = $options['footer_text'] ?? '感谢阅读本文!由【我的第一个插件】生成。';
        $custom_footer = '<div class="my-plugin-footer"><p>'`. wp_kses_post($Footer_text)`.'</p></div>';
        $content .= $custom_footer;
    }
    return $content;
}

wp_kses_post()تضمن الدالة أن النص الذي يدخله المستخدم يحتوي فقط على علامات HTML آمنة، وهذا إجراء أمني مهم للغاية.

الاستضافة المشتركة InterServer
استضافة مشتركة $2.50 دولار أمريكي في الشهر، الشهر الأول $0.1 دولار أمريكي الرمز الترويجي tryinterserver، 461 نص برمجي للتطبيقات السحابية، تثبيت بنقرة واحدة.

تدويل الإضافات (Plugins) وأفضل الممارسات في تطويرها

لكي يتمكن المستخدمون في جميع أنحاء العالم من استخدام الإضافات، فإن عملية التدويل (i18n) ضرورية للغاية. يستخدم ووردبريس إطار عمل GNU gettext لتنفيذ عمليات الترجمة.

حقل النصوص ودالة الترجمة

أولاً، تأكد من أن التعليقات الموجودة في بداية ملف الإضافة (plugin file) تحتوي على تعريفات كافية لكل الخصائص والوظائف المطلوبة.Text Domainعلى سبيل المثالmy-first-pluginثم، في جميع النصوص التي تحتاج إلى الترجمة داخل الإضافة، قم بتغليفها باستخدام دالة محددة.

قم بتعديل الكود الذي كتبناه سابقًا ليدعم ترجمة النصوص المُطبوعة.

\n// تحميل ملف الترجمة في الدالة البنائية
public function __construct() {
    // ... غيرها من الإجراءات ...
    add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) );
}

public function load_textdomain() {
    load_plugin_textdomain(
        'my-first-plugin',
        false,
        dirname( plugin_basename( __FILE__ ) ) . '/languages/'
    );
}

// تعديل سلسلة الصفحة الإعدادات
public function section_callback() {
    echo '  \n// تحميل ملف الترجمة في الدالة البنائية
public function __construct() {
    // ... إجراءات أخرى ...
    add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) );
}

public function load_textdomain() {
    load_plugin_textdomain(
        'my-first-plugin',
        false,
        dirname( plugin_basename( __FILE__ ) ) . '/languages/'
    );
}

// تعديل سلسلة الصفحة الإعدادات
public function section_callback() {
    echo '<p>'\n' . esc_html__( 'قم هنا بتهيئة المحتوى النصي الذي سيتم عرضه في نهاية المقالة.'، 'my-first-plugin' ) . '</p>'هذا النص سيتم عرضه في أسفل الصفحة في صفحة موقعك. يمكنك تغييره من خلال تحرير خيارات المكوّن الإضافي الخاص بك. أو، إذا كنت تستخدم مكوّن إضافي آخر، يمكنك تغييره من خلال تحرير خيارات ذلك المكوّن الإضافي. 

function footer_text_field_render() {
    $options = get_option( 'my_first_plugin_options' );
    $value = $options['footer_text'] ?? __( 'شكرًا لقراءة هذه المقالة! تم إنشاؤها بواسطة [مكوّني الإضافي الأول].' , 'my-first-plugin' );
    ?&gt;
    <input type='text' name='my_first_plugin_options[footer_text]' value='<?php echo esc_attr( $value ); ?>' style='width: 400px;'>
    <p class="description">&lt;?php esc_html_e( &#039;支持简单的HTML标签,如 <strong>, <em>, <a>。', 'my-first-plugin' ); ?&gt;</p>
    ؟؟؟php
}

// ملاحظة: “نص التذييل” الذي يُدخله المستخدم في الواجهة الأمامية لا يحتاج عادةً إلى ترجمة، لأنه محتوى محدد يتم تعيينه من قبل المسؤول.

__()يُستخدم لترجمة النصوص وإرجاعها في شكل سلسلات من الأحرف.esc_html__()يُستخدم لترجمة وتهريب النصوص الناتجة عن تنسيق HTML (HTML output)._e()يُستخدم لترجمة النصوص وعرضها مباشرةً. المعلمة الثانية للدالة هي مجال النصوص (text field)، ويجب أن تتوافق مع المعلمات المحددة في الإضافة (plugin).

الأمان، الأداء، وتنظيم الكود

بالإضافة إلى التدويل، يجب اتباع الممارسات الأفضل التالية:
١. الأمان: يجب التحقق من جميع المدخلات الخاصة بالمستخدمين وتنقيتها وتهريبها (escaping) قبل استخدامها.sanitize_text_field(), esc_html(), wp_kses_post()استخدم الدوال مثل…wp_nonce_field()الوقاية من هجمات CSRF (Cross-Site Request Forgery).
٢. الأداء: استخدم الأدوات المتاحة بشكل مناسب لتجنب تنفيذ عمليات استعلام على قاعدة البيانات غير الضرورية في كل مرة يتم فيها تحميل الصفحة. يمكنك أيضًا التفكير في تخزين نتائج العمليات مؤقتًا في ال
٣. تنظيم الكود: بالنسبة للإضافات المعقدة، يجب تقسيم الملفات حسب وحدات الوظيفة. يكون الملف الرئيسي مسؤولاً عن التوجيه، بينما يتم وضع الكلاسات والدوال في ملفات منفصلة.includes/المحتويات: تم وضع ملفات الواجهة الأمامية (CSS، JS) في المكان المناسب.assets/الفهرس.
٤. إزالة وتنظيف: إذا قامت الإضافة الخاصة بك بإنشاء جداول قواعد بيانات أو خيارات، فيجب أن توفر وظيفة لإزالتها لتنظيف البيانات المتراكمة. يمكن تنفيذ ذلك من خلال واجهة مستقلة…uninstall.phpيتم تنفيذ ذلك باستخدام ملفات.

الملخصات

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

الأسئلة الشائعة الأسئلة المتداولة

لماذا لا يظهر الإضافة (البرنامج الإضافي) الخاص بي في قائمة الخلفية؟

عادةً ما يحدث هذا بسبب مشاكل في الصلاحيات أو أخطاء في الكود. أولاً، يرجى التأكد من أن…add_options_pageأوadd_menu_pageالمعلمات المتعلقة بالصلاحيات المحددة داخل الدالة (مثل…)‘manage_options’يجب أن يتطابق هذا الشيء مع دور المستخدم الذي قمت بتسجيل الدخول باستخدامه حاليًا. بالإضافة إلى ذلك، يرجى التحقق…admin_menuهل تم تثبيت الخطاف (hook) بشكل صحيح؟ وهل لا توجد أخطاء نحوية في دالة الاستدعاء (callback) التي قد تتسبب في توقف تنفيذ PHP؟ أسهل طريقة للتأكد من ذلك هي تفعيل هذه الميزة من خلال واجهة ووردبريس الWP_DEBUGقم بالتحقق مما إذا كانت هناك أي رسائل خطأ ذات صلة تظهر على الشاشة.

كيف يمكن إضافة ملفات CSS و JavaScript مخصصة للإضافة (plugin)؟

الطريقة الصحيحة هي استخدام…wp_enqueue_style()وwp_enqueue_script()الدوال… بالنسبة لموارد الواجهة الأمامية (front-end resources)، يجب تثبيتها (mounting) في المكان المناسب.wp_enqueue_scriptsيتم تثبيته على خطافات الإجراءات (action hooks)؛ أما بالنسبة لموارد واجهة الإدارة الخلفية (backend resources)، فيتم تركيبه عليها (mounting it to them).admin_enqueue_scriptsعلى الخطاف.

في فئة الإضافة (plugin class) الخاصة بك، يمكنك إضافة الطريقة التالية:

public function enqueue_frontend_assets() {
    wp_enqueue_style( ‘my-plugin-style’, plugin_dir_url( __FILE__ ) . ‘assets/css/style.css’, array(), ‘1.0.0’ );
}

ثم في دالة الإنشاء (constructor)، يتم ذلك عن طريق…add_action( ‘wp_enqueue_scripts’, array( $this, ‘enqueue_frontend_assets’ ) );قم بالتسجيل. هذا سيضمن إدارة الاعتمادات بشكل صحيح، وسيمنع حدوث تعارضات مع الإضافات أو الثيمات الأخرى.

كيف يمكنني تنظيف الخيارات البياناتية التي قمت بإنشائها عندما يقوم المستخدم بإزالة الإضافة (البرنامج الإضافي)؟

يوفر ووردبريس طريقتين رئيسيتين لتنفيذ ما تريد. الطريقة الأولى هي تسجيل “hook” لعملية الإزالة (uninstallation hook)، لكن هذه الطريقة ليست شائعة الاستخدام في الإضافات (plugins) القائمة على المفاهيم الكائنية (object-oriented). الطريقةuninstall.phpالملف يقع في نفس المستوى مع ملفات الإضافات الرئيسية الخاصة بك.

عندما يقوم المستخدم بحذف إضافة (plugin) من خلفية ووردبريس (WordPress backend)، يقوم ووردبريس تلقائيًا بفحص هذا الملف وتنفيذ الإجراءات المطلوبة بناءً على تعليماته.uninstall.phpفي هذه الحالة، يجب عليك أولاً إجراء فحص.WP_UNINSTALL_PLUGINهل يتم تحديد القيم الثابتة (الثوابت) أولاً، ثم يتم حذف جميع الخيارات التي أنشأها الإضافة بشكل آمن، بالإضافة إلى الجداول القاعدية المخصصة وغيرها من البيانات؟ على سبيل المثال:

if ( ! defined( ‘WP_UNINSTALL_PLUGIN’ ) ) {
    exit;
}
delete_option( ‘my_first_plugin_options’ );
// 如果有自定义表:$wpdb->query( “DROP TABLE IF EXISTS {$wpdb->prefix}my_table” );

كيف يمكن لإضافتي (البرنامج الإضافي) أن تتوافق مع إصدارات أكثر من ووردبريس (WordPress)؟

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

if ( function_exists( ‘wp_date’ ) ) {
    $date = wp_date( get_option( ‘date_format’ ), $timestamp );
} else {
    $date = date_i18n( get_option( ‘date_format’ ), $timestamp );
}

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