شارك المقال

بناء استعلامات وورد بريس فعالة باستخدام WP_Query

A VPN is an essential component of IT security, whether you’re just starting a business or are already up and running. Most business interactions and transactions happen online and VPN

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

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

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

عندما تكون حركة المرور والمحتوى محدودًا ، فإننا لا نهتم عادةً بكفاءة استفساراتنا. ينشئ وورد بريس استعلامات SQL مُحسّنة جيدًا ويوفر نظام تخزين مؤقت خارج الصندوق.

عندما تنمو حركة المرور ومحتوى الموقع بشكل ملحوظ – حتى آلاف المنشورات – يجب علينا مراعاة وقت تنفيذ الاستعلام.

صندوق أدواتنا

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

بدلاً من المكون الإضافي ، يمكننا إجبار وورد بريس على تخزين معلومات الاستعلام التي توضح الثابت التالي في wp-config.php :

تعريف ("SAVEQUERIES" ، صحيح) ؛

عند SAVEQUERIESالتعيين على true، يسجل وورد بريس الاستعلامات ومجموعة من المعلومات المفيدة في $wpdb->queriesالمصفوفة. لذلك ، يمكن طباعة أسماء وظائف المتصل وسقوط تنفيذ كل استعلام عن طريق إضافة الكود التالي في ملف قالب مثل footer.php :

إذا (current_user_can ('المسؤول')) {
	wpdb دولار عالمي ؛
	صدى "<قبل>" ؛
	print_r ($ wpdb-> استعلامات) ؛
	صدى "</pre>"؛
}

هنا مثال على ما تردد:

[4] => صفيف
(
	[0] => حدد SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts حيث 1 = 1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' أو wp_posts.post_status = 'خاص') ORDER BY wostp_osts. ، 10
	[1] => 0.0163011550903
	[2] => تتطلب ('wp-blog-header.php') ، wp ، WP-> main ، WP-> query_posts ، WP_Query-> query ، WP_Query-> get_posts ، QM_DB-> استعلام
	[تتبع] => كائن QM_Backtrace
		(...)
	[النتيجة] => 10
)

إذا كنت ترغب في التعمق في هذا الموضوع ، فقم بإلقاء نظرة على برنامجنا التعليمي:  تحرير ملف wp-config.php .

أخيرًا ، ضع في اعتبارك أن كلاً من المكون الإضافي SAVEQUERIESوالوظيفة المدمجة يطوران أدوات يجب علينا إيقاف تشغيلها في بيئة الإنتاج.

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

WP_Query – لماذا لم نعد الصفوف

يمكننا الاستعلام عن قاعدة البيانات باستخدام get_postsالوظيفة ، والتي تُرجع مصفوفة من التدوينات ، أو نسخة جديدة من WP_Queryالكائن. في كلتا الحالتين يمكننا تحديد نتائج الاستعلامات عن طريق تعيين قيم مناسبة لمتغيرات محددة.

لنبدأ بمثال يُظهر حلقة شائعة كما تظهر عادةً في ملف قالب:

// الاستعلام
$ the_query = WP_Query جديد ($ args) ؛
// الحلقة
إذا (the_query $-> have_posts ()) {
	while (the_query $-> have_posts ()): $ the_query-> the_post ()؛ 
		// رمزك هنا
	في غضون ذلك
} آخر {
		// لم يتم العثور على أية منشورات
}
/ * استعادة بيانات البريد الأصلية * /
wp_reset_postdata () ،

$argsهي مجموعة من أزواج المفتاح / القيمة. تسمى هذه الأزواج متغيرات الاستعلام ، وتحدد أو تؤثر على استعلام SQL الفعلي.

عند الاستعلام عن قاعدة البيانات من مكون إضافي ، قد نفضل استخدام pre_get_postsعامل التصفية ، كما هو موضح في المثال التالي:

function myplugin_pre_get_posts ($ query) {
  إذا (is_admin () ||! $ query-> is_main_query ()) {
	إرجاع؛
  }
  $ query-> set ('category_name'، 'webdev')؛
}
add_action ('pre_get_posts'، 'myplugin_pre_get_posts'، 1) ؛

الشيء المهم الذي يجب ملاحظته هنا هو أن $queryالكائن يتم تمريره عن طريق المرجع ، وليس بالقيمة ، مما يعني أن وسيطات الاستعلام تؤثر فقط على $queryمثيل موجود .

setتضيف هذه الطريقة استعلامًا جديدًا var إلى مواصفات الاستعلام وستجبر وورد بريس على استرداد جميع المنشورات من webdevالفئة. هذا هو الاستعلام الناتج:

حدد SQL_CALC_FOUND_ROWS wp_posts.ID
من wp_posts 
INNER JOIN wp_term_relationships
تشغيل (wp_posts.ID = wp_term_relationships.object_id)
حيث 1 = 1 
و (wp_term_relationships.term_taxonomy_id IN (12))
AND wp_posts.post_type = "مشاركة"
AND (wp_posts.post_status = 'publish'
أو wp_posts.post_status = 'خاص')
تجميع حسب wp_posts.ID
اطلب بواسطة wp_posts.post_date DESC
الحد 0 ، 10

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

شاشة القراءة

تريد أن تعرف كيف زدنا من حركة المرور لدينا أكثر من 1000 ٪؟

انضم إلى أكثر من 20000 آخرين ممن يتلقون رسائلنا الإخبارية الأسبوعية مع نصائح من الداخل حول وورد بريس!

إشترك الآن

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

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

حدد SQL_CALC_FOUND_ROWS * من tbl_name
حيث المعرف> 100 LIMIT 10 ؛

حدد FOUND_ROWS () ،

لسوء الحظ ، SQL_CALC_FOUND_ROWSيمكن أن يؤدي إلى إبطاء وقت تنفيذ الاستعلام بشكل ملحوظ.

الخبر السار هو أنه يمكننا إجبار وورد بريس على إزالة الخيار الذي يوفر no_found_rowsالمتغير غير المستخدم (وغير الموثق) .

إذا SQL_CALC_FOUND_ROWSتم حذفه ، يتم FOUND_ROWS()إرجاع عدد الصفوف حتى قيمة LIMIT(المزيد حول هذا الموضوع في توثيق MySQL ).

في تثبيت وورد بريس مع بضع مئات من المنشورات ، استغرق استعلام التعريف التالي 0.0107 ثانية:

حدد SQL_CALC_FOUND_ROWS wp_posts.ID
من wp_posts 
INNER JOIN wp_postmeta
تشغيل (wp_posts.ID = wp_postmeta.post_id)
حيث 1 = 1 
AND ((wp_postmeta.meta_key = 'book_author')
و CAST (wp_postmeta.meta_value AS CHAR) مثل "٪ Isaac Asimov٪ '))
AND wp_posts.post_type = 'كتاب'
AND (wp_posts.post_status = 'publish'
أو wp_posts.post_status = 'خاص')
تجميع حسب wp_posts.ID
اطلب بواسطة wp_posts.post_date DESC
الحد 0 ، 10

إزالة SQL_CALC_FOUND_ROWSالإعداد no_found_rowsإلى “خطأ” ، استغرق نفس الاستعلام 0.0006 ثانية.

بفضل البرنامج المساعد Query Monitor ، يمكننا بسهولة مقارنة استعلامين يتيحان وتعطيل خيار SQL_CALC_FOUND_ROWS

بفضل البرنامج المساعد Query Monitor ، يمكننا بسهولة مقارنة استعلامين مع خيار SQL_CALC_FOUND_ROWS وبدونه

عندما wp_postيحتوي الجدول على آلاف الصفوف ، قد يستغرق تنفيذ الاستعلام ثوانٍ.

عندما لا نحتاج إلى ترقيم الصفحات ، يجب أن نضبط أي وقت no_found_rowsعلى trueجعل الاستعلام يعمل بشكل أسرع.

هل تعاني من مشاكل التوقف و وورد بريس؟ Kinsta هو حل الاستضافة المصمم لتوفير الوقت! تحقق من ميزاتنا

للتخزين المؤقت أو عدم التخزين المؤقت

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

لحسن الحظ ، يسمح لنا وورد بريس بتعطيل التخزين المؤقت الذي يوفر ثلاث معلمات محددة :

cache_results : ما إذا كان سيتم تخزين معلومات النشر مؤقتًا. افتراضي صحيح.

update_post_meta_cache : ما إذا كان سيتم تحديث ذاكرة التخزين المؤقت لما بعد النشر. افتراضي صحيح.

update_post_term_cache : ما إذا كان سيتم تحديث ذاكرة التخزين المؤقت لمصطلح المشاركة. افتراضي صحيح.

إذا تم تمكين نظام التخزين المؤقت المستمر ، مثل Memcached ، فلا يتعين علينا الاهتمام بمعلمات التخزين المؤقت لأن وورد بريس سيضبط هذه الوسائط على false افتراضيًا.

في أي حالة أخرى ، يمكننا إنشاء استعلام أسرع باستخدام الكود التالي:

function myplugin_pre_get_posts ($ query) {
  إذا (is_admin () ||! $ query-> is_main_query ()) {
	إرجاع؛
  }
  $ query-> set ('category_name'، 'webdev')؛

  $ query-> set ('no_found_rows'، true)؛
  $ query-> set ('update_post_meta_cache'، خطأ)؛
  $ query-> set ('update_post_term_cache'، خطأ)؛
}
add_action ('pre_get_posts'، 'myplugin_pre_get_posts'، 1) ؛

عندما لا يتوفر نظام التخزين المؤقت الدائم ، لا ينبغي تخزين الاستعلامات التي تعرض كميات صغيرة من البيانات مؤقتًا.

تم إرجاع الحقول

كقاعدة عامة ، يجب ألا نستعلم في قاعدة البيانات عن الحقول غير الضرورية مطلقًا. و WP_Queryتوفر الدرجة الحجة الحقول، والذي يسمح للحد من الحقول عاد إلى معرفات أو ‘id=>parent’المجالات. تحدد وثائق الملف المصدر وسيطة الحقول على النحو التالي:

أي الحقول للعودة. حقل مفرد أو كل الحقول (سلسلة) ، أو صفيف من الحقول. ‘id => الأصل’ يستخدم ‘id’ و ‘post_parent’. افتراضيًا جميع الحقول. يقبل “المعرفات” ، “المعرف => الأصل”.

الحقول يعترف متغير ‘ids’و ‘id=>parent’، والتخلف إلى * (أي قيمة أخرى)، على الرغم من أنك سوف تلاحظ أن من وورد الافتراضي وتعيين القيمة إلى هويات في العديد من الاستفسارات.

أخيرًا ، يمكننا تحسين استعلامنا الأول:

<؟ php
$ args = مجموعة ( 
	'no_found_rows' => صحيح ، 
	'update_post_meta_cache' => خطأ ، 
	'update_post_term_cache' => خطأ ، 
	'category_name' => 'cms' ، 
	"الحقول" => "هويات"
) ؛
// الاستعلام
$ the_query = WP_Query جديد ($ args) ؛
$ my_posts = $ the_query-> get_posts ()؛

إذا (! فارغ ($ my_posts)) {
    foreach ($ my_posts كـ $ p) {
        // كودك
    }
}
/ * استعادة بيانات البريد الأصلية * /
wp_reset_postdata () ،
؟>

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

ملخص

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

وفر الوقت والتكاليف وحقق أقصى قدر من أداء الموقع من خلال:

مساعدة فورية من خبراء استضافة وورد بريس ، 24/7.

تكامل Cloudflare Enterprise.

يصل الجمهور العالمي إلى 28 مركز بيانات حول العالم.

التحسين من خلال مراقبة أداء التطبيقات المضمنة لدينا.

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

توضيح

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

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

أرسل تصحيح

شاركنا رايك وتقييمك للموضوع

{{ reviewsTotal }}{{ options.labels.singularReviewCountLabel }}
{{ reviewsTotal }}{{ options.labels.pluralReviewCountLabel }}
{{ options.labels.newReviewButton }}
{{ userData.canReview.message }}