it-swarm.asia

متى يجب عليك استخدام WP_Query vs query_posts () vs get_posts ()؟

يبدو أن نصف البرامج التعليمية في المخطوطة وحول محيط المدونات يستخدم query_posts() ونصف الاستخدام WP_Query . ما هي الصفقة؟

412
Dan Gayle
  • query_posts() تبسيط مفرط وطريقة إشكالية لتعديل الاستعلام الرئيسي للصفحة عن طريق استبدالها بمثيل جديد للاستعلام. إنه غير فعال (إعادة تشغيل استعلامات SQL) وسيفشل بشكل صريح في بعض الحالات (خاصةً في كثير من الأحيان عند التعامل مع ترقيم الصفحات المنشور). يجب أن يستخدم أي رمز حديث WP أساليب أكثر موثوقية ، مثل استخدام pre_get_posts hook لهذا الغرض. TL ؛ DR لا تستخدم query_posts () أبدًا .

  • get_posts() متشابه للغاية في الاستخدام ويقبل نفس الوسيطات (مع بعض الفروق الدقيقة ، مثل الافتراضات المختلفة) ، لكنه يعرض مجموعة من المنشورات ، ولا يعدل المتغيرات العامة وهو آمن للاستخدام في أي مكان.

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

  

658
Rarst

query_posts - يجب ألا تستخدم أبدًا query_posts. بصرف النظر عما قالهRarst ، فإن المشكلة الكبيرة في query_posts هي ، إنها تخترق كائن الاستعلام الرئيسي (المخزن في $wp_query). يعتمد الكثير من الإضافات والرمز المخصص على كائن الاستعلام الرئيسي ، وبالتالي فإن كسر كائن الاستعلام الرئيسي يعني أنك تقوم بقطع وظائف الإضافات والرمز المخصص. وظيفة واحدة فقط هي وظيفة ترقيم الصفحات المهمة ، لذلك إذا قمت بكسر الاستعلام الرئيسي ، يمكنك كسر ترقيم الصفحات.

لإثبات مدى سوء query_posts ، على أي قالب ، قم بما يلي وقارن النتائج

var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );

get_posts و WP_Query هما الطريقتان الصحيحتان لإنشاء ثانوي استعلامات (مثل المنشورات ذات الصلة ، المتزلجون ، المحتوى المميز والمحتوى على الصفحات الأمامية ثابتة) مع. تجدر الإشارة إلى أنه يجب ألا تستخدم أيًا من الاثنين لصالح الاستعلام الرئيسي على الصفحة الرئيسية أو الصفحة المفردة أو أي نوع من صفحات الأرشيف لأنها ستؤدي إلى انقطاع وظائف الصفحة. إذا كنت بحاجة إلى تعديل الاستعلام الرئيسي ، فاستخدم pre_get_posts للقيام بذلك ، وليس استعلامًا مخصصًا. (UPDATE:بالنسبة للصفحات الأمامية الثابتة والصفحات الحقيقية ، راجع استخدام pre_get_posts على الصفحات الحقيقية والصفحات الأمامية الثابتة *)

في الجوهر ، يتم استخدام WP_Query بواسطة الاستعلام الرئيسي ويتم استخدامه أيضًا بواسطة get_posts ، ولكن على الرغم من أن get_posts() يستخدم WP_Query ، فهناك بعض الاختلافات

  • get_posts أسرع من WP_Query. يعتمد الهامش على مقدار إجمالي مشاركات الموقع. سبب ذلك هو get_posts يمرر 'no_found_rows' => true بشكل افتراضي إلى WP_Query الذي يتخطى/يكسر ترقيم الصفحات. باستخدام 'no_found_rows' => true ، تحصل WP_Query على عدد المشاركات التي تم الاستعلام عنها ، ثم تنقذها ، حيث تقوم بشكل افتراضي ، بالبحث عن جميع المنشورات المطابقة للاستعلام من أجل حساب ترقيم الصفحات.

    لهذا السبب ، يجب استخدام get_posts() للاستعلامات غير المرقّمة فقط. ترقيم الصفحات get_posts هو في الحقيقة فوضى كبيرة. يجب استخدام WP_Query لجميع استعلامات الصفحات

  • لا تتأثر get_posts() بمرشحات posts_* حيث يتأثر WP_Query بهذه المرشحات. السبب هو أن get_posts ، افتراضيًا ، يمرر 'suppress_filters' => true إلى WP_Query

  • يحتوي get_posts على معلمتين إضافيتين مثل include و exclude و numberposts و category. يتم تغيير هذه المعلمات إلى معلمات صالحة لـ WP_Query قبل تمريرها إلى WP_Query. يتم تغيير include إلى post__in ، exclude إلى post__not_in ، category إلى cat و numberposts إلى posts_per_page. ملاحظة فقط ، الكل / المعلمات التي يمكن تمريرها إلى WP_Query تعمل مع get_posts ، أنت يمكنك تجاهل ولا تستخدم المعلمات الافتراضية لـ get_posts

  • إرجاع get_posts فقط خاصية $posts الخاصة بـ WP_Query بينما تقوم WP_Query بإرجاع الكائن الكامل. هذا الكائن مفيد للغاية عندما يتعلق الأمر بالشرطية والصفحات وغيرها من المعلومات المفيدة التي يمكن استخدامها داخل الحلقة.

  • لا يستخدم get_posts الحلقة ، ولكن حلقة foreach لعرض المنشورات. أيضًا ، لا تتوفر علامات قالب افتراضيًا. setup_postdata( $post ) يجب استخدامه لتوفير علامات القالب. WP_Query يستخدم حلقة وعلامات القالب متوفرة بشكل افتراضي

  • يمرر get_posts'ignore_sticky_posts' => 1 إلى WP_Query ، لذلك يتجاهل get_posts افتراضيًا المشاركات اللزجة

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

60
Pieter Goosen

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

query_posts('meta_key=color&meta_value=blue'); 

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

أميل عادةً إلى استخدام WP_Query كثيرًا ، كما يحدث. حقًا ، سوف يتعلق الأمر بحالتك المحددة.

31
nickmjones

ليست هناك حاجة ببساطة لاستخدام query_posts(). كل ما تفعله هو إنشاء كائن WP_Query جديد وإعادة تعيين ذلك الكائن الجديد إلى global wp_query.

كمرجع ، فيما يلي وظيفة query_posts() الفعلية.

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

إنشاء مثيل لعنصر WP_Query الخاص بك إذا كنت تريد إنشاء برنامج نصي للاستعلام المخصص بعمق. أو استخدم get_posts() إذا كان كل ما عليك فعله هو بعض التلاعب بالضوء هنا وهناك.

في كلتا الحالتين ، أوصي بشدة بتقديم خدمة لنفسك والذهاب إلى wp_includes/query.php واستعراض فئة WP_Query.

15
RebelPhoenix

تأكد من استخدام wp_reset_query() بعد استخدام query_posts() لأنه سيؤثر أيضًا على نتيجة استعلام أخرى.

14
Bindiya Patoliya

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

10
tw2113
  • query_posts () : قد يتم استخدامه في حالة واحدة فقط إذا كنت بحاجة إلى تعديل الاستعلام الرئيسي. يضع الكثير من المتغيرات العالمية ؛
  • get_posts () : إنه مشابه جدًا في الميكانيكا ويقبل الحجج نفسها ، ولكنه يعرض مجموعة من المنشورات
  • WP_Query : يمكنك إنشاء والعمل مع كائن خاص به. أكثر تعقيدًا وأقل قيودًا ، إنه آمن للاستخدام في أي مكان.
6
dalveer