استعلامات WordPress المخصصة - استخدام فئة WP_Query

نشرت: 2021-02-06

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

دعنا نلقي نظرة على كيفية استخدام فئة WP_Query !

حالات الاستعلام المخصصة

ملاحظة: تفترض هذه المقالة أن لديك بعض المعرفة بلغة PHP و MySQL / MariaDB plus مألوفة للعمل مع WordPress.

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

ما WP_Query أساسًا هو أنه يوفر لك القدرة على استرداد المحتوى من قاعدة بيانات موقع الويب الخاص بك دون الحاجة إلى استخدام استعلامات SQL.

للقيام بذلك ، كل ما نحتاج إلى القيام به هو تحديد الحجج المقابلة لاحتياجاتنا وسيتم إنشاء كائن WP_Query الجديد وترجمته إلى استعلام SQL.

مثال باستخدام WP_Query

إذا أردنا عرض منشورات من فئة معينة ، داخل قالب فئة آخر ، فمن الضروري إنشاء كائن استعلام جديد.

لأغراض هذا المثال ، قمنا بتنشيط قالب Twenty Twenty وأنشأنا منشورتين تحت فئة تسمى "الفئة 1" ومنشورتان تحت فئة تسمى "الخدمات".

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

يرجى لصق ما يلي في ملف category-category-1.php .

 <?php /*** Custom Category 1 Template */ get_header(); ?> <main role="main"> <section class="site-content"> <div role="main"> <?php if ( have_posts() ) : ?> <header class="archive-header"> <h3 class="archive-title">Category: <?php single_cat_title( '', true ); ?></h3> </header> <?php while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; endif; ?> </div> </section> </main> <?php get_sidebar(); ?> <?php get_footer(); ?>

قبل الحلقة ، نستخدم طريقة have_posts لتحديد ما إذا كان هناك المزيد من المشاركات المتاحة في الحلقة.

يعد the_post() ضروريًا للحلقة لتكرار المنشورات وإخبار WordPress بالانتقال إلى المنشور التالي من مصفوفة المنشورات.

في هذه المرحلة ، سيكون عرض الواجهة الأمامية للفئة ( https://mycompanyname.com/category/category-1/ ) شيئًا مثل هذا:

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

لرؤية خصائص كائن الاستعلام التي أنشأها WordPress لهذا العرض ، يمكننا ببساطة إضافة هذا السطر في الكود الخاص بنا بعد endif; بيان.

 var_dump ( $wp_query->query_vars );

الآن إذا قمت بتحديث صفحتك ، فستكون هذه المعلومات ضمن قائمة المشاركات:

 array(63) { ["category_name"]=> string(10) "category-1" ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["tag"]=> string(0) "" ["cat"]=> int(16) ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["paged"]=> int(0) ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["post_type"]=> string(0) "" ["posts_per_page"]=> int(10) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["order"]=> string(4) "DESC" }

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

دعنا نلقي نظرة على الطرق التي يسمح بها WordPress لنا لتحقيق ذلك.

وظيفة query_posts

تعد وظيفة query_posts() طريقة لتغيير الاستعلام الرئيسي الذي يستخدمه WordPress لعرض المنشورات. يقوم بذلك عن طريق وضع الاستعلام الرئيسي على جانب واحد ، واستبداله باستعلام جديد. يمكنك أن ترى هذا بنفسك في ملف wp-includes/query.php حيث يتم تقديمه.

 function &query_posts($query) { unset($GLOBALS['wp_query']); $GLOBALS['wp_query'] =& new WP_Query(); return $GLOBALS['wp_query']->query($query); }

سنحاول إضافة حلقة أخرى لعرض مشاركات "الخدمات" عن طريق إضافة الأسطر التالية أسفل endwhile; من الحلقة القياسية الحالية.

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

وها أنت ذا:

ومع ذلك ، هناك عيب في هذه الطريقة. إذا حاولنا طباعة الفئة المضمنة في كائن الاستعلام ، فسنلاحظ أنه تم تغييره.

حاول إدراج var_dump ( $wp_query->query_vars["category_name"] ); بعد استعلام الخدمات وقم بتحديث الصفحة. يجب أن ترى هذه النتيجة:

 string(8) "services"

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

لتجنب هذه التعارضات والتنظيف بعد استدعاء query_posts ، قم بإجراء استدعاء لـ wp_reset_query() ، وستتم استعادة الاستعلام الرئيسي الأصلي. لذلك يجب أن تبدو التعليمات البرمجية الخاصة بك كما يلي:

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

عند تحديث صفحتك ، ترى الآن أن فئة الصفحة الأولية قد عادت إلى الاستعلام.

 string(10) "category-1"

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

دالة get_posts ()

يمكن تحقيق نفس النتيجة باستخدام get_posts() لاسترداد مجموعة من المنشورات التي تطابق المعايير المحددة.

استبدل حلقة الخدمات الموضحة أدناه ...

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

…مع هذا الشخص:

 $my_query = get_posts( array ( 'category' => 17 ) ); foreach($my_query as $post) : setup_postdata($post); the_title( '<h4 class="example"></h4>' ); endforeach; var_dump ( $wp_query->query_vars["category_name"] );

كما ترى هذه المرة ، كان علينا العمل مع معرف الفئة بدلاً من اسم الفئة ، وفقًا get_posts() المحددة بواسطة WordPress.

شيء آخر مهم يجب ملاحظته هنا هو أنه على الرغم من أننا لم نقم بإعادة تعيين الاستعلام ، إلا أن ناتج var_dump لفئة الاستعلام لا يزال سليماً ولم يتغير إلى "خدمات". وذلك لأن get_posts() في حد ذاته لا يغير الاستعلام الرئيسي. لقد استخدمنا للتو متغيرًا جديدًا ' $my_query ' لإنشاء مثيل جديد لكائن الاستعلام دون استبداله.

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

قم بإنشاء كائن WP_Query جديد

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

هذا هو جزء الكود الذي سنستخدمه:

 $services_query = new WP_Query( 'category_name=services' ); if ( $services_query->have_posts() ) { while ( $services_query->have_posts() ) : $services_query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; } wp_reset_postdata(); var_dump ( $wp_query->query_vars["category_name"] );

استخدمنا وسيطة "category_name" لتعريف سبيكة الفئة التي نريد عرض منشوراتها.

لقد حفظنا الكائن new WP_Query( 'category_name=services' ); في المتغير $services_query .

ثم استخدمنا حلقة while لعرض المحتويات ، وبعد ذلك قمنا بإعادة ضبط الحلقة باستخدام wp_reset_postdata(); من أجل استعادة البيانات الأصلية للاستعلام الرئيسي.

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