اذهب إلى المحتوى

الدليل الشامل في استخدام استعلامات WP_Query


Bian Alabras

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

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

ماهو استعلام الوورد بريس؟

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

كما ننوّه إلى أن ذكرنا لكلمة استعلام query، أو استعلام وورد بريس wordpress query نقصد بها الاستعلام الذي يقوم باسترجاع بعض المواضيع posts من قاعدة البيانات الخاصة بالوورد بريس.

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

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

وبالتالي نجد أن أي صفحة افتراضية نُحمّلها تحوي في الغالب على استعلام يُجرى تلقائيًا.

الحلقة: كيفية استخدام الاستعلامات

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

يمكن شرح هذه الآلية من خلال الأسطر البرمجية:

<?php if ( have_posts() ) : ?>
	<?php while ( have_posts() ) : the_post() ?>
	<div <?php post_class() ?>>
		<h2><?php the_title() ?></h2>
		<?php the_content() ?>
	</div>
	<?php endwhile ?>
<?php else : ?>
	<h2>Ooops, no posts here!</h2>
<?php endif ?>

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

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

أما تابع ()the_post فإنه هو المسؤول عن معالجة حالة "هل يوجد مواضيع أخرى بعد الموضوع الحال أم لا".

وفي النهاية عند المرور على جميع المواضيع، تُنفّذ تعليمة else وهي إظهار نص محدد قد يشير كما في المثال السابق إلى انتهاء المواضيع.

الآن قبل المتابعة في هذه المقالة، أود توضيح بعض المصطلحات التي مرت معنا، أولا مصطلح الحلقة "the loop" والذي يستخدم لوصف حلقة تمر على قائمة مو المواضيع الموجودة في الصفحة والمنشورة على الوورد بريس، لنستعرض مثالًا توضيحيًا، في حال كان لدينا قسم في المدونة نستعرض فيه المواضيع المتعلقة بمدونتنا والتي نستعرضها في قسم "Related articles on our blog"

001.JPG

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

بناء استعلام مخصص

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

<?php 
$args = array(
	'author_name' => 'danielpataki',
	'category_name' => 'wordpress'
);
$author_posts = new WP_Query( $args );
if ( $author_posts->have_posts() ) : 
?>
	<?php while ( $author_posts->have_posts() ) : $author_posts->the_post() ?>
	<div <?php post_class() ?>>
		<h2><?php the_title() ?></h2>
		<?php the_content() ?>
	</div>
	<?php endwhile ?>
<?php else : ?>
	<h2>Ooops, no posts here!</h2>
<?php endif ?>

يتعامل القسم الأول من التعليمات مع الاستعلام في قاعدة البيانات حيث ترى أنني قمت ببناء غرض WP_Query من خلال تمرير مجموعة من المعاملات arguments، ولكن لاتقلق في حال لست من المهتمين بالبرمجة غرضية التوجه لأننا سنستخدمها بطريقة بسيطة جدًا، حيث مررنا اسم المؤلف من خلال المعامل author_name والفئة المختارة من خلال المعامل category_name.

الآن لترتيب هذه المواضيع ضمن قائمة واحدة نحتاج إلى تعديل الحلقة قليلًا وذلك من خلال استخدام التوابع الخاصة بالغرض WP_Query بدلًا من استخدام التوابع ()have_post و ()the_post وذلك يعني أن نسبق اسم التابع باسم المتغير بالشكل ()variable_name->function$.

مع العلم أنني لن أعرض الحلقة في الأمثلة التالية وذلك لأن الفكرة نفسها ستتكرر دومًا، والآن اسم متغيرنا هو $custom_post  لذلك سنستخدم التوابع ()custom_posts->have_post$ و ()custom_posts->the_post$.

معاملات WP_Query

إن بناء استعلام مخصص يعتمد بالأساس على تغيير المعاملات parameters، ومن الأمثلة على الاستعلامات المخصصة استعلام الحصول على المواضيع من تاريخ محدد، المؤلفين، نمط نشر معين، تصنيفات مخصصة، وحالات وأمور أخرى.

الآن لنلق نظرة على جميع المعاملات من خلال بعض الأمثلة الأساسية البسيطة.

معامل المؤلف Author Parameters

يوجد أربع طرق مختلفة يمكن استخدامها لتجميع المؤلفين، حيث أن المعامل author يقبل رقم تعريفي وحيد لمؤلف محدد، أو قائمة من الأرقام المعرفة للمؤلفين مفصولة عن بعضها بفاصلة، كما يمكن استخدام السالب أمام الأرقام التعريفية للمؤلفين لاستبعادها من ناتج الاستعلام:

// Posts from the author with the ID of 42
$args = array(
	'author' => 42 
);

// All posts except the ones from author 42
$args = array(
	'author' => -42
);

// Posts from author 42, 38 and 55
$args = array(
	'author' => '42,38,55'
);

