ترتيب مقالات ووردبريس باستخدام حقول ACF التكرارية
في عالم نظم إدارة المحتوى، تعتبر ووردبريس واحدة من المنصات الأكثر شيوعًا، خاصة عند التعامل مع أنواع محتوى مخصصة مثل الجولات السياحية. لكن، قد تواجه بعض التحديات عندما تحتاج إلى عرض وتصفية هذه الجولات بناءً على معلومات مخزنة في حقول مكررة باستخدام أداة ACF (Advanced Custom Fields). سنتناول في هذا المقال كيفية فرز منشورات ووردبريس باستخدام حقول ACF المكررة، لتسهيل عرض الجولات المتاحة اليوم وترتيبها حسب السعر.
استعراض الجولات المتاحة اليوم
تبدأ العملية بفحص توفر الجولات السياحية في التاريخ المحدد، وهو اليوم الحالي. باستخدام الحقول المكررة ACF، يمكنك تخزين التواريخ المتاحة لكل جولة. عند استعراض الجولات، يجب عليك النظر في كل جولة والتأكد مما إذا كانت تحتوي على تواريخ متاحة تتضمن التاريخ الحالي.
لذا، سنقوم بإنشاء حلقة تتكرر عبر المشاركات (المنشورات) المخزنة، وداخل كل جولة، نستخدم دالة have_rows
لفحص التواريخ المتاحة. إذا كانت التواريخ تضم التاريخ الحالي، نضيف هذه الجولة إلى مصفوفة جديدة تحتوي فقط على الجولات المتاحة لهذا اليوم.
فرز الجولات حسب السعر
بعد جمع الجولات المتاحة، الخطوة التالية هي فرزها حسب السعر. يمكن تحقيق ذلك بسهولة باستخدام متغيرات URL مثل sort=high_price
أو sort=low_price
. سنقوم بإنشاء دوال فرز لتعديل ترتيب الجولات بناءً على السعر.
عندما نجمع الجولات المتاحة، نستخدم دالة usort
لترتيب المصفوفة حسب السعر، إما بشكل تنازلي أو تصاعدي بناءً على معلمة الترتيب المستخدمة في URL.
الكود المستخدم في التحصيل والفرز
لنبدأ بتنفيذ الكود الذي يقوم بهذه العمليات:
function custom_elementor_query( $query ) {
if ( is_archive() && $query->get('post_type') == 'tour' ) {
$today_date = date('Ymd'); // صيغة Ymd لتاريخ اليوم
$tours = array();
// استخدام الاستعلام الحالي لجلب النتائج
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
if (have_rows('available_dates', $post_id)) {
while (have_rows('available_dates', $post_id)) {
the_row();
$start_date = get_sub_field('start_date');
$end_date = get_sub_field('end_date');
$price = get_sub_field('price');
if ($today_date >= $start_date && $today_date <= $end_date) {
$tours[] = array(
'post_id' => $post_id,
'title' => get_the_title($post_id),
'start_date' => $start_date,
'end_date' => $end_date,
'price' => $price,
'permalink' => get_permalink($post_id)
);
}
}
}
}
wp_reset_postdata();
}
if (!empty($tours)) {
if (isset($_GET['sort']) && $_GET['sort'] == 'high_price') {
usort($tours, function($a, $b) {
return $b['price'] - $a['price'];
});
} elseif (isset($_GET['sort']) && $_GET['sort'] == 'low_price') {
usort($tours, function($a, $b) {
return $a['price'] - $b['price'];
});
}
// تعديل الاستعلام مع معرفات الجولات المرتبة
$post_ids = array_column($tours, 'post_id');
$query->set('post__in', $post_ids);
$query->set('orderby', 'post__in');
} else {
// في حالة عدم وجود نتائج، تعيين استعلام فارغ
$query->set('post__in', array(0));
}
}
}
add_action('elementor/query/my_tour_archive', 'custom_elementor_query');
تجنب مشكلة استنفاد الذاكرة
عند تنفيذ الكود، قد تصادف مشكلة استنفاد الذاكرة. أحد الأسباب الأكثر شيوعًا هو عدد الجولات أو مدى تعقيد الحقول المكررة. للحفاظ على أداء النظام، يمكنك تطبيق تقنيات تحسين مثل:
- تصفية الاستعلام من البداية: بدلاً من استرجاع جميع الجولات عند الحاجة، حاول استخدام استعلامات مخصصة لتقليل نتائج الجولات المسترجعة.
- تجنب الاستعلامات المعقدة: حاول تقليل عدد الحقول التي تحتاج إلى التعامل معها في عملية الفرز.
- تطبيق التخزين المؤقت: بالإضافة إلى تحسين الاستعلام، قد يكون التخزين المؤقت وسيلة فعالة لتقليل الضغط على الذاكرة.
الخلاصة
عند الحديث عن كيفية فرز منشورات ووردبريس باستخدام حقول ACF المكررة، يمثل هذا موضوعًا مهمًا للغاية لأصحاب المواقع الذين يتعاملون مع أنواع محتوى مشابهة. باستخدام الأساليب الموصوفة، يمكنك تحسين تجربة المستخدم من خلال عرض الجولات المتاحة بفعالية، مع القدرة على فرزها وفقًا للسعر. تذكر دائمًا مراقبة أداء الموقع والتأكد من عدم وجود مشاكل في استنزاف الموارد. بتطبيق هذه النصائح، يمكنك تحقيق تنظيم فعال للمحتوى وتحسين سرعة الصفحة لتجربة مستخدم سلسة.