عادل السعيد

الأعضاء
  • المساهمات

    26
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • Days Won

    7

السُّمعة بالموقع

31 Excellent

المعلومات الشخصية

7 متابعين

  1. ربما كان خطأ من الكاتب أو يقصد Shopify لأن الكلام كان في سياق الحديث عنه، أو ربما يقصد تكاليف بوابات الدفع، فمثلا بايبال يقوم بأخذ عمولة عند الدفع عن طريقه، ويدلل على هذا قوله لان WooCommerce لا تحتاج منك إلى تسجيل أصلا.
  2. هذا هو الكود لعرض 3 مقالات من التصنيف ذو الإسم cat1 ويمكنك تطبيق نفس الطريقة على بقية التصنيفات $cat1_query = new WP_Query( array( 'category_name' => 'cat1', 'posts_per_page' => 3 ) ); if($cat1_query->have_posts()): while($cat1_query->have_posts()): $cat1_query->the_post(); // عرض عنوان المقالة the_title(); // يمكنك عرض بقية تفاصيل المقال بنفس الطريقة endwhile; endif;
  3. تحتاج إلى عمل ثلاث حلقات بإستخدام WP_Query كل واحدة لجلب مقالات تصنيف معين، وهنا تجد شرح لهذه الطريقة مع بعض الأمثلة إستخدام أكثر من حلقة لجلب المقالات في ووردبريس
  4. لا غير صحيح، منصة WooCommerce مجانية بالكامل وهي عبارة عن إضافة تقوم بتنصيبها على موقع ووردبريس ولا تأخذ نسبة عن كل عملية بيع.
  5. ربما يفيدك هذا المقال دليلك لإختيار الإستضافة المناسبة لموقع ووردبريس
  6. فهمت من ردك هذا أن كل ما تحتاجه هو أن يكون شكل صفحة المدونة والمقالات مختلف عن بقية صفحات الموقع (الصفحة الرئيسية، الخدمات، ...الخ)، يمكن عمل هذا من خلال إستخدام قالب واحد والتعديل على برمجته،، وذلك بإعطاء ملف index.php (رئيسية المدونة) وصفحة single.php (صفحة عرض مدونة واحدة) وبقية الملفات المختصة بالتدوينات (مثل category.php) إعطائها التنسيق الذي تريده للمدونة وبقية ملفات الموقع بالتنسيق الآخر،، أما في حالة أردت إستخدام قالبين مختلفين فعندئذ لا يوجد طريقة لإدارة الموقعين من خلال لوحة تحكم واحدة، الهم إلا من خلال خاصية Multisite في ووردبريس (والتي لا أنصح بها لعدة أسباب) أو من خلال إحدى خدمات إدارة عدة مواقع ووردبريس مثل MainWP أو ManageWP، وفي كلا الحالتين لن تتحصل على تحكم كامل من لوحة التحكم الموحدة.
  7. هذا يعتمد على مدى مرونة الإضافة لكن في أغلب الأحيان لن تواجه صعوبة في إضافة ما يتعلق بالتنسيق Style، أما التعديلات الأكثر تعقيدا فأكثر الإضافات المبرمجة بصورة جيدة تحتوي على أكواد مختصرة Shortcode ودوال Template Tags تمكنك من عرض محتويات الموقع، وخطافات Actions & Filters تمكنك من التعديل على سلوك وبيانات الإضافة بدون تعديل مباشر على ملفات الإضافة. لذا أنصحك بدراسة الاضافة بصورة جيدة لتحديد إذا ما كانت توفر لك المرونة التي تحتاجها قبل إتخاذ القرار بإستخدامها.
  8. الطريقة السهلة هي بإستخدام إحدى الإضافات الجاهزة مثل: DW   AnsPress أو غيرهما من الإضافات، كما يمكنك إستخدام أحد القوالب الجاهزة أما الطريقة الصعبة والتي قد تكون أكثر مرونة هي باستخدام أنواع المقالات المخصصة Custom Post Types والحقول المخصصة Custom Fields والتعليقا ت ورتب وصلاحيات المستخدمين، وهذه الطريقة بالطبع تتطلب منك معرفة ببرمجة ووردبريس. نوع وحجم ومتطلبات المشروع هي ما يحدد ما ستستخدمه من هذه الطرق.
  9. مرحبا بك سيد محب، وشكرا على تعليقك بالتأكيد يمكنك إستخدامه في أي عمل تجاري، فالقالب مرخص بنفس رخصة ووردبريس وهي GPL، لكن ضع في إعتبارك أن أي عمل يعتمد على ووردبريس (إضافة أو قالب) يجب أن يكون مرخص بنفس الرخصة (على حسب شروط الرخصة)، وعادة هنا نتكلم عن ملفات php للقالب أو الإضافة، لكن لك كامل الحرية في ترخيص الملفات المساعدة (الصور وملفات CSS الخ) بأي ترخيص تريده، وهذه الطريقة (إستخدام ترخيص مختلف لكل من الملفات البرمجية والملفات المساعدة) مستخدمة في منتجات عدة مواقع من ضمنها الكثير من منتجات ثيم فورست Themeforst.
  10. تعرفنا في المقال السابق على ملفات الوظائف في قالب Underscores بشئ من التفصيل وفي هذا المقال سنلقي نظرة على ملفات العرض وهي ملفات القالب التي يستخدمها ووردبريس لعرض محتويات الموقع في مختلف الصفحات وكذلك ملفات التنسيق. لكن دعنا في البداية نلقي نراجع بصورة سريعة مفهوم ملفات القالب وكذلك هرمية القالب. ملفات القالب وهرمية القالبملفات القالب Template files هي عبارة عن ملفات قابلة لإعادة الإستخدام Reusable يستخدمها ووردبريس لتوليد صفحات الموقع المختلفة. بعض هذه الملفات (مثل ملف الترويسة header.php وملف التذييل footer.php) تستخدم في جميع صفحات الموقع تقريبا، وبعضها مثل ملف single.php وملف index.php تستخدم في حالات معينة فقط (مثلا الصفحة الرئيسية، أو صفحة عرض المقال). يتبع ووردبريس نظام معين لتحديد ملف القالب الذي سيتم إستخدامه في الصفحة الحالية ويقوم بتحميله عند طلب الصفحة ليستخدم في عرضها. هذا النظام يمكن أن نسميه هرمية القالب في ووردبريس WordPress Template Hierarchy. وفقا لهرمية القالب فإن الملفات الموجودة في القالب قد تختلف من قالب لأخر (وهو ما يحدث عادة) ولكن هنالك ملفات أساسية موجودة في أغلب القوالب، وقالب Underscores بدوره يحتوي على هذه الملفات الأساسية، ويمكنك بالطبع إضافة المزيد من ملفات القالب على حسب المشروع الذي تقوم بتطويره وكذلك يمكنك الإستغناء عن بعضها. ملفات القالب في قالب Underscoresملف الترويسة header.phpهذا الملف من الملفات التي يتم إستخدامها في جميع ملفات القالب الأخرى تقريبا حيث يحتوي على ترويسة الموقع اي بداية وسم html ووسم head وكذلك بداية وسم body، ويحتوي أيضا على عنوان ووصف الموقع وكذلك القائمة الرئيسية للموقع. من الأمور والممارسات الجيدة التي يمكن ملاحظتها في هذا الملف: إستخدام الدالة language_attributes داخل وسم html وهي عبارة عن دالة يوفرها ووردبريس وتعرض خصائص اللغة لوسم html وهي خاصية dir وكذلك خاصية lang وهي مفيدة جدا في حالة تطوير الموقع بأكثر من لغة حيث تقوم بجلب إتجاه اللغة الحالية تلقائيا وكذلك اللغة نفسها.إستخدام الدالة wp_head قبل إغلاق وسم head وهي دالة مهمة جدا يستخدمها ووردبريس في عدة امور وتعتمد عليها مجموعة كبيرة من الإضافات لذلك إذا لم تقم بمناداتها في هذا المكان فقد تتفاجأ بأن كثير من الإضافات لا تعمل في موقعك وكذلك لن يتمكن ووردبريس من ربط ملفات التنسيق والجافا إسكربت في ترويسة الموقع. وفي الحقيقة هي مسئولة من من اداة الحدث وبالتالي مناداة أي دالة مرتبطة به.إستخدام الدالة body_class داخل وسم body والتي تقوم بإخراج كلاسات CSS للصفحة الحالية على حسب الصفحة نفسها، فمثلا في ستجد كلاس home في الصفحة الرئيسية وكلاس blog في صفحة المقالات وغيرها من الكلاسات المفيدة والتي تعينك في تنسيق الموقع إعتمادا على الصفحة نفسها.يتم تضمين هذا الملف في بقية ملفات القالب من خلال الدالة get_header. ملف الفوتر footer.phpمثل ملف الهيدر فإن ملف الفوتر يتم إستخدامه في جميع ملفات القالب الأخرى تقريبا، حيث يحتوي على وسم الإغلاق لكل من html وكذلك body ويحتوي أيضا على الدالة wp_footer والتي يتم مناداتها قبل إغلاق وسم body مباشرة ومهمتها مشابهة لمهمة الدالة wp_head التي ذكرناها اعلاه إلا أن هذه الدالة مرتبطة بالحدث wp_footer وهي بنفس أهمية wp_head وعليك دوما التأكد من أن قالبك يحتوي على كليهما في جميع صفحات الموقع. ملف المقالات (الصفحة الرئيسية) index.phpهذا الملف يستخدم لعرض الصفحة الرئيسية للموقع، أو بصورة أدق صفحة المقالات (لانه يمكنك إستخدام صفحة ثابتة لرئيسية الموقع وعرض المقالات في صفحة اخرى غير الصفحة الرئيسية وهو ما يمكنك التحكم به من خلال إعدادات القراءة في لوحة تحكم ووردبريس). مهمة هذا الملف هو عرض جميع المقالات في الموقع وبالتالي فإن الحلقة Loop في هذا الملف تجلب بصورة تلقائية جميع المقالات، وما يمكن ملاحظته في هذا الملف: يتم تضمين ترويسة الموقع (ملف الترويسة) من خلال إستخدام الدالة get_header كما أسلفنا.يتم إستخدام الدالة get_template_part مع الدالة get_post_format لتضمين ملف الcontent المناسب من داخل مجلد template-parts على حسب بنية المقال بالصورة التالية:get_template_part( 'template-parts/content', get_post_format() );فمثلا عندما تكون بنية المقال إقتباس quote سيتم تحميل ملف content-quote.php من داخل مجلد template-part، وهذا في حالة كان الملف content-quote.php موجودا وإذا لم يكن موجود فإن الدالة get_template_part تقوم تلقائيا بتضمين الملف content.php وهذه إحدى مميزات الدالة get_template_part. وكما سترى فإن هذه الدالة مستخدمة في عدد من ملفات القالب لجلب الأجزاء الموجودة في مجلد template-parts وبهذه الطريقة تصبح ملفات القالب أكثر تنظيما وتصبح الشيفرة البرمجية مقرؤة بصورة أكبر. ملف المقال المفرد single.phpكما هو معلوم لديك فإن ووردبريس يستخدم هذا الملف لعرض المقال المفرد وقد يستخدمه أيضا لعرض صفحة التفاصيل لأنواع المقالات المخصصة الأخرى في بعض الأحيان وفق هرمية القالب التي أشرنا إليها سابقا. ما يمكن ملاحظته في هذا القالب هو إستخدام الدالة get_template_part داخل الحلقة لجلب ملف تفاصيل المقال المفرد وبعد ذلك يتم إستدعاء الدالة the_post_navigation التي تم تعريفها في ملف template-tags.php لعرض المقال السابق والمقال التالي لهذا المقال في حالة وجودهما. بعد ذلك يتم التحقق من إذا ما كانت التعليقات مفتوحة لهذا المقال وفي هذه الحالة يتم جلب ملف comments.php والذي يحتوي نموذج التعليقات وأيضا يعرض التعليقات السابقة في حالة وجودها. وأخيرا يتم جلب ملف sidebar.php من خلال الدالة get_sidebar التي يوفرها ووردبريس، وكذلك يتم جلب ملف الفوتر. ملف الصفحة المفردة page.phpهذا الملف شبه مطابق للملف السابق، فقط داخل الحلقة يتم جلب ملف content-page.php بدلا عن ملف content-single.php. ملف الشريط الجانبي sidebar.phpفي هذا الملف يتم التحقق من وجود أي ودجات نشطة في الشريط الجانبي Sidebar المسمى sidebar-1 وذلك من خلال الدالة is_active_sidebar وفي حالة لم يكن هنالك ودجات نشطة يتم الخروج من الملف وإلا سيتم جلب محتويات الشريط الجاني من خلال الدالة dynamic_sidebar والتي تستقبل معرف الشريط الجانبي لجلبه. ملف الأرشيف archive.phpكما هو معلوم وفق هرمية القالب يتم إستخدام هذا الملف لعرض أرشيف التصنيفات والشهور والكاتب وعموما أي أرشيف إذا لم يكن لديه ملف أرشيف خاص به (مثلا في حالة وجود ملف category.php فحينها سيتم إستخدامه لعرض أرشيف التصنيف ولا يتم إستخدام ملف archive.php لأرشيف التصنيف). نلاحظ أنه في البداية وقبل الدخول الى الحلقة يتم إستخدام الدالتين the_archive_title و the_archive_description لجلب عنوان ووصف الأرشيف على التوالي، وبعد ذلك تجد بقية الملف مشابه لملفات single.php وpage.php طبعا مع إختلاف الملف content الذي يتم جلبه حيث يتم جلبه هاهنا وفق تنسيق المقال كما في ملف index.php. ونلاحظ فرق أخر في هذا الملف وهو أنه في حالة لم يكن هنالك محتويات في الأرشيف الحالي يتم جلب ملف content-none.php والذي في هذه الحالة يخرج رسالة للزائر تفيده بأنه لا يمكن إيجاد المحتوى المطلوب بالإضافة لنموذج البحث. وقبل ذلك وبعد نهاية الحلقة يتم إستدعاء الدالة the_posts_navigation التي تم تعريفها في ملف template-tags.php والتي تعرض روابط التنقل بين المقالات (الصفحة السابقة والصفحة التالية). ملف البحث search.phpفي بداية هذا الملف وقبل الدخول الى الحلقة يتم عرض عنوان يشير الى كلمة البحث (يمكن ان يترجم إلى نتائج البحث عن: "كلمات البحث") حيث يتم الوصول الى الكلمة التي بحث عنها المستخدم من خلال الدالة get_search_query التي يوفرها ووردبريس. بعد ذلك يتم عرض نتائج البحث في حالة وجودها من خلال إستدعاء ملف content-search.php وفي حالة عدم وجود نتائج مطابقة يتم إستدعاء الملف content-none.php والذي في هذه الحالة يعرض رسالة للزائر تفيده بأنه لم يتم إيجاد نتائج مطابقة وتقترح عليه إستخدام كلمات أخرى في البحث ويرفق له نموذج البحث. ملف الخطأ 404.phpيستخدم هذا الملف لعرض صفحة الخطأ المشهورة 404 وفي قالب underscores تم برمجته بحيث يقدم فائدة كبيرة للمستخدم حيث أنه بالإضافة لعنوان الصفحة ورسالة الخطأ يقوم بعرض نموذج البحث، وودجت أخر المقالات، والتصنيفات الأكثر إستخداما في المدونة، والأرشيف الشهري للمدونة، بالإضافة لسحابة الوسوم. ملف التعليقات comments.phpيستخدم هذا الملف لعرض التعليقات السابقة ونموذج التعليقات لكل من الصفحات والمقالات في حالة كانت التعليقات مفتوحة للمقال المعين. وربما نخصص لطريقة برمجة ملف التعليقات في ووردبريس مقالا مفردا لنتعرف على أهم الدوال التي يوفرها ووردبريس للتعليفات وطريقة إستخدامها، وحاليا يمكنك إستخدام هذا الملف كما هو في قالبك مع التعديل على التنسيق بما يتناسب مع تصميم القالب. ملفات التنسيق في قالب Undescoresلا يجبرك قالب Underscores على إستخدام ملفات التنسيق الموجودة فيه ويمكنك بكل بساطة مسحها أو مسح محتوياتها والبدء بكاتبة شيفراتك الخاصة، لكنه يوفر لك بعض الأمور الأساسية المهمة في تنسيق قوالب ووردبريس لتبني عليها كما سنرى. ملف style.cssكما هو معلوم فإن هذا الملف من الملفات الأساسية التي لا بد من وجودها في أي قالب ووردبريس ليعمل حيث يستخدم ووردبريس الترويسة الموجودة في هذا القالب والمكتوبة كتعليق ليأخذ منها معلومات القالب التي سيعرضها في لوحة التحكم لذلك لابد من إرفاق هذا القالب وكتابة هذه المعلومات في أي قالب ووردبريس، لكنك غير مجبر على كتابة تنسيقات القالب في هذا الملف ولا ربطه في ترويسة الموقع (من خلال إستخدام الدالة wp_enqueue_style كما أشرنا لذلك في المقال السابق) ولكن يحسن بك أن تستخدمه ما دام ليس هنالك مانع يمنعك من إستخدامه. بعد ترويسة هذا الملف تلاحظ وجود تعليق طويل هو عبارة عن جدول لمحتويات الملف، وهذه من الأشياء التي يمكنك تعلمها من قالب Underscores ليسهل فهم ملف التنسيق والوصول لأي جزء فيه فيما بعد بسرعة أكبر. وكما هو ملاحظ في جدول المحتويات فإن هذا الملف يحتوي مسبقا على الأمور الأساسية في تنسيقات CSS حيث يحتوي على Normalize لعناصر html وتنسيقات الخطوط والعناصر والنماذج وهذه الثلاثة الأخيرة يمكنك تعديلها بما يتناسب معك. بعد ذلك يحتوي على تنسيقات التنقل وتنقسم الى الروابط والقائمة، وفي تنسيقات القائمة ستجد بعد الأصناف المعدة مسبقا لتضيف عليها تنسيقات القائمة (وفق الصنف الذي تم كتابته في القائمة في ملف header.php)وبعض التنسيقات الأساسية التي تجدها مكتوبة بل إن القائمة معدة مسبقا للعمل في الأجهزة الصغيرة من خلال توفير تنسيقات مختلفة لهذه الأجهزة من خلال Media queries وهنالك أيضا ملف navigation.js المسئول عن إضافة وحذف بعض الأصناف على حسب عرض الجهاز المستخدم لتصفح الموقع وهذا يعني أن القائمة شبه جاهزة لديك وعليك فقط إضافة القليل من الشيفرات لتتناسب مع تنسيق القالب الخاص بك. بعد ذلك يحتوي الملف على تنسيقات خاصة بإمكانية الوصول والمحازاة وتنظيف الfloat، وبعدها بعض التنسيقات الخاصة بالودجات. وبعدها تسنيقات المحتويات (الصفحات والمقالات والتعليقات) وتلاخظ فيها إستخدام بعض الأصناف التي يولدها ووردبريس سواء في وسم body أو وسم المقال نفسه من خلال الدالتين body_class و post_class على التوالي، وبعدها تنسيقات خاصة بـ Infinite scroll في إضافة Jetpack. بعد ذلك هنالك التنسيقات الخاصة بالميديا وهذه التنسيقات مفيدة لمعرفة الأصناف التي يولدها ووردبريس مع الميديا مثل Caption الخاص بالصور والمعرض Gallery. ملف التنسيق لللغات من اليمين للشمال rtl.cssفي حالة كانت لغة العرض للموقع تتبع التنسيق من اليمين للشمال مثل اللغة العربية يقوم ووردبريس تلقائيا بربط الملف المسمى rtl.css في ترويسة الموقع في حالة وجوده في القالب، بالتالي يحسن وضع التنسيقات المختصة بهذه اللغات في هذا الملف حيث أن ووردبريس يقوم بربطه بعد ملف style.css وهذا يعني أن التنسيقات في هذا الملف سيكون لها أولوية للتنسيقات المشابهة في ملف style.css كما هو معلوم في لغة CSS. خاتمةكما تلاحظ فإن ملفات العرض (ملفات القالب) في قوالب ووردبريس تعتمد بصورة كبيرة على فهم هرمية القالب والحلقة وكذلك معرفة وسوم القالب التي يوفرها ووردبريس ومنها الوسوم الشرطية وقد تحتاج أيضا لإنشاء دوال أخرى لإستخدامها ورأينا أنه من المهم أيضا معرفة الأصناف التي يولدها ووردبريس لتستطيع الإستفادة منها في تنسيق القالب وفق الصفحة والمقال وتنسيق طريقة عرض الميديا. بهذا نكون وصلنا لختام هذه السلسلة التي ألقينا فيها نظرة سريعة على ملفات قالب Underscores بشيء من التفصيل وتعلمنا منه بعض الأمور المفيدة في تطوير قوالب وودربريس.
  11. في الدرس السابق من هذه السلسلة، تعرفنا على بعض مميزات قالب s_ وإستعرضنا مجلدات القالب وبعض الملفات الأساسية، وفي هذا الدرس سنكمل الإطلاع على الملفات الأساسية وسنحاول شرح مهمة بعض الشيفرات والدوال البرمجية بالإضافة الى الإشارة الى بعض الممارسات الجيدة في تطوير قوالب ووردبريس والتي يمكن أن نتعلمها من قالب underscores. ملفات الوظائف والأحداث والمفلتراتنقصد بهذه الملفات ملف functions.php والملفات التي يتم تضمينها من خلاله، حيث تحتوي هذه الملفات في قالب underscores على بعض الشيفرات المهمة التي يتكرر استخدامها في كل قالب ووردبريس تقريبا (أحيانا مع تعديلات بسيطة عليها) وبالطبع يمكنك إضافة المزيد من الشيفرات أو التخلي عن بعضها على حسب القالب الذي تقوم بتطويره. ملف functions.phpالدالة hsb_setupكما تلاحظ فإن أول الدوال الموجودة في ملف functions.php دالة تأخذ الاسم اللطيف للقالب متبوعا بكلمة setup وبالمناسبة هذه من الممارسات المهمة جدا في تطوير قوالب وإضافات ووردبريس أي أن تقوم ببدء تسمية الدوال الخاصة بالقالب بكلمة مميزة (عادة الاسم اللطيف للقالب) حتى لا تختلط مع اسم أحد الدوال الموجودة في ووردبريس أو أي من الإضافات في الموقع. في حالتنا هنا سنستخدم hsb كاسم لطيف للقالب وهو اختصار لكلمة Hsoub بالتالي فإن اسم الدالة سيكون كالاتي function hsb_setup()قبل أن ندخل في شرح مهمة هذه الدالة قد تكون لاحظت السطر البرمجي السابق لها (تجاهل التعليقات البرمجية) والذي هو عبارة عن عبارة شرطية if statement تأخذ الصورة if ( ! function_exists( 'hsb_setup' ) ) : ويتم إنهاء هذه العبارة الشرطية بعد قوس إغلاق الدالة مباشرة، وهذه أيضا من الممارسات الجيدة حيث أنه بهذه الطريقة يتم التأكد أولا من وجود تعريف الدالة في مكان أخر وفي حالة وجودها يتم تجاهل هذا التعريف وهذا بالطبع يتيح لك إعادة تعريف الدالة من خلال القالب الأبن أو الإضافات وهذا يزيد من دعم القالب لخاصية القالب الإبن. الان لنعود لمهمة هذه الدالة ويمكن أن نقول أنها مسؤولة من ثلاثة أمور: تحميل دعم القالب للترجمة من خلال استخدام الدالة load_theme_textdomain.تسجيل قوائم القالب والتي ستظهر للمستخدم عند إنشائه قائمة جديدة في مكان مواضع القالب ويتم تسجيلها من خلال الدالة register_nav_menus، ويأتي قالب underscores مسجلا لقائمة واحدة فقط وهي القائمة الرئيسية، ويمكنك بالطبع إضافة المزيد على حسب عدد القوائم في قالبك.تعريف خصائص ووردبريس التي يدعمها القالب، أو ببساطة إضافة خصائص القالب من خلال الدالة add_theme_support ومنها على سبيل المثال الصورة البارزة وخصائص أخرى يمكنك الإطلاع عليها في صفحة توثيق الدالة.كما تلاحظ يتم إضافة هذه الدالة الى الحدث after_setup_theme وهو الحدث المناسب معها، وهذه ميزة أخرى يمنحك لها قالب underscores وهي التعرف على الأحداث المناسبة لمختلف الوظائف التي تحتاجها في القالب. الدالة hsb_widgets_initهذه الدالة مسؤولة عن تسجيل مواضع الودجات في القالب، فمثلا قد يحتوي القالب على موضوع واحد وهو موضع الشريط الجانبي الأيسر وقد يحتوي بالإضافة الى ذلك الى مواضع للودجات في الفوتر أو غيره مثلا، وكل هذه المواضع يتم تسجيلها داخل هذه الدالة من خلال الدالة register_sidebar، وبعد ذلك يتم إضافة هذه الدالة الى الحدث widgets_init. الدالة hsb_scriptsوتستخدم هذه الدالة لصف ملفات CSS وملفات الجافا اسكربت ويمكنك معرفة المزيد عن هذا الامر من خلال هذا المقال. كما تلاحظ في نهاية هذا الملف يتم تضمين خمسة ملفات تحتوي على بعض الوظائف ومقسمة على حسب مهامها وهي ما سنتطلع علي تفاصيله في الفقرات القادمة ملف custom-header.phpيوفر لك ميزة ووردبريس تمكين المستخدم من صورة ترويسة القالب من لوحة التحكم وتجدها تحت قائمة المظهر في حالة كان القالب يدعمها، وقالب s_ يأتي افتراضيا داعم لهذه الخاصية حيث يمكنك استدعاء صورة الترويسة التي اختارها المستخدم لعرضها في أي مكان في القالب من خلال هذه الشيفرة (الموجودة في التعليقات أعلى هذا الملف) <?php if ( get_header_image() ) : ?> <a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"> <img src="<?php header_image(); ?>" width="<?php echo esc_attr( get_custom_header()->width ); ?>" height="<?php echo esc_attr( get_custom_header()->height ); ?>" alt=""> </a> <?php endif; // End header image check. ?> ويحتوي هذا الملف على الدوال اللازمة لجعل القالب يدعم الترويسة وقد يفيدك الاطلاع على هذه الدوال وطريقة عملها لتطبيق هذه الميزة كما يمكنك تعديل بعض القيم الافتراضية في حالة أردت ذلك بالإضافة لإضافة التنسيق الخاص بصورة الترويسة وكذلك عنوان ووصف المدونة. ملف template-tags.phpوسوم القالب Template Tags أو يمكن تسميتها بدوال القالب هي مجموعة من الدوال يوفرها ووردبريس لمطوري القوالب ويتم إستخدامها عادة في ملفات القالب لعرض معلومات الموقع والمقالات مثل عنوان المقال و إسم المقال وكاتب المقال ورابط الموقع وغيرها من البيانات التي تحتاج عادة لعرضها في القالب وهذه الدوال تتيح لك عرض مثل البيانات فقط بكتابة إسم الدالة، فبدلا عن الإتصال بقاعدة البيانات وجلب البيانات التي تريدها فإن الدالة (وسم القالب) تقوم بهذه العمليات نيابة عنك وترجع لك المحتويات. هذا الملف يوفر لك مجموعة إضافية من دوال القالب التي تعرض بعض البيانات التي تحتاجها عادة في القالب، وبدلا من كتابة الشيفرة البرمجية لجلب هذه البيانات بداخل ملفات القالب يتم كتابتها في هذه الدوال وتستطيع مناداة هذه الدوال في ملفات القالب وبالتالي تحافظ على شيفرة برمجية نظيفة ومقروءة في ملفات القالب بالإضافة لإمكانية جلب البيانات في اكثر من ملف فقط بإستدعاء هذه الدالة. من الدوال الموجودة في هذا الملف الدالة the_posts_navigation وتستخدم لعرض صفحة المقالات السابقة وصفحة المقالات التالية في صفحة الأرشيف (صفحة عرض المقالات، وصفحة التصنيف وغيرها من الصفحات التي تعرض مجموعة من المقالات).الدالة the_post_navigation وتستخدم لعرض المقال السابق والتالي للمقال الحالي (في صفحة المقال الحالي).الدالة hsb_posted_on تستخدم لعرض تاريخ وكاتب المقال.الدالة the_archive_title تستخدم لعرض عنوان الأرشيف إعتمادا على نوعه فمثلا تعرض عنوان التصنيف بصورة مختلفة عن عنوان الوسم وغيرها من الأرشيفات.الدالة the_archive_description لعرض وصف الأرشيف.الدالة hsb_categorized_blog للتأكد من أن الموقع يحتوي على أكثر من تصنيف للمقالات حيث ترجع true في هذه الحالة.الدالة hsb_category_transient_flusher وتستخدم لمسح الtransient الخاص بالتصنيف والذي يستخدم عادة لزيادة سرعة الموقع.بالطبع يمكنك إضافة المزيد من الدوال في هذا الملف وتذكر أنه أنسب الأماكن لكتابة الدوال التي تحتاج لإستخدامها في ملفات القالب لعرض بيانات معينة، فمثلا يمكنك إنشاء دالة لعرض عدد مشاهدات المقال وسيكون هذا الملف هو الأنسب لكتابتها. ملف extras.phpهذا الملف مشابه للسابق ويختلف عنه أن الدوال في هذا الملف لا يتم إستخدامها عادة في ملفات القالب بل تقوم بعمل مهام لا تعتمد على ملفات القالب، وعموما يمكن أن نقول أن الدوال في هذا الملف هي عادة الدوال التي يتم إضافتها الى مفلترات Filters أو أحداث Actions معينة وليست الدوال التي يتم إستداعائها داخل القالب. من الدوال في هذا الملفK، الدالة hsb_body_classes والتي تستخدم للتعديل على المتغير الذي يحتوي على CSS Classes الخاص بوسم body للموقع من خلال مفلتره body_class، وهي في هنا تضيف الClass المسمى group-blog في حالة كانت المدونة تحتوي على أكثر من كاتب. الدالة hsb_wp_title والتي تقوم بالتعديل على إسم الموقع (الذي يظهر في وسم title بداخل وسم head في الموقع) من خلال فلتره wptitle ويتم التعديل على حسب الصفحة المعروضة (حيث يختلف عنوان الموقع في الصفحة الرئيسية من العنوان في صفحة عرض المقال). الدالة hsb_render_title وهي المسؤولة عن عرض عنوان الموقع داخل وسم head وذلك من خلال إضافتها للحدث wphead. وكما هو الحال بنسبة لملف template-tags.php يمكنك إضافة المزيد من الدوال لهذا الملف كما تريد. ملف jetpack.phpيستخدم هذا الملف لإضافة توافقية القالب مع إضافة Jetpack المشهورة وبالتحديد مع خاصية Infinite Scroll التي توفرها هذه الإضافة حيث وذلك من خلال دالتين الأولى وهي hsb_jetpack_setup تقوم بإخبار ووردبريس أن الموقع متوافق مع خاصية infinite-scroll بإستخدام الدالة add_theme_support، والدالة الثانية هي hsb_infinite_scroll_render وهي المسؤولة عن طريقة عرض المقالات التي سيتم تحميلها من خلال هذه الخاصية. ملف customizer.phpهذا الملف يستخدم لإضافة دعم القالب للمخصص Theme Customizer في تعديل إسم ووصف الموقع بحيث تظهر مباشرة في العرض الحي Live Preview بعد التعديل عندما يتم التعديل على المخصص وهذه هي الطريقة التي يعمل بها المخصص، وسنتناول طريقة عمل المخصص وكيفية جعل القالب داعم له وكيفية إضافة بعض الخيارات في المخصص في سلسلة مقالات اخرى إن شاء الله. خاتمة بهذا المقال نكون قد أكملنا الحديث عن ما يتعلق بالوظائف العامة Functions التي يوفرها القالب وطريقة ترتيبها وتوزيعها بين الملفات، وتبقى لنا الكلام عن ملفات القالب المسؤولة من عرض محتوى الموقع للمستخدم وطريقة تنسيقه وترتيبها وهو ما سنتكم عنه في المقال القادم إن شاء الله.
  12. في الدرس السابق من هذه السلسلة بدأنا بتطوير إضافة عداد المشاهدات حيث قمنا بإضافة عدد المشاهدات لكل مقال ومتابعته كما قمنا بتوفير شيفرة مختصرة 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شبيه بالموقع السابق.
  13. بعد أن تطرّقنا إلى أساسيات تطوير إضافات ووردبريس حان الوقت لنقوم بإنشاء إضافة لتطبيق بعض ما تعلمناه. وهذا ما سنقوم به في هذا الدرس والدرس الذي يليه من خلال إنشاء إضافة تقوم بإضافة مربع جانبي لعرض المقالات الأكثر مشاهدة في موقع ووردبريس مع إمكانية عرض عدد المشاهدات في كل مقالة. التخطيط للإضافةلنبدأ بتحديد الأمور التي ستقوم بها الإضافة: إحصاء عدد المشاهدات لكل مقال.توفير شيفرة مختصرة 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 تجنبا للإطالة وربما نخصص لها مقالا مفردا بعد نهاية هذه السلسلة إن شاء الله. سنكتفي بهذا القدر في هذا الدرس وفي الدرس الأخير من هذه السلسة سنكمل –إن شاء الله- برمجة الإضافة (حيث تبقى فقط برمجة الويدجت الذي يعرض أكثر المقالات مشاهدة)، كما سنلقي بعض الضوء على مجموعة من الأدوات والمواقع المفيدة لمطوري إضافات ووردبريس.
  14. الانتشار الكبير في استخدام لغات تصميم الويب أدى إلى ظهور بعض إطارات العمل (Frameworks) الجاهزة التي تسهل وتسرع عملية تطوير الواجهات كذلك فإن الانتشار الواسع لووردبريس والطلب الكبير لقوالبه دفع بعض المطورين والشركات إلى تطوير العديد من الأدوات الجاهزة التي تسهل بصورة أو أخرى عملية تطوير قوالب ووردبريس، إحدى هذه الأدوات الجيدة جدا هي قالب Underscores _s والذي يتمتع بمجموعة من المميزات (كما سنرى) تجعله من أفضل الأدوات المعينة لمطور قوالب ووردبريس. وفي هذا المقال سنتعرف على بعض مميزات قالب _s وطريقة استخدامه والاستفادة منه، لكن دعنا في الأول نلقي نظرة سريعة على بعض الأدوات المتاحة لمطوري قوالب ووردبريس (من قبل شركات أو مطورين أخرين) وأنواعها وفي أي الأنواع يمكن تصنيف قالب Underscores _s. أطر عمل قوالب ووردبريس WordPress Theme Frameworksأتذكر أنه عند بداية دراستي لتطوير قوالب ووردبريس شكل هذا المصطلح بعض الصعوبة بالنسبة لي ليس لأنه يحتوي على كلمة إطار عمل (Framework) فقط بل لأنه في مجتمع ووردبريس يطلق هذا المصطلح على عدة معاني حيث يختلف المعنى الذي يستخدم لأجله من بعض المطورين، لذا دعنا نحاول تجنيبك الوقوع في مثل هذا الإشكال بتعريف مبسط لكلمة إطار عمل وكذلك الإشارة الى بعض المعاني التي تستخدم لها هذه الكلمة في مجتمع ووردبريس. التعريف المبسط لإطار العمل Framework في مجال تطوير الويبهو عبارة عن مجموعة من الأدوات الجاهزة (عادة شيفرات برمجية) تؤدي بعض المهام الشائعة وتغنيك هذه الإطارات من كتابة هذه الشيفرات بنفسك. بالطبع فإن التعريف يمكن أن يكون أعم من ذلك لكن هذا ما نحتاجه في هذا المقال. إطارات عمل قوالب ووردبريس Themes Frameworkيطلق هذا المصطلح عادة على أربعة معاني في مجتمع ووردبريس (موقع ووردبريس الرسمي ذكر ثلاثة ودعني أضيف لها رقم 2 في قائمتنا هذه). القالب الأب Parents Themes (البعض يطلق عليها Themes Framework) هذا النوع من الأدوات عبارة عن قالب جاهز يمكنك الاستفادة منه من خلال صنع قالبك كقالب ابن Child Theme له وذلك بالاستفادة من هذه الميزة (القالب الابن) التي يوفرها ووردبريس. عادة عند إطلاق كلمة إطار عمل قوالب Themes Framework فإن المقصود هو هذا النوع من القوالب، ومن أشهر هذه القوالب هو إطار العمل Genesis ومن الإطارات ذات التطوير العربي هنالك إطار العمل ممتاز وليس المقام هنا لسرد القوالب المتوفرة تحت هذا النوع من الأدوات.إطارات عمل لوحة تحكم القوالب Theme Options Framework هذا النوع من الأدوات كما يظهر من أسمه يستخدم لتسهيل مهمة إنشاء لوحة تحكم للقالب فهو يسهل عملية إضافة واسترجاع خيارات القالب وعادة ما يوفر مجموعة من الحقول المتقدمة التي تتطلب برمجتها بدونه بعض الوقت والجهد. البعض أيضا يطلق كلمة إطار عمل (هكذا بإطلاقها) على هذا النوع من الأدوات، ومن أشهر هذه الإطارات إطار عمل Redux.المكتبات المساعدة Dropin Libarary هذه مجموعة من الملفات التي تقوم بتضمينها في قالبك للاستفادة من الدوال والأصناف الموجودة فيها وبالرغم من أن كثير من إطارات عمل لوحة التحكم يمكنها العمل بنفس الطريقة (تضمين ملفاتها في قالبك) لكن هذه المكتبات توفر عادة أكثر من مجرد تسهيل لعمل لوحة التحكم بل تتيح لك المزيد من التسهيلات فيما يتعلق بتطوير القالب ككل. من هذه المكتبات إطار العمل Hyprid.القالب الابتدائي Starter Theme عبارة عن قالب جاهز بنسبة كبيرة تقوم بتطوير قالبك بالتعديل عليه مباشرة لا عن طريق استخدام قالب ابن كما في الرقم 1 من هذه القائمة، ويوفر هذا القالب عادة التركيبة الأساسية لملفات قوالب ووردبريس وبعض الدوال والإعدادات الأساسية للقالب بحيث يجعل المصمم يركز على التصميم (CSS) أو تحويل التصميم الجاهز. قالب Underscores والذي نحن بصدد التعرف عليه يقع تحت هذا النوع من إطارات العمل وتستطيع استخدامه في تطوير قالبك من الخلال التعديل المباشر عليه كما سنرى لاحقا إن شاء الله.مميزات قالب Underscoresهنالك عدة مميزات تجعل من الجيد إختيار هذا القالب كنقطة بداية لتطوير قالبك، ومن هذه المميزات: القالب مفتوح المصدر ومطور من قبل مجموعة من المبرمجين المحترفين وعلى رأس التطوير شركة Automatic الراعية لووردبريس، وهذا يضمن لك توافقية عالية بين ووردبريس وقالب Underscores وكذلك احترافية في تطويره.القالب يعتمد على HTML5 كما أنه موثق بصورة جيدة ويحتوي على نسبة مناسبة من الشيفرات (بالتالي لن تفقد الكثير من الأساسيات الموجودة في أي قالب كما أنك لن تضطر لمسح الكثير من الشيفرات).يحتوي على مثال لتطبيق خاصية الترويسة المخصصة Custom header التي يوفرها ووردبريس.مجموعة مخصصة من وسوم القالب Template Tags (يشير هذا المصطلح الى مجموعة من الدوال تستخدم في جلب بيانات المقال) يمكنك استخدامها لتجنب تكرار الشيفرات البرمجية.مجموعة من تنسيقات CSS الأساسية تحتوي على توضيح لبعض فئات العناصر CSS Classes التي يولدها ووردبريس.يتبع الCoding standard الخاصة بووردبريس وموثق بصورة ممتازة، حيث يمكنك أن تتعلم الكثير منه.مجموعة من الدوال والإعدادات الأساسية في ملف functions.php.يشجع على استخدام مخصص القوالب Theme Customizer وهذا أمر مهم جدا خصوصا وأنه قبل أيام قليلة من نشر هذا المقال أصبح إستخدام مخصص القوالب لإعدادات القالب أمر إجباري لكل القوالب في مستودع القوالب الخاص بووردبريس وهذا قد يشير إلى توجه في مجتمع ووردبريس نحو المخصص ومحاولة جعلها Standerd في مسألة خيارات القالب، ولذلك في نهاية هذه السلسلة سنلقي نظرة إلى طريقة إستخدام مخصص القوالب في خيارات القالب.طريقة استخدام Underscoresفي البداية عليك التوجه لموقع القالب وقم بكتابة اسم القالب الذي تود تطويره في الخانة المخصصة ويمكنك الضغط على Advanced Options لإدخال المزيد من الخيارات مثل اسم المطور ورابط موقعه ووصف القالب، وسيقوم الموقع باستخدام هذه المعلومات ويولد لك القالب والذي سيبدأ التحميل مباشرة فور الضغط على Generate. طبعا ستجد أن المعلومات التي قمت بكتابتها تم استخدامها في الترويسة الأساسية للقالب والموجودة في ملف style.css وكذلك في اسم مجلد القالب. بعد ذلك يمكنك تنصيب القالب على الموقع الذي قمت بإعداده لتطوير القالب ومن الجيد أن تقوم بفتح مجلد القالب على محرر الشيفرات المفضل بالنسبة لك حتى تتابع معنا شرح بعض خصائص القالب. التركيبة الأساسية للقالب (المجلدات والملفات)ستلاحظ أن مجلد القالب يحتوي على الملفات الأساسية لقوالب ووردبريس وهي: Style.css, index.php, functions.php, single.php, page.php, archive.php, search.php, 404.php, header.php, footer.php, sidebar.php, comments.php, rtl.css بالإضافة الى مجموعة من الملفات التي يبدأ اسمها بـ content وهي: Content.php, content-single.php, content-page.php, content-search.php, content-none.phpوهذه الملفات تستخدم لوضع محتويات الحلقة The Loop لبعض ملفات القالب الأساسية التي تحتوي على حلقة لجلب المقالات مثل ملف single.php مثلا، حيث يتم تضمين ملف conent المناسب (مثلا content-single.php) في ملف القالب المناسب (single.php) من خلال إستخدام الدالة get_template_part وتستخدم بهذه الطريقة: <?php get_template_part( 'content', 'single' ); ?> حيث أن المعامل الأول للدالة هو بداية اسم الملف والمعامل الثاني هو نهايته (ما بعد الفاصلة) وهذا يوضح لك سبب تسمية الملفات التي تبدئ بـ content بهذه الطريقة. واستخدام هذه الدالة من الأمور الجيدة في هذا القالب لما تتميز به من مميزات وحتى تحافظ على مقروئية جيدة للشيفرة البرمجية فبدلا من وضع كل الشيفرات في ملف single.php او index.php يتم فصل محتويات الحلقة -والتي عادة ما تحتوي على الكثير من شيفرات html- في ملف لوحدها ثم تضمينها. وأيضا يمكنك استخدامها مع الدالة get_post_format لتضمين الملفات اعتمادا على بنية المقال. من الملفات أيضا في المجلد الرئيسي للقالب ملف README.md وصورة screenshot.png ولا أظن أنهما يحتاجان إلى شرح. مجلد incهذا أو المجلدات التي سنتحدث عنها ، حيث يحتوي على خمسة ملفات الجامع بينها أنه يتم تضمينها داخل ملف function.php كما ترى في نهاية هذا الملف من خلال استخدام الدالة بهذه الطريقة: require get_template_directory() . '/inc/template-tags.php'; حيث أن الدالة ()get_template_directory ترجع مسار القالب الحالي ومن الجيد استخدام دوال ووردبريس التي يوفرها فيما يتعلق بمسارات القالب، وهذه أحد الأشياء التي عليك تعلمها من قالب Underscores بالإضافة الى العديد من الممارسات الجديدة Best Practice الأخرى كما سنرى. تضمين هذه الملفات في ملف functions.php بدلا عن كتابة كل الشيفرات الوظائفية الخاصة بالقالب في ملف functions.php يجعل القالب أكثر تنظيما ويسهل التعديل عليه فيما بعد بالإضافة لفصل الدوال والشيفرات على حسب وظائفها. لاحقا سنتطرق الى تفاصيل بعض هذه الملفات بعد أن نلقي نظرة سريعة على ملف functions.php، لكن الأن دعنا نكمل الاطلاع على تركيبة القالب. مجلد jsواضح من اسمه أنه يحتوي على ملفات الجافا سكربت الخاصة بالقالب، وبه ثلاث ملفات سنطلع على وظائفها فيما الدرس القادم إن شاء الله. وبالطبع يمكنك إضافة ملفات جافا سكربت الخاصة بك في هذا المجلد. لاحظ أنك فيما بعد قد تحتاج لإضافة مجلد لملفات CSS واخر للصور وفي هذه الحالة ربما تفضل وضع هذين المجلدين مع مجلد js في مجلد جديد باسم assest أو static مثلا. بقية المجلداتكما تلاحظ هنالك أيضا مجلد language الذي به ملفات اللغة، وملف layout وهو يحتوي على ملفي CSS يستخدمان لتوفير خيارين في تخطيط الموقع، وملف sass وبه بعض الملفات المفيدة في حالة كنت تستخدم SASS. خاتمة كانت هذه مقدمة سريعة على أنواع الإطارات الخاصة بعمل قوالب ووردبريس، ونظرة على طريقة تحميل قالب _s وتركيبة الملفات والمجلدات فيه، وتبقى لنا الكثير لمعرفته حول قالب _s وإستخدامه في تطوير قوالب ووردبريس وهو ما سنتطرق إليه في المقالات القادمة من هذه السلسلة إن شاء الله.
  15. من أهم الأمور التي ينبغي على مطور ووردبريس الإلمام بها ومعرفتها هي قاعدة بيانات ووردبريس حيث أنها المستودع الرئيسي للبيانات في نظام إدارة المحتوى كما أنها تعكس التركيبة الخاصة بووردبريس وأهم محتوياته الأساسية وطريقة تمديده بصورة مثالية ويظهر هذا جليًَا عند اطلاعنا على جداول 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، كما تستطيع أيضا الوصول إلى متغيرات هذا الصّنف والتي من ضمنها جداول قاعدة البيانات التي ذكرناها سابقا. هل تفضل استخدام طريقة أخرى إذا كان الأمر كذلك فلا تنس التّحقق الجيد من البيانات قبل إدخالها واسترجاعها من قاعدة البيانات، حتى لا تحتوي الإضافة على ثغرات أمنية تسهل من اختراق الموقع. خاتمةيمكن أن نقول أننا أنهينا الجانب النّظري لبعض أساسيات ووردبريس لمطوري الإضافات، ولم يتبق لنا سوى تقديم مثال عملي لإضافة حقيقية يربط هذه المفاهيم التي تعرفنا عليها ويوضّحها بصورة أكبر، وهذا ما سنقدمه في المقال القادم إن شاء الله.