// Posts from everyone except author 42 and 38
$args = array(
	'author' => '-42,-38'
);

يمكن استخدام المعامل author_name في حال كنا نريد تمرير اسم المؤلف بدلًا من رقمه التعريفي، ولكن من المهم الانتباه إلى استخدام اسم المستخدم username الصحيح.

$args = array(
	'author_name' => 'danielpataki'
);

المعاملان المتبقيان والمتعلقان بالمؤلف هما author_in و author_not_in حيث أُضيف هذين المعاملين في النسخ اللاحقة من الوورد بريس في 3.7 حيث تعرّف المؤلفين من خلال إدخال أرقام المؤلفين على شكل مصفوفة.

// Posts from author 42, 38 and 55
$args = array(
	'author__in' => array( 42, 38, 55 ) 
);

// Posts from everyone except author 42 and 38
$args = array(
	'author__not_in' => array( 42, 38 ) 
);

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

حالة استخدام: إعداد قائمة بمقالات المؤلفين الأعلى تصنيفًا

لنلق نظرة على كيفية بناء قائمة بمقالات المؤلفين الأعلى تصنيفًا. حيث نفترض أن لدينا نظام تصنيف في مكان ما يُخزن فيه التقييم العالمي لكل مؤلف ضمن جدول أساسي مع معرف خاص به هو التصنيف rating، ونستيطع الحصول على المطلوب من خلال ‏التابع ()get_user الذي يحوي حلقة مخصصة لجمع مشاركات المؤلفين الأعلى تصنيفًا وإعادتها كخرج للتابع المذكور.

<?php 
$args = array(
	'meta_key'     => 'rating',
	'meta_value'   => 4,
	'meta_compare' => '>',
	'fields'       => 'id',
); 
$top_users = get_users( $args );
$args = array(
	'author__in' => $top_users;
); 
$top_author_posts = new WP_Query( $args );
 
?>

معامل الفئة Category Parameters

يمكن تقييد إضافة المواضيع على أساس الفئة باستخدام ما لا يقل عن خمس توابع منفصلة.

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

// Posts from the category with the ID of 42
$args = array(
	'cat' => 42 
);

// All posts except the ones from category 42
$args = array(
	'cat' => -42
);

// Posts from categories 42, 38 and 55
$args = array(
	'cat' => '42,38,55'
);

// Posts from all categories except 42 and 38
$args = array(
	'cat' => '-42,-38'
);

من الأفضل عدم استخدام category_name وذلك لأن اسم الفئة غالبًا يستخدم في توليد رابط URL الخاص بالمقالة، من خلال استخدام اسم الفئة وعنوان المقالة مع بعض التعديلات الخاصة مثل تحويل جميع الأحرف إلى أحرف صغيرة، وحذف جميع الكلمات الخاصة، واستبدال الفراغات بـ (-)، فمثلًا الفئة المخصصة لمراجعات الكتب والمسماة "Book Reviews" غالبًا ستجد قسم من رابط المقالة يحوي على "book-reviews".

$args = array(
	'category_name' => 'book-reviews'
);

كما يمكننا استخدام مصفوفة من الفئات تحوي ثلاثة معاملات هي category_in، و category_not_in والتي تماثل في طريقة عملها مماثلاتها في معامل author، حيث يمكن من خلالها التأكد من أن المواضيع التي تم تحديدها من خلال الفئات المدخلة فقط هي التي استُرجِعت بواسطة الاستعلام.

$args = array(
	's' => 'awesome+wordpress+plugins',
	'posts_per_page' => 8
);
$results = new WP_Query( $args );

echo "A total of " . $results->found_posts . " posts were found.<br />";
echo "We will be displaying " . $results->query_vars['posts_per_page'] . " posts per page if possible.<br />";
echo "We need a total of " . $results->max_num_pages . " pages to display the results".

حالة استخدام: الحصول على مقالات الفئات الأكثر استخدمًا

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

$args = array(
	'number' => 5,
	'orderby' => 'count',
	'order' => 'DESC',
	'fields' => 'ids'
);
$top_categories = get_terms( array( 'category' ), $args );

$args = array(
	'category__in' => $top_categories;
); 
$top_category_posts = new WP_Query( $args );

معامل الوسم Tag Parameters

يمرر لمعامل الوسم خمس متغيرات هي tag، tag_id، tag_and، tag_in، tag_not_in نلاحظ وجود ثلاث منها ذُكرت مع المعاملات السابقة، وسنشرحها من خلال المثال:

// Posts from the tag named "Awesome Colors"
$args = array(
	'tag' => 'awesome-colors'
);

// Posts from the tag named "Awesome Colors" or "Awesome People"
$args = array(
	'tag' => 'awesome-colors,awesome-people'
);

// Posts from the contain both "Awesome Colors" and "Awesome People"
$args = array(
	'tag' => 'awesome-colors+awesome-people'
);

