شرح الصف WP_Query في ووردبريس

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

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

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

ما هو WP_Query في ووردبريس؟

WP_Query هو عبارة عن صف برمجي يفيد مطوري ووردبريس بشكل كبير في الاستعلام من قاعدو بيانات الموقع، وهو يوجد بشكل ملف باسم calss-query-wp وبالامتداد php. داخل المجلد wp-includes ضمن المجلد الجذر لأي موقع ووردبريس.

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

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

ما معنى كلمة استعلام؟

الاستعلام (Query) هو مصطلح يعني التخاطب مع قاعدة البيانات لطلب بيانات وفق شروط محددة من جدول أو مجموعة من الجداول الموجودة فيها. يعيد هذا الطلب نتائج الاستعلام وهي عبارة عن كافة سجلات البيانات التي تحقق هذه الشروط. هناك عدة لغات للقيام بالاستعلام لكن اللغة الأكثر استخدامًا وشهرة هي لغة الاستعلام البنيوية (SQL). 

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

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

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

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

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

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

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

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

new WP_Query('category_name=طعام');
new WP_Query('author_name=Omar');

حيث يملك الصف WP_Query العديد من البرمترات التي يمكن تمريرها له عند إنشائه والتي تتيح لك تخصيص الاستعلام بالطريقة التي تريدها.

هذه البرامترات تعتبر كخصائص أو فلاتر للبيانات التي نريد الاستعلام عنها كنوع المنشور post_type  أو اسم كاتب  المنشور post_author أو تصنيف المنشور category_name  أو تاريخ النشر post_date أو محتوى المنشور the_content أو غيرها من الخصائص البسيطة التي تكون مخزنة في المتحول العام $post في ووردبريس.

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

خطوات استخدام WP_Query في ووردبريس؟

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

بعدها عليك اتباع الخطوات العامة التالية: 

1- يجب أن تقوم بإنشاء غرض من الصف WP_Query وتمرر له  البارامتر أو مجموعة البارامترات التي تريد منه الاستعلام عنها.

2-يجب تخزين نتائج الاستعلام في متغير ما ويمكن تسميته بأي اسم تختاره. 

3- عليك بعد ذلك المرور عبر عناصر هذا المتغير من (خلال حلقة تكرارية) للانتقال عبر كافة النتائج التي قام بإرجاعها واحدة تلو الأخرى وطباعتها أو عرضها في الموقع. 

4-يمكن كتابة الخطوات البرمجية السابقة في أي ملف من ملفات موقعك تريده أن يعرض هذه البيانات (في الغالب يكتب في  أحد ملفات القالب أو ملفات الإضافة) حسب حاجة المطور. 

فيما يلي أمثلة عملية توضح كيفية إجراء الخطوات السابقة. 

مثال 1: استعلام wp_query لجلب كافة المنشورات التي لها تصنيف معين 

كما ذكرنا في الفقرات السابقة يمكن لهذا الصف الاستعلام عن أي معلومات تريدها في موقعك، ولكنه يستخدم في المقام الأول للاستعلام عن المقالات.

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

1- سننتقل بداية إلى مجلد القالب المثبت على موقعنا وننشئ بداخله ملف نموذج جديد للقالب المستخدم في موقعنا وليكن باسم  (customfoodtemplate.php)

2- نفتح هذا الملف في أي محرر كود، وننشئ بداخله غرض من الصف wp_query ونمرر له اسم التصنيف category_name كبرامتر ونخزن النتائج  في متغير وليكن $the_query كما يلي: 

<?php
/* Template Name: Custom Food Template */
// The Query
$the_query = new WP_Query( 'category_name=طعام' );
?>

هنا هيأنا البرامتر بالقيمة category_name=طعام لأننا نريد من الصف أن يستعلم أويحضر من قاعدة البيانات كافة المنشورات في موقعنا التي يكون اسم التصنيف لها هو طعام.

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

 وبما أننا قمنا في الكود السابق بتخزين المقالات في المتغير  $the_query مؤقتًا، فسنكتب الآن كود يعرض قائمة كافة هذه المقالات التي تم الحصول عليها من خلال الحلقة التكرارية while  كما يلي: 

<?php /* Template Name: Custom Food Template */
 
// The Query
$the_query = new WP_Query( 'category_name=طعام' );
 
// حلقة تكرارية تمر عبر كافة المنشورات التي حصلنا عليها
if ( $the_query->have_posts() ) {
        echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
        echo '</ul>';
} else {
    // لم يتم الحصول على أي منشورات 
 
}
/* Restore original Post Data */
wp_reset_postdata();
 
?>

لاحظ أن حلقة while هنا قامت باستخدام التابع have_posts() كشرط لبدء التنفيذ. هذا التابع يتحقق فيما إذا كانت هناك بيانات في المتغير  $the_query  ليتم عرضها.

إذا كانت هناك بيانات فهذا بدوره سيؤدي هذا إلى تشغيل كود الحلقة التكرارية. وفي كل تكرار يتم استدعاء التابع the_post() وهو عبارة عن وظيفة في الصف WP_Query تحوي فهرس المنشورات التي تم إرجاعها في الاستعلام (post indexes) وفي كل تكرار للحلقة يحصل على فهرس أو دليل المنشور التالي. 

بعدها سنقوم بطباعة عنوان هذا المنشور ضمن لائحة من خلال استدعاء الطريقة the_title()

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

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

4-لاستعراض نتائج الاستعلام سننتقل الأن للوحة  تحكم الموقع< ونختار صفحات< أضف جديد< وسوف نكتب عنوان للصفحة وليكن (Our Custom Food).

5-من قسم خصائص الصفحة نحدد من القائمة المنسدلة نموذج  النموذج الخاص بالصفحة ليكون Custom Food Template  لتجاوز الاستعلام الرئيسي للصفحة كما هو مبين في الصورة التالية.

6- الآن إذا انتقلت لرابط هذه الصفحة لاستعراضها ستحصل على  النتيجة التالية: 

7-يمكن تعديل كود الملف Customfoodtemplate.php بإستدعاء الطريقتين get_header() في البداية وget_footer() في النهاية بحيث تضيف للصفحة السابقة الترويسة والتذييل للقالب الأساسي للموقع كما يلي:

<?php /* Template Name: Custom Food Template */
get_header();
 
// The Query
   // Define our WP Query Parameters 
   $query_options = array(
    'category_name' => 'طعام',
    'posts_per_page' => 3,); 
$the_query = new WP_Query( $query_options ); 
while ($the_query -> have_posts()) : $the_query -> the_post(); 
// Display the Post Title with Hyperlink
 the_title(); 
 
// Display the Post Excerpt
 the_excerpt(__('(more…)')); 
// Repeat the process and reset once it hits the limit
endwhile;
wp_reset_postdata();
 get_footer();
 
?>

ستكون صفحة النتائج بعد هذا التعديل بالشكل التالي:

هذا كان مثالًا بسيطًا على استخدام الصف WP_Query  ببرامتر واحد، وهناك العديد من الخيارات الأخرى التي يمكن استخدامها لتوسيع ميزات هذا الصف كما ذكرنا.

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

مثال 2: استعلام wp_query لعرض أحدث المنشورات في ووردبريس

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

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

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

<?php /* Template Name: Custom Food Template */
get_header();
 
// The Query
   // Define our WP Query Parameters 
   $query_options = array(
    'category_name' => 'طعام',
    'posts_per_page' => 3,); 
$the_query = new WP_Query( $query_options ); 
while ($the_query -> have_posts()) : $the_query -> the_post(); 
// Display the Post Title with Hyperlink
 the_title(); 
 
// Display the Post Excerpt
 the_excerpt(__('(more…)')); 
// Repeat the process and reset once it hits the limit
endwhile;
wp_reset_postdata();
 get_footer();
 
?>

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

حيث يبدأ الكود بتعريف بارامترات الاستعلام ويخزنها في مصفوفة برامترات باسم $query_options تحتوي بداخلها على برامترين هما (اسم التصنيف  category_name، وعدد المقالات المطلوبة posts_per_page).

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

لماذا يعتبر WP_Query أفضل من الطرق الأخرى للاستعلامات المخصصة؟

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

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

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


بعض الأسئلة الشائعة حول WP_Query في ووردبريس

فيما يلي نجيب على أهم التساؤلات التي قد تتبادر لذهن المطور حول هذا الصف البرمجي:

س1: متى أتجاوز الاستعلام الرئيسي لصفحة ما باستعلام فرعي، ومتى أكتب استعلام رئيسي جديد بالكامل؟

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

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

س2:هل هناك سلبيات لاستخدام الصف WP_Query؟ 

من الناحية النظرية يمكنك استخدام الصف  WP_Query بشكل آمن وفعال للاستعلام عن أي شيء تريده تقريبًا وعن  أي عدد من الاستعلامات في نفس الصفحة في موقعك.

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

خاتمة

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

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

إذا كانت لديك استفسارات حول طريقة كتابة استعلامات معينة في ووردبريس باستخدام هذا الصف، اتركها لنا في قسم التعليقات أسفل المقال. كما نقترح عليك الاطلاع على  موقع WordPress Codex فهو مفيد لأي مطور يرغب في تعلم المزيد حول الاستعلامات المخصصة وحول تطوير ووردبريس بشكل عام.

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