تحليل شامل لـ WP_Query: التحكم الدقيق في دورة محتوى موضوع WordPress.

قراءة 3 دقائق
2026-03-20
2026-06-05
2,684
أنا أحصل على عمولة عند التسوق عبر الروابط أدناه، ولا يُضاف أي تكلفة عليك.

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

فهم نظام المعاملات الأساسية لـ WP_Query

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

معايير الاستعلام الأساسي وتقسيم الصفحات

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

القراءة الموصى بها سأعلمك خطوة بخطوة كيف تطور موضوعًا عالي الجودة لـ WordPress من الصفر.

$args = array(
    // 指定查询产品类型
    'post_type'      => 'product',
    // 每页显示8个项目
    'posts_per_page' => 8,
    // 获取第2页的内容
    'paged'          => 2,
    // 按照发布日期降序排列
    'orderby'        => 'date',
    'order'          => 'DESC',
);
$product_query = new WP_Query( $args );

أنظمة التصنيف ومعايير الاستعلام عن البيانات الوصفية (Metadata Query Parameters)

بالنسبة لشروط التصفية الأكثر تعقيدًا،tax_query و meta_query المعاملات ضرورية للغاية.tax_query يُستخدم لمعالجة الاستعلامات المتعلقة بالتصنيفات (Category)، والعلامات (Tag)، وأي أنظمة تصنيف مخصصة (Taxonomy) أخرى. meta_query يُستخدم للاستعلام عن المقالات التي تحتوي على حقول مخصصة معينة (مثل حقول Post Meta) وقيمها، مثل الاستعلام عن جميع المنتجات “المتوفرة في المخزون” أو “بسعر خاص”.

خادم ووردبريس من شركة UltaHost
ضمان استرداد المال خلال 30 يومًا، عرض نطاق ترددي وقواعد بيانات غير محدودين، حماية مجانية ضد هجمات DDoS، خصم 50% عند الشراء لمدة 3 سنوات (السعة المتاحة: 501–4 تيرابايت).
$args = array(
    'post_type' => 'book',
    'tax_query' => array(
        array(
            'taxonomy' => 'genre', // 自定义分类法:书籍类型
            'field'    => 'slug',
            'terms'    => array( 'science-fiction', 'fantasy' ),
            'operator' => 'IN', // 查询类型为“科幻”或“奇幻”的书籍
        ),
    ),
    'meta_query' => array(
        array(
            'key'     => '_price',
            'value'   => 50,
            'compare' => '<',
            'type'    => 'NUMERIC', // 查询价格低于50的书籍
        ),
    ),
);

إنشاء وتنفيذ دورات استعلام مخصصة

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

الهيكل القياسي لدورة الاستعلام

يجب أن تتضمن دورة الاستعلام المخصصة القوية أربع خطوات: تهيئة كائن الاستعلام، التحقق مما إذا كانت هناك نتائج، عرض المحتوى بشكل دوري، وإعادة تعيين البيانات العامة. داخل الدورة، يمكن استخدام… the_post() الطرق ومجموعة من علامات القوالب (مثل…) the_title(), the_content())来输出每篇文章的信息。

// 1. 初始化
$featured_args = array( 'category_name' =&gt; 'featured', 'posts_per_page' =&gt; 3 );
$featured_query = new WP_Query( $featured_args );

// 2. 检查
if ( $featured_query-&gt;have_posts() ) {
    echo '<section class="featured-posts">';
    // 3. 循环
    while ( $featured_query-&gt;have_posts() ) {
        $featured_query-&gt;the_post();
        // 现在可以使用模板标签
        echo '<article>'echo '<h2><a href="/ar/' . esc_url( get_permalink() ) . '/">'`.get_the_title()``.'</a></h2>';
        the_excerpt();
        echo '</article>';
    }
    echo '</section>';
} else {
    // 如果没有找到文章
    echo '<p>لا يوجد محتوى مختار حاليًا.</p>';
}

// 4. 重置(关键步骤!)
wp_reset_postdata();

معالجة المعلومات الوصفية (Metadata) الموجودة في نتائج الاستعلامات

WP_Query الكائنات لا توفر بيانات المقالات فحسب، بل تحتوي أيضًا على معلومات فوقية (metadata) تتعلق بعملية البحث نفسها، وهذه المعلومات مفيدة للغاية أثناء عملية التطوير. على سبيل المثال،$query->max_num_pages يمكن للخصائص الحصول على إجمالي عدد الصفحات في نتائج الاستعلام، وذلك لاستخدامه في بناء نظام تنقل تصفحي مخصص.$query->found_posts تُرجع الخاصية العدد الإجمالي لجميع المقالات التي تتوافق مع المعايير المحددة، وليس فقط عدد المقالات الموجودة في الصفحة الحالية.

// 在循环之后,可以获取这些信息
$total_posts = $featured_query-&gt;found_posts;
$total_pages = $featured_query-&gt;max_num_pages;

echo "<p>تم العثور على {$total_posts} مقالًا مختارًا، موزعة على {$total_pages} صفحة.</p>"// استنادًا إلى هذه المعلومات، يمكنك إنشاء روابط تصفح مخصصة.

تحسين أداء الاستعلامات واستراتيجيات التخزين المؤقت (الكاش)

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

القراءة الموصى بها تحليل متعمق لتطوير الموضوعات المحترفة لـ WordPress: بناء مواقع الويب المتجاوبة من الصفر.

استخدم واجهة برمجة التطبيقات (API) للعناصر المؤقتة (Transients API) لتخزين نتائج الاستعلامات.

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

// 定义一个唯一的瞬态键名
$transient_key = 'mytheme_hot_products_week_42';

// 尝试从缓存中获取
$cached_html = get_transient( $transient_key );

if ( false === $cached_html ) {
    // 缓存不存在或已过期,执行查询
    $args = array(
        'post_type'      => 'product',
        'meta_key'       => 'sales_count',
        'orderby'        => 'meta_value_num',
        'order'          => 'DESC',
        'posts_per_page' => 5,
    );
    $hot_query = new WP_Query( $args );

ob_start(); // 开启输出缓冲
    // ... 循环输出文章HTML到缓冲区
    if ( $hot_query->have_posts() ) {
        while ( $hot_query->have_posts() ) { $hot_query->the_post();
            // 输出列表项
        }
    }
    wp_reset_postdata();
    $cached_html = ob_get_clean(); // 获取缓冲内容并清空

// 将结果缓存12小时
    set_transient( $transient_key, $cached_html, 12 * HOUR_IN_SECONDS );
}

// 输出缓存或刚生成的内容
echo $cached_html;

استخدم خاصيتي ‘posts_per_page’ و‘offset’ بحذر.’

أحيانًا يرغب المطورون في تخطي العدد المحدد (N) من المقالات الأولى (على سبيل المثال، تخطي العناوين الرئيسية عند عرض “المزيد من الأخبار” في الشريط الجانبي). يمكن القيام بذلك مباشرةً. offset سيتم دمج المعاملات مع نظام التصفح التدريجي (التصفح المجزأ).pagedتنشأ صراعات، مما يؤدي إلى أخطاء في حساب التصفحات (الصفحات). الطريقة الموصى بها أكثر هي استخدامها داخل الحلقة (loop). $query->current_post يمكن استخدام الخصائص لإجراء تقييمات شرطية، أو عند تعديل الاستعلام الرئيسي. pre_get_posts يتم استخدام هذه “المقابس” (hooks) لتنفيذ معالجات منطقية أكثر تعقيدًا، بدلاً من الاكتفاء بمجرد استخدام الانزياحات (offsets) البسيطة.

تعديل الاستعلام الرئيسي عن طريق الاستخدام المباشر (hooking)

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

استضافة.كوم استضافة مشتركة
أداء عالٍ مع وحدات المعالجة المركزية AMD EPYC، ووحدات تخزين NVMe SSD وLiteSpeed، ودعم داخلي متخصص على مدار الساعة طوال أيام الأسبوع، وتدابير أمنية متقدمة بما في ذلك SSL، وقوة الغاشمة، والحماية من البرامج الضارة والحماية من DDoS، وتوفير ما يصل إلى 731 تيرابايت 4 تيرابايت

استخدم دالة `pre_get_posts` داخل ملف `functions.php`.

يجب وضع منطق التعديل داخل الموضوع نفسه. functions.php في الملف، يمكن تغيير سلوك الاستعلام الرئيسي بطريقة أنيقة وفعالة. المفتاح هو استخدام علامات الشرط (مثل…) is_category(), is_tag()والفحص $query->is_main_query() للتأكد من أن التعديلات تتم فقط في السياق الصحيح، وتجنب التأثير على واجهة الإدارة الخلفية أو عمليات الاستعلام الأخرى.

add_action( 'pre_get_posts', 'mytheme_adjust_main_query' );
function mytheme_adjust_main_query( $query ) {
    // 仅在前端、且是主查询、且是“新闻”分类页时执行
    if ( ! is_admin() && $query->is_main_query() && is_category( 'news' ) ) {
        // 让主查询同时获取“post”和“press-release”两种文章类型
        $query->set( 'post_type', array( 'post', 'press-release' ) );
        // 按自定义的“重要性”元字段排序
        $query->set( 'meta_key', 'importance_rating' );
        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'order', 'DESC' );
    }

// 在搜索页,将搜索范围扩展到“产品”自定义文章类型
    if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
        $current_types = $query->get( 'post_type' );
        if ( empty( $current_types ) ) {
            // 默认搜索只包含‘post’,我们加入‘product’
            $query->set( 'post_type', array( 'post', 'page', 'product' ) );
        }
    }
}

الملخصات

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

الأسئلة الشائعة الأسئلة المتداولة

إذا كانت نتائج استعلام WP_Query فارغة، كيف يمكنك تصحيح المشكلة؟

أولاً، قم بفحص صحة أسماء المعاملات وقيمها في مصفوفة المعاملات، خاصة أسماء أنظمة التصنيف ومعرفات أنواع المقالات. ثانياً، استخدم… print_r( $query->request ); بعد تهيئة كائن الاستعلام، قم بطباعة الجملة SQL التي تم تنفيذها فعليًا؛ هذا سيكشف بشكل مباشر عن شروط الاستعلام. وأخيرًا، تأكد من أن المحتوى الذي تقوم باستعلامه موجود بالفعل وأن حالته هpublish)، القيمة الافتراضية WP_Query لا يتم القيام بعمليات البحث عن المسودات أو المقالات المحددة زمنيًا.

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

ما الذي يجب اختياره بين WP_Query و get_posts؟

get_posts استخدام داخل الدالة WP_Queryلكنه بشكل افتراضي يعيد مصفوفة من كائنات المقالات، دون تعديل المتغيرات العامة (مثل…). $postلذلك، عادةً ما لا يكون هناك حاجة لاستدعاء (…) wp_reset_postdata()إنه أخف وزنًا، ومناسب لعمليات استرجاع البيانات البسيطة، مثل إنشاء قائمة بالروابط.WP_Query الكائن (Object) يتمتع بوظائف أكثر شمولاً؛ فهو يحافظ على معلومات إضافية مثل التصفح (pagination) والعدد الإجمالي (total number of items)، كما أن دورة تنفيذ الكود (loop) تقوم بتعيين المتغيرات العامة (global variables) بشكل صحيح the_title() علامات القوالب مثل هذه هي الخيار الأمثل لبناء المحتوى الدوري الرئيسي في قوالب المواضيع.

كيف يمكن البحث عن مقالات لمؤلف معين أو مقالات نُشرت في تاريخ معين؟

يمكن استخدامه. author المعاملات (تقبل معرف المؤلف، اسم المستخدم، أو اللقب المستخدم) و date_query المعاملات (Parameters).date_query قوي جدًا، ويسمح لك بالبحث حسب سنة/شهر/يوم محدد، أو نطاق زمني، أو تواريخ نسبية (مثل “آخر 30 يومًا”)، وما إلى ذلك.

الاستضافة المشتركة InterServer
استضافة مشتركة $2.50 دولار أمريكي في الشهر، الشهر الأول $0.1 دولار أمريكي الرمز الترويجي tryinterserver، 461 نص برمجي للتطبيقات السحابية، تثبيت بنقرة واحدة.
$args = array(
    'author' => 5, // 查询ID为5的作者的文章
    'date_query' => array(
        array(
            'after' => '2026-01-01', // 2026年1月1日之后
            'before' => '2026-12-31', // 2026年12月31日之前
            'inclusive' => true, // 包含起止日期
        ),
    ),
);

لماذا يجب استدعاء دالة `wp_reset_postdata()`؟

في WP_Query أثناء التكرار (الدورة)،the_post() الطريقة ستقوم بتعيين إعدادات على مستوى النظام بأكمله (global settings). $post المتغيرات: إذا لم يتم إعادة تعيين قيمتها، فقد يقوم الكود اللاحق (مثل باقي أجزاء الحلقة الرئيسية، أو مكونات الشريط الجانبي، أو بعض وظائف الإضافات) باستخدام هذه القيم المعدلة بشكل خاطئ. $post قد يؤدي وجود مشاكل في الكائنات (objects) إلى عرض محتوى خاطئ أو إلى حدوث سلوك غير متوقع.wp_reset_postdata() وظيفة هذا الجزء هي… (The function of this part is…) $post استعادة المقالة الحالية إلى الاستعلام الرئيسي أمر بالغ الأهمية لضمان توحيد البيئة العامة. هذا إجراء أمني حيوي.