// Posts from the tag with the ID of 23
$args = array(
	'tag_id' => 23
);

// Posts from tag 42, 38 and 55
$args = array(
	'tag__in' => array( 42, 38, 55 ) 
);

// Posts from all tags except 42 and 38
$args = array(
	'tag__not_in' => array( 42, 38 ) 
);

// Posts that are assigned both tag 42 and 38
$args = array(
	'tag__and' => array( 42, 38 ) 
);

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

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

ولتسهيل الأمور أكثر في التعامل مع الوسوم يوجد أيضًا معاملين آخرين هما tag_slug_and و tag_slug_in ويكون التعامل معها بالشكل التالي:

// Posts from the tag named "Awesome Colors" or "Awesome People"
$args = array(
	'tag_slug__in' => array( 'awesome-colors', 'awesome-people' )
);

// Posts from the contain both "Awesome Colors" and "Awesome People"
$args = array(
	'tag_slug__and' => array( 'awesome-colors', 'awesome-people' )
);

حالة استخدام: الدمج بين معاملات الوسم، الفئة، المؤلف

بما أننا تعرفنا على بعض المعاملات يمكننا الدمج فيما بينها ضمن استعلام واحد، على سبيل المثال لنجمع المقالات المتميزة (التي أُضيف لها وسم "featured") لمؤلفين محددين وذلك في فئتي الكتب والأفلام.

$args = array(
	'tag' => 'featured',
	'category__in' => array( 43, 52 ),
	'author__in' => array( 255, 930 )
);
$author_featured_posts = new WP_Query( $args );

أنواع المواضيع Post Type

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

يسمى المعامل المخصص للتعامل مع أنواع المواضيع الجديدة post_type والذي يساعدنا في تحديد النوع الذي ينتمي له الموضوع المُراد نشره.

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

// Return posts with the 'page' post type
$args = array(
	'post_type' => 'page'
);

// Return posts from two custom post types
$args = array(
	'post_type' => array( 'product', 'post' )
);

// Returns posts from all post types
$args = array(
	'post_type' => 'any'
);

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

في حال استخدام المعامل tax_query (سنتكلم عنه لاحقًا) ستصبح القيمة الافتراضية هي any.

حالة المنشور Post Status

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

تحوي الوورد بريس على ثماني حالات مبنية في النواة هي:

  • publish الموضوع Post أو الصفحة page منشورة
  • pending الموضوع قيد الانتظار للمراجعة
  • draft الموضوع حُفظ كمسودة
  • auto-draft الموضوع المُنشأ حديثًا ولكن بدون محتوى
  • future موضوع سينشر في المستقبل
  • private ليس معروضًا أمام المستخدمين غير المسجلين الدخول
  • inherit مراجعة (له علاقة بـ get_children)
  • trash الموضوع في سلة المهملات (هذه الحالة متاحة في النسخة رقم 2.9)

يمكننا أيضًا استخدام القيمة any لنقول بأننا نريد تضمين جميع حالات الموضوع، أما القيمة الافتراضية فهي Publish لذلك من الأفضل أن تتأكد بأنك حددت الحالة في حال كنت ترغب بحالة مختلفة.

حالة استخدام: الإعلان عن المنتجات القادمة

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

في هذه الحالة لاتحتاج إلى نشر الكتب على شكل مواضيع ثم استخدام بعض الخدع لتستثنيها من العرض حتى يُؤمّن ويستطيع المستخدم طلبها، يمكنك فقط ترتيب قائمة مباشرة بها بالشكل التالي:

$args = array(
	'post_status' => 'future',
	'post_type' => 'product',
	'category_name' => 'books'
);

معامل البحث The Search Parameter

يسمى المعامل الخاص بعملية البحث s، ويأخذ قيمة نصية string هي نفسها المُستخدمة في عملية البحث داخل الموضوع. ولكن يجب تأكد من ترميز العبارة النصية المُستخدمة في البحث، حيث يمكنك القيام بذلك من خلال استخدام التابع urlencode الموجود في PHP والذي يساعدك في تحديد عدد الفراغات والمحارف الخاصة الأخرى وتحويل العبارة إلى كلمات يمكن البحث عنها.

$args = array(
	's' => 'awesome+wordpress+plugins'
);

حالة استخدام: البحث في موضوع فرعي

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

// Show posts about ACF (Advanced Custom Fields) from the news category
$args = array(
	's' => 'ACF',
	'category_name' => 'news'
);

// Search an author's posts
$args = array(
	's' => 'custom post types',
	'author_name' => 'danielpataki'
);

// Search an array of custom post types
$args = array(
	's' => 'wordpress',
	'post_type' => array( 'project', 'portfolio' )
);

المواضيع المحمية بكلمة مرور

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

في جميع الحالات التي تجعلك ترغب بإضافة كلمة مرور للموضوع الخاص بك، يمكنك استخدام المعامل has_password لتحديد فيما إذا كنت ترغب بإدراج الموضوع إلى قائمة المواضيع المحمية بكلمة المرور.

يمكن أن يُمرَّر للمعامل has_password قيمة true عندها سيقوم الاستعلام بجمع المواضيع التي تم إعطاؤها كلمة مرور، أو قيمة false وبذلك يختار الاستعلام المواضيع التي لم تُزود بكلمة مرور، ولكن في حال كانت قيمة المعامل محذوفة أو تم إسناد null لها عندها ستُنشر جميع المواضيع.

كما يمكن استخدام المعامل post_password من أجل إعداد قائمة بالمواضيع المحمية بكلمة مرور محددة.

// Return only password protected posts
$args = array(
	'has_password' => true
);

// Return posts protected with the password: qweasd
$args = array(
	'post_password' => 'qweasd'
);

حالة استخدام: لعبة صيد الكنز أونلاين

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

$args = array(
	'post_type'    => 'clue',
	'post_password' => 'treasurehunt2015'
);

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

تضمين، استبعاد، واستهداف مواضيع محددة

يوجد تسعة معاملات مختلفة تُستخدم للحصول على مواضيع معينة في الاستعلام:

  • المعامل p: يُستخدم في تجميع المواضيع بالاعتماد على معرف الموضوع ID.
  • المعامل name: يُستخدم في تجميع تجميع المواضيع من خلال تمرير slug كقيمة نصية له.
  • المعاملين page_id و page_name: الأول يشبه معامل p والثاني يشبه name ولكنها تعمل بالنسبة للصفحات، مع بعض الاختلاف بينهما.
  • حيث سيعملان بشكل متشابه تمامًا في حال تم تحديد قيمة للمعامل post_type أما في حال عدم تحديد هذه القيمة فإن معامل page_id سيعمل كما هو مُتوقع منه على عكس معامل p
  • المعاملين post_in و post_not_in: تعمل بنفس الطريقة التي تعمل بها شبيهاتها مع الفئات والوسوم حيث تقبل تمرير مصفوفة من مُعرِّفات المواضيع.
  • المعامل post_parent: يأخد معِّرف وحيد عندها يقوم الاستعلام بإعداد قائمة بالمواضيع التي تكون أبناء تابعة للموضوع المُحدد بالمعرف المذكور.
  • المعاملين post_parent_int و post_parent_not_int: كما في شبيهاتها يُمرَّر لها مصفوفة من معرِّفات المواضيع.

من المهم الأخذ بالحسبان نوع المنشور post_type عند التعامل مع هذه المعامل، ففي حال قمت بتضمين المُعرِّفات لمجموعة من أنواع المواضيع عندها ستحتاج لتمرير القيمة any للمعامل post_type، أو تدخل النوع المحدد الذي تبحث عنه.

// Grab post 532 only
$args = array(
	'p' => 532
);

// Grab the post with the given slug
$args = array(
	'name' => 'guide-to-wp-query'
);

// Retrieve page 55
$args = array(
	'page_id' => 55
);

// Retrieve the about page
$args = array(
	'pagename' => 'about'
);

// Get the specified 5 posts
$args = array(
	'post__in' => array( 31, 36, 39, 91, 119 )
);

// Get all posts except the specified 5 
$args = array(
	'post__not_in' => array( 31, 36, 39, 91, 119 )
);

// Get all child posts of post 6
$args = array(
	'post_parent' => 6
);

// Get posts which are the children of the listed posts
$args = array(
	'post_parent__in' => array( 6, 23, 55 )
);

// Get posts which do not have the listed parents
$args = array(
	'post_parent__not_in' => array( 6, 23, 55 )
);

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

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

global $post;
$args = array(
	'post_parent' => $post->ID,
	'post_type' => 'attachment',
	'post_status' => 'any'
);

استعلامات التصنيف

بعد أن تعرفنا بشكل مفصل عن المعاملات المُستخدمة في الاستعلام وكيفية التعامل معها، يمكننا الانتقال إلى موضوع متقدم أكثر هو tax_query.

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

سنأخذ نظرة عامة في المثال المقتبس من WordPressCodex:

$args = array(
	'post_type' => 'post',
	'tax_query' => array(
		array(
			'taxonomy' => 'movie_genre',
			'field'    => 'slug',
			'terms'    => array( 'action', 'comedy' ),
		),
		array(
			'taxonomy' => 'actor',
			'field'    => 'id',
			'terms'    => array( 103, 115, 206 ),
			'operator' => 'NOT IN',
		),
		'relation' => 'AND',
	),
);

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

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

يحوي كل شرط في استعلام التصنيف على ثلاثة معاملات خاصة به هي:

  • taxonomy : يُحدَّد من خلاله المقطع slug الخاص بالتصنيف.
  • field : يمكن من خلاله الاختيار فيه بين المعاملات الثلاثة وهي term_id، أو name أو slug.
  • operator : يستخدم لتحديد كيفية التعامل مع المصطلحات المتواجدة في الشرط، حيث IN سيسمح لأي من المواضيع التي تنتمي لأي من الشروط المدرجة بالتواجد في القائمة النهائية، أما NOT IN سيسمح لأي من المواضيع التي لاتتضمن أيًا من الشروط المدرجة، أما AND فسيسمح للمواضيع التي تحقق جميع الشروط المدرجة.
  • Include_children : يحدد فيما إذا كان بالإمكان السماح  أو عدم السماح بتضمين المواضيع التي تنتمي للتصنيف الابن في التصنيفات الهرمية

حالة استخدام: تصفية محتوى متقدمة

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

$args = array(
	'post_type' => 'book',
	'tax_query' => array(
		array(
			'taxonomy' => 'mood',
			'field'    => 'slug',
			'terms'    => array( 'negative', 'bad', 'sad' ),
			'operator' => 'NOT IN'
		),
		array(
			'taxonomy' => 'genre',
			'field'    => 'slug',
			'terms'    => array( 'comedy', 'romance' ),
			'operator' => 'NOT IN',
		),
		'relation' => 'AND',
	),
);

في هذه الحالة بالتحديد يريد المستخدم النظر إلى جميع الكتب التي تحوي أفكار إيجابية(التي لاتحوي على وسوم سلبية تم إعطاؤها إياها) ولكن لايمكن أن تكون مُصنفة ككتب كوميدية أو رومانسية.

الاستعلامات من نمط Meta Query

تشبه بنية الاستعلام من نمط Meta query استعلام التصنيف. حيث يُسمح للاستعلام عن المواضيع بالاعتماد على القيم الخاصة بها من الجداول التعريفية الأساسية الخاصة بالوورد بريس meta table. يقدم الوورد بريس أربع معاملات يمكن استخدامها هي meta_key، meta_value، meta_value_num، و meta_compare ولكن يمكن استبدالها بالمعامل meta_query وهو الأفضل. لنلق نظرة على المثال:

$args = array(
	'post_type'  => 'book',
	'meta_query' => array(
		array(
			'key'     => 'pages',
			'value'   => 500,
			'compare' => '>',
			'type' => 'NUMERIC'
		),
	),
);

في هذا المثال يقوم استعلام meta query باسترجاع الكتب التي عدد صفحاتها أكثر من 500 صفحة. يُعتبر هذه الطريقة أسهل بكثير من استخدام استعلام التصنيف.

لنتعرف أكثر على المعاملات الفرعية الموجودة في المثال السابق:

  • key: مفتاح الحقل المُدخل
  • value: القيمة التي نبحث عنها
  • compare: نوع عملية المقارنة ويمكن أن تكون أحد قيم المساواة(=)، اللامساواة (!=) أكبر (>)، أكبر أو يساوي (>=)، أصغر (<)، أصغر أو يساوي (<=)، يشابه (LIKE)، لايشبه(NOT LIKE)، داخل(IN)، ليس ضمن (NOT IN)، بين (BETWEEN)، ليس بين (NOT BETWEEN)، موجود (EXISTS)، وليس موجود (NOT EXISTS).
  • type: نوع البيانات الموجودة في الحقل. ومن الممكن نوع القيمة ‘NUMERIC‘, ‘BINARY‘، ‘CHAR‘، ‘DATE‘، ‘DATETIME‘، ‘DECIMAL‘، ‘SIGNED‘، ‘TIME‘، ‘UNSIGNED‘.

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

حالة استخدام: المواضيع المُرفقة بصور مميَّزة

يوجد الكثير من الطرق لاستخدام استعلام meta queries. من أهم الأمثلة عليه هي جمع المواضيع التي تحوي صور مميزة. كل معرف ID للصور المميزة يخزّن في أحد الجداول التعريفية الأساسية للوورد بريس باسم _thumbnail_id ويمكن من خلال استعلام meta query للبحث عن المواضيع التي تكون فيها قيمة هذا المفتاح المعرف meta key الذي لايكون فارغًا.

$args = array(
	'meta_query' => array(
		array(
			'key'     => '_thumbnail_id',
			'value'   => '',
			'compare' => '!=',
		),
	),
);

استعلامات التاريخ

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

لنتعرف أولًا على المعاملات الخاصة بالتاريخ، والمقتبسة من WordPressCodex:

  • year - وهي عبارة عن السنة مؤلفة من 4 أرقام مثل 2011.
  • month - رقم الشهر من 1 إلى 12.
  • week - رقم الأسبوع ضمن السنة من 0 إلى 53.
  • day - رقم اليوم ضمن الشهر من 1 إلى 31.
  • hour - الساعة من 0 إلى 23.
  • minute - الدقيقة من 0 إلى 59.
  • second - الثانية من 0 إلى 59.
  • after - التاريخ الذي نريد استرجاع المواضيع بعده. حيث يمرر التاريخ من خلال ()strtotime والذي يمكن أن يأخذ التاريخ كقيمة نصية أو من خلال مصفوفة تحوي القيم السنة ‘year‘، الشهر ‘month‘، واليوم ‘day‘ على النحو التالي:
    • year – تقبل السنة بصيغة الأربع أرقام ولكن القيمة الافتراضية هي أن تكون فارغة.
    • month - الشهر من السنة ويقبل الأرقام من 1 إلى 12 والقيمة الافتراضية هي 12.
    • day - هو اليوم من السنة وتأخذ قيمة من 1 إلى 31 أما القيمة الافتراضية هي آخر يوم من الشهر.
  • before - التاريخ الذي نريد استرجاع المواضيع التي قبله. حيث يمرر التاريخ من خلال ()strtotime والذي يمكن أن يأخذ التاريخ كقيمة نصية أو من خلال مصفوفة تحوي القيم السنة ‘year‘، الشهر ‘month‘، واليوم ‘day‘ على النحو التالي:
  • year – تقبل السنة بصيغة الأربع أرقام ولكن القيمة الافتراضية هي أن تكون فارغة.
  • month - الشهر من السنة ويقبل الأرقام من 1 إلى 12 والقيمة الافتراضية هي 1.
  • day - هو اليوم من السنة وتأخذ قيمة من 1 إلى 31 أما القيمة الافتراضية هي 1.
  • inclusive - تستخدم مع before/after من أجل تحديد فيما إذا كانت قيمة التاريخ متضمنة ضمن المجال أو لا.
  • compare -يمكن الإطلاع على ()WP_Date_Query::get_compare.
  • column - القيمة الافتراضية له post_date.
  • relation - وتأخذ إحدى القيمتين OR أو AND والتي تحدد كيف ستتعامل المصفوفات الفرعية فيما بينها لإتمام عملية المقارنة، والقيمة الافتراضية له هي AND.

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

// Return all posts from 2014
$args = array(
	'date_query' => array(
		array(
			'year'  => 2014,
		),
	),
);

// Return all posts from January 2015
$args = array(
	'date_query' => array(
		array(
			'year'  => 2015,
			'month' => 1
		),
	),
);

// Return all Valentine's Day posts, regardless of year:
$args = array(
	'date_query' => array(
		array(
			'month' => 2
			'day' => 14
		),
	),
);

وللتحكم أكثر بالنطاق الزمني يمكن استخدام المعاملين before و after، ولكنك تحتاج لتحديد السنة، الشهر، واليوم كعناصر في المصفوفة الفرعية. كما يمكن استخدام المعامل inclusive لتحديد حدود النطاق الزمني بشكل دقيق أكثر.

$args = array(
	'date_query' => array(
		array(
			'after'     => 'January 1st, 2013',
			'before'    => array(
				'year'  => 2013,
				'month' => 2,
				'day'   => 28,
			),
			'inclusive' => true,
		),
	),
);

سيعيد هذا المثال المأخوذ من Codex كل المواضيع المنشورة بين الأول من كانون الثاني عام 2013 و الثامن والعشرين من شباط عام 2013. وبما أن القيمة الممررة للمعامل inclusive هي true فستكون المواضيع المنشورة في التواريخ الحدودية مُتضمَّنة في النتيجة.

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

حالة استخدام: المنشورات الموسمية السابقة

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

المثال القصير التالي سيضيف موضوعا خاصا بخدعة الأول من نيسان:

$args = array(
	'date_query' => array(
		array(
			'month' => 4,
			'day' => 1
		),
	),
);

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

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

المعامل paged هو أحد المعاملات المستخدمة بكثرة حيث يحدد أي صفحة يمكن عرض نتائجها. ويمكن ربطها مع المعامل posts_per_page. مثلًا إذا تم عرض 10 مواضيع في الصفحة وأُسنِد للمعامل paged القيمة 4 فستعدل قيمة 4 إلى 10.

المعامل nopaging يسمح لك بتجاهل ترقيم الصفحات بشكل كلي إذا عدلت قيمته إلى true.

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

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

يحدد المعامل posts_per_archive_page عدد الصفحات التي توجد في صفحات الأرشيف، والتي ستكون هي الصفحات التي تُعطى القيمة true للتوابع ()is_archive و i()s_search، مع العلم أن هذا المعامل لايُستخدم مع معامل posts_per_page.

أخيرًا، المعامل page يُظهر المواضيع التي عادةً ما تظهر فقط في الصفحة X من الصفحة الأمامية الثابتة.

$args = array( 
	'posts_per_page' => 20, 
	'offset' => 2,
	'ignore_sticky_posts' => true
);

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

ترتيب النتائج

إن ترتيب النتائج هو بنفس أهمية استرجاع النتائج. ويمكن التحكم في ترتيب النتائج من خلال معاملين هما order و orderby.

إن معامل orderby يحدد ترتيب المواضيع التي ستُستعاد. ويوجد لدينا العديد من الخيارات منها:

  • none - لايوجد ترتيب وهو القيمة الافتراضية في MySQL
  • ID - ترتيب المواضيع من خلال المفتاح المعرف
  • author - ترتيب المواضيع بحسب معرف المؤلف
  • title - ترتيب المواضيع بحسب العنوان
  • name - ترتيب المواضيع بالاعتماد على slug
  • type - ترتيب المواضيع بحسب نوع الموضوع
  • date - ترتيب المواضيع بحسب التاريخ
  • modified - ترتيب المواضيع بالاستناد إلى تاريخ آخرت تعديل
  • parent - ترتيب المواضيع بالاستناد إلى معرف الأب
  • rand - ترتيب عشوائي للمواضيع
  • comment_count - ترتيب المواضيع بحسب عدد التعليقات على الموضوع
  • menue_order - ترتيب المواضيع بحسب ترتيب الصفحات
  • meta_value - ترتيب المواضيع بالاستناد إلى القيمة meta value
  • meta_value_num ترتيب المواضيع بالاستناد إلى القيمة الرقمية ل meta value
  • post_in الحفاظ على الترتيب المدخل في هذا المعامل

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

مع الملاحظة أنه في في حال كنا نرتب معلومات رقمية عندها سنستخدم المعامل meta_value_num بدلًا من meta_value.

ويمكن أيضًا استخدام المعامل meta_type الذي يسمح لنا بتحديد نوع البيانات.

إن المعامل order يحدد اتجاه الترتيب ففي حال كانت القيمة المُمررة له هي ASC عندها ستكون نتيجة الترتيب تصاعديًا، فيما ستكون نتيجة الترتيب تنازلية في حال كانت قيمة المعامل DESC ، والآن لنلق نظرة على المثال التالي الذي يعطينا نظرة عملية عن طريقة الترتيب:

// Reverse order by post title
$args = array(
	'post_type' => 'post',
	'orderby' => 'title',
	'order' => 'DESC'
);

// List specific posts, preserve given order
$custom_posts = array( 56, 928, 2271, 22, 491, 883 );
$args = array(
	'post_type' => 'any',
	'post__in' => $custom_posts,
	'orderby' => 'post__in',
);

// Order by meta data (grab posts with thumbnails first)
$args = array(
	'post_type' => 'post',
	'meta_key' => '_thumbnail_id',
	'orderby' => 'meta_value',
	'order` => 'DESC'
);

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

$args = array(
	'orderby' => array( 'title' => 'DESC', 'menu_order' => 'ASC' )
);

حالة استخدام: ترتيب المنتجات حسب السعر

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

$args = array(
	'meta_query' => array(
		array(
			'key'     => 'price',
			'value'   => '20',
			'compare' => '>=',
		),
	),
	'post_type' => 'product',
	'meta_key' => 'price',
	'orderby' => 'meta_value_num',
	'order` => 'ASC'
);

القيم المُسترجعة

يبدو أن المعامل fields ليس معروفًا بشكل جيد، بالرغم من أنه أحد الميزات الهامة في الاستعلامات التي تسمح بحمل القيم المُسترجعة من الاستعلامات بسهولة، وذلك من خلال تمرير قيمتين لهذا المعامل.

في حال حذف المعامل fields فستُسترجع البيانات من الاستعلام بالطريقة المُعتادة، أما في حال ممرنا القيمة ids لهذا المعامل فستكون النتيجة المُرجعة من الاستعلام على شكل مصفوفة تحوي أرقام المعرفات الخاصة بالمواضيع post IDs، وفي حال كانت قيمة المعامل هي id=>parent عندها ستكون النتيجة المُرجعة من الاستعلام هي مصفوفة ولكنها تحوي أرقام المعرفات الخاصة بالآباء المرتبطة بالعلاقة المذكورة في الاستعلام.

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

حالة استخدام: إضافة معرض صور برمجيًا

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

// Programmatically placing a gallery shortcode
global $post;
$args = array(
	'post_parent' => $post->ID,
	'post_type' => 'attachment',
	'post_status' => 'any',
	'fields' => 'ids'
);
$images = new WP_Query( $args );
$image_id_string = implode( ',', $images );
echo do_shortcode( '[gallery ids="' . $image_id_string . '"]' );

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

الإذن Permission

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

$args = array(
	'post_status' => array( 'publish', 'private' ),
	'perm'        => 'readable',
);

التخزين المؤقت Caching

هذه أحد التحسينات المتقدمة التي تسمح بالتحكم بطريقة التخزين المؤقت التي  تستخدمها الاستعلامات. بشكل عام إن تخزين نتاج الاستعلام بشكل مؤقت يعتبر فكر جيدة لأن لديها فرصة كبيرة في استخدمها عدة مرات في نفس الصفحة.

مثلا قائمة بأفضل 10 مواضيع على الأغلب لن تتغير من استعلام إلى آخر وبالتالي يمكن الاستفادة من تخزينها.

يوجد حالتين يمكن فيها التحكم بهذا التخزين المؤقت. إذا قمت بتخزين قائمة ولاتحتاج إلى البيانات الأساسية منها metadata أو إلى تصنيفها يمكن أن تستخدم المعاملين update_post_meta_cache و update_post_term_cache وذلك لإيقاف التخزين المؤقت الخاص به. كما أنه في حال كنت تقوم باستعلام لمرة وحيدة من أجل اختبار ما سريع يمكن استخدام المعامل cache_results لإيقاف تخزين  نتايج الموضوع نفسه.

// Do not cache results
$args = array(
	'posts_per_page' => -1,
	'cache_results'  => false
);

// Don't cache taxonomy data
$args = array(
	'posts_per_page' => 10,
	'update_post_term_cache'  => false
);

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

خصائص استعلامات الوورد بريس WP_Query

حتى الآن كنا نتكلم عن المعاملات التي يمكن تمريرها لاستعلام WP_Query، ولكن الآن سنتكلم عنه كصنف Class وسنشرح الخصائص properties و التوابع methods التي يمكن أن نتعامل معها.

يحوي WP_Query Properties Documentation على شرح وافٍ لجميع الخصائص الخاصة بهذا الصنف، ولكن سنتحدث هنا عن أكثر الخصائص فائدة وكيفية الاستفادة منها.

لنبدأ أولًا بالخاصية $found_posts التي تحمل قيمة عدد المواضيع التي تم العثور عليها كإجمالي ناتج الاستعلام المدخل.

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

أخيرًا سنتحدث عن الخاصية $max_num_pages والتي تحمل عدد الصفحات التي نحتاجها لإظهار النتائج، وهي عمليًا ناتج العملية $found_posts\$posts+per_page ويقرّب الناتج إلى أكبر قيمة صحيحة.

$args = array(
	's' => 'awesome+wordpress+plugins',
	'posts_per_page' => 8
);
$results = new WP_Query( $args );

echo "A total of " . $results->found_posts . " posts were found.<br />";
echo "We will be displaying " . $results->query_vars['posts_per_page'] . " posts per page if possible.<br />";
echo "We need a total of " . $results->max_num_pages . " pages to display the results".

توابع استعلامات الوورد بريس WP_Query Methods

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

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

بالنسبة للتوابع ()get و ()set ستسمح لك بالوصول إلى متغيرات الاستعلام ولانستخدمها إلا في حالات قليلة جدًا.

لمزيد من المعلومات حول توابع استعلام الوورد بريس، يمكن الإطلاع على Method Documentation.

سلامة البيانات: التحقق Validating، التنظيف Sanitizing، والتهريب Escaping

تقترن بعض الاستعلامات المخصصة مع واجهات المستخدمين. والسيناريو الأمثل لضمان سلامة المعلومات هو إضافة فلتر مخصص يتحكم بصلاحيات الوصول للمستخدم للمواضيع. يمكن الإطلاع على المزيد من المعلومات في المقالة Adding Post Filters To Your WordPress Site.

وفي حال كنت تملك مكان من الواجهة يستطيع المستخدم فيه إدخال بيانات ما، فيجب دوما التحقق وتهريب البيانات المدخلة لمنع الهجومات التي تحصل على قاعدة البيانات. ويمكن الإطلاع على معلومات أكثر في المقالة   Validating, Santitizing And Escaping User Data.

تعديل استعلامات SQL

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

تسمح الفلاتر مثل posts_where و posts_join بتعديل شروط معينة في استعلام SQL بينما تكون استعلامات الوورد بريس أكثر مرونة ولكنها لاتسمح بوجود شروط معقدة بعد WHERE بما في ذلك التصنيفات المتعددة أو العلاقات المتعددة. في هذه الحالة يمكن استخدام الفلاتر التي ذكرناها.

يمكن الإطلاع على WP_Query Filters للمزيد من المعلومات.

الخلاصة

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

إذا كنت مهتمًا ببرمجة الوورد بريس، يوجد مجموعة من الأصناف التي تعمل بشكل مشابه لصنف WP_Query مثل صنف WP_Comment_Query الذي يُستعمل لتجميع التعليقات بنفس الطريقة التي يعمل بها صنف WP_Query. كما أن صنف WP_Meta_Query يتعامل مع الاستعلامات الأساسية meta_queries، بينما يتعامل صنف WP_Date_Query مع كل حدود التواريخ.

ترجمة -وبتصرّف- للمقال An In-Depth Guide to Conquering WP_Query لصاحبه Daniel Pataki


تفاعل الأعضاء

أفضل التعليقات



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...