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

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

الخبر الجيد أن الووردبريس جعل هذا ممكنا باستخدام كلاس الـ WP_Query. هذا الكلاس يقدم لك العديد من التحديدات parameters و التي تستطيع أن توظفها لتحصل على المحتوى الذي تريد (و الذي لا يجب ان يكون قاصراً على التدوينات posts) و من ثم باستخدام دورة loop يمكنك عرض المحتوى بالضبط الذي تريد.

في هذه السلسلة من عشر أجزاء حول إحتراف استخدام الـ WP_Query, نصطحبك أنا و Baris Unver في جوله حول مدخلات و نواتج الـ WP_Query. لذا عند إنتهائك من دراسة هذه السلسلة, ستستطيع إستخدام الأمر في العديد من الحالات و تحسن من طريقة الإستعلامات في الووردبريس حول البيانات في قاعدة البيانات.

و في هذه المقدمة, سأقوم بتغطية هذه الأمور:

  • ما هو الـ WP_Query ؟
  • لماذا يجب أن نستخدم الـ WP_Query ؟
  • المشاكل المحتملة / و ما الذي يجب مراعاته.

ما هو الـ WP_Query ؟

الـ WP_Query هو كلاس class مقدم من قبل الووردبريس. المغزى من وراء ذلك, أنه عبارة عن كلاس class يعني أنك بإستخدامه ستتمكن من الوصول للمتغيرات و الدوال التي تمت كتابتها في هذا الكلاس في بنية الووردبريس الأساسية WordPress core, دون الحاجة للقلق حول إعادة كتابة هذا الكود بنفسك. و هذا يجعل من الكود الخاص بك أكثر كفاءة و موثوقية.

و لو أردت ان تعرف بالضبط حقيقة الأمر المكتوب في WP_Query, ربما يمكنك أن تتطلع على الكود بنفسك في الملف includes/query.php

يتكون الـ WP_Query من أربعة عناصر:

  • الـ arguments المستخدمة في الإستعلام, تستخدم محددات parameters سوف نغطيها بالتفاصيل في هذه السلسلة
  • الإستعلام نفسه
  • الدورة loop, و التي ستعرض محتويات التدوينة, كما العناوين أو أي شئ آخر تود عرضه.
  • الإنتهاء من الأمر, عبر إغلاق الـ if و دورة الـ while و إعادة ضبط بيانات التدوينة.

كتوضيح عملي, سيكون الأمر أشبه بالآتي:

<?php
$args = array(
    // arguments for your query
);

// the query
$query = new WP_Query( $args );

// The Loop
if ( $query->have_posts() ) :  while ( $query->have_posts() ) : $query->the_post() ;
  // contents of the Loop go here

endwhile : endif;
/* Restore original Post Data */
wp_reset_postdata();
?>

يمكنك أن تقوم بتحديد الـ arguments أثناء كتابة الإستعلام, و لكني أفضل تعريفها في البداية, لجعل الأمر أكثر تنسيقاً.

إعادة ضبط بيانات التدوينة

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

كمثال, لو أنك تستخدم الكلاس WP_Query لتنفيذ إستعلام في القائمة الجانيية sidebar , فأنك بإستخدام ()wp_reset_postdata بفعالية تخبر الووردبريس أنك لازلت بمكان ما في الصفحة التي يتم عرضها, و هذا من شأنه أن يجعل الإستعلام يتوافق مع الإستعلام الرئيسي للصفحة التي أنت عليها.

و لو أنك لم تفعل هذا, فإن أي إستعلام آخر في الصفحة (بما في ذلك الإستعلام الرئيسي) قد لا يتم عمله, و أي وسم conditional tag خاص بعرض نوع الصفحة التي أنت عليها لن يعمل أيضاً.

لماذا يجب أن نستخدم الـ WP_Query ؟

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

لماذا يجب أن أستخدم الـ WP_Query عوضاً عن باقي الطرق الأخرى ؟

الـ WP_Query ليس بالطريقة الوحيدة التي من شأنها تنفيذ إستعلام مخصص. هناك أربعة طرق أخرى لفعل ذلك:

  • pre_get_posts
  • ()get_posts
  • ()get_pages
  • الدالة ()query_posts (و التي يجب أن تتفادى إستخدامها, كما سأشرح لاحقاً)

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

  • الـ pre_get_posts هو عبارة عن hook و الذي يتم استخدامه لتعديل طريقة عمل الإستعلام الرئيسي. ربما يمكنك إستخدامه مع وسم conditional tag لفحص نوع الصفحة التي يتم عرضها (الصفحة الرئيسية مثلاً) و من ثم تستخدمه لتعديل الإستعلام الذي يتم تنفيذه (مثلاً, أن يتم حذف مربع آخر ثلاث تدوينات مضافة, في حالة أنك ستقوم بعرضه في مكان آخر بالصفحة) أنها الطريقة المثلى لتعديل الإستعلام الرئيسي و يجب أن تكون خيارك الأول إذا كان هذا ما تود عمله بالضبط. و مع ذلك, فإنك لا تستطيع إستخدامه في إنشاء إستعلام جديد كامل.
  • الدوال ()get_posts و ()get_pages متشابهين لدرجة كبيرة, يختلفون فقط في الأمر الواضح من اسمائهم. الوسوم الخاصة بالقوالب template tags بالفعل تستخدم الـ WP_Query , لذلك فهي تعتبر وسيلة أخرى من نفس الأمر, غير أن هنالك خطوة أخرى إضافية لأنهم هم من يستدعون الـ WP_Query بدلاً عنك. ربما يمكنك إستخدامهم للإستعلام عن التدوينات posts أو الصفحات pages , في الوقت الذي يكون إستخدام الـ WP_Query نفسه أفضل و يترك لك المجال للإستعلام عن كل الأشياء تقريباً الموجودة داخل قاعدة البيانات.
  • الدالة ()query_posts تعدل من الإستعلام الرئيسي , و لكن يجب عدم إستخدامها لا في الاضافات plugins أو القوالب templates. و ذلك لأنها تقوم بحذف الإستعلام الرئيسي بالكامل, و تبدأ الأمر كله من جديد. أي أنها تستبدل الإستعلام الرئيسي في الصفحة, بواحد جديد. و كما أنها معرضة لإرتكاب الأخطاء, خاصة مع خاصية ترقيم الصفحات pagination, و غير فعالة و ستؤثر على وقت تحميل الصفحة. لذا فإذا أردت أن تعدل من الإستعلام الرئيسي, استخدم pre_get_posts, و إذا أردت أن تنشئ إستعلام كامل جديد, استخدم WP_Query

المخطط بالأسفل, المنشور من قبل Andrey “Rarst” Savchenko تحت رخصة الابداع الشائع, يفسر الأمر بشكل منطقى أكثر:

Make Sense of WP_Query Functions

متى يمكنك إستخدام الـ WP_Query

هناك العديد من الحالات التي تكون الـ WP_Query مفيد في استخدامه, و بالطبع لا يمكنني تغطية كل شئ هنا, و لكن إليك نظرة عامة:

  • لإضافة قائمة بالتدوينات المتعلقة related posts بتدوينة يتم عرضها حالياً – كمثال, أن تظهر قائمة لكل التدوينات المندرجة تحت نفس القسم.
  • لتشغيل دورتين two loops في نفس الصفحة: كمثال, صفحة "الأسئلة الشائعة" هذه , يظهر فيها عناوين الأسئلة بالأعلي, و محتوى الأسئلة بالأسفل.
  • لعمل قائمة مخصصة لآخر التدوينات في القائمة الجانبية sidebar أو في ذيل الصفحة footer. عندما يكون مربع أخر التدوينات Recent Posts Widget الإفتراضي لا يلبي متطلباتك بالضبط.
  • لعمل استعلامات مخصصة عن التصنيفات taxonomies , مستخدماً أكثر من تصنيف لتعريف ما يجب أن يتم عرضه.
  • للإستعلام عن أنواع التدوينات post types و التي لا يتم عرضها عبر الاستعلام الافتراضي, كـالمرفقات مثلاً.
  • لعمل صفحات مخصصة مع عدد من الإستعلامات لعرض محتويات مختلفة, كما قمت بإنجازه في هذا المثال لعميل لدي.

بعض المحاذير

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

  • إذا كان كل ما تحتاجه هو تغيير طريقة عرض التدوينات من أجل نوع محتوى معين أو للأرشيف, لا تستخدم الـ WP_Query. بدلاً من ذلك, أنشئ ملف قالب template file لأجل هذا الأرشيف أو نوع المحتوى المعين, و غير من طريقة الـدورة loop في هذا الملف.
  • إذا أردت أن تعرض عدد أقل أو أكثر من التدوينات التي تظهر إفتراضياً في صفحة أرشيف (كمثال, لا تريد اظهار تدوينات قسم معين), لا تستخدم WP_Query لعمل استعلام كامل جديد. بدلاً من ذلك, استخدم pre_get_posts لتعديل الإستعلام الرئيسي, بالإضافة لإستخدامك لوسم conditional tag لتحدد بالضبط أين تريد لذلك أن يتم.
  • كن حذراً بشأن تنفيذ العديد من الإستعلامات بنفس الصفحة. نظرياً, يمكنك إنشاء المئات من الإستعلامات في نفس الصفحة, و لكن فكر في الحمل الثقيل على الخادم server load. إذا كنت تفكر في تنفيذ أربع أو خمس إستعلامات في نفس الصفحة, ربما يمكنك أن تنفذ الأمر عبر عدد من الصفحات الإضافية.

أخيراً

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

في باقي هذه السلسلة, سوف نأخذك في جولة بالتفصيل حول كيف يمكنك أن تستخدم الـ WP_Query و تحصل على أقصى فائدة من استخدامه.