it-swarm.asia

كيف تطلب المنشورات حسب مجال مخصص وتصفها حسب مجال آخر؟

في مدونتي WordPress لدي أحداث أريد أن أطلبها وأرشحها حسب الحقول المخصصة. يجب أن يتم الترتيب بواسطة الحقل المخصص "event_date_end" مما يعني أنه يجب عرض كل حدث لا يزال قيد التشغيل.

لطلب الأحداث ، استخدم حقل مخصص آخر "event_date_start". لذا ، فإن الحدث ، الذي يبدأ في العاشر وينتهي في العشرين ، يجب أن يتم عرضه حتى اليوم العشرين ، ولكن يجب أن يكون الترتيب بجوار جميع الأحداث الأخرى التي تبدأ في 10.

أستخدم Thematic كموضوع رئيسي ، ولذا فإنني أستخدم دالة query_posts () لإضافة كلا القواعد كمعلمات. هذه هي الطريقة التي استخدمها في حلقة الفهرس:

function my_index_loop($content) {
    global $query_string;
    query_posts($query_string
    // filter by event_date_end
    ."&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')
    // order by event_date_start
    ."&meta_key=event_date_start&orderby=meta_value&order=ASC"); 
}
add_filter('thematic_indexloop', 'my_index_loop');

الآن يتم ترتيب النشرات بشكل صحيح ، ولكن سيتم إجراء التصفية أيضًا على قيمة "event_date_start". لذلك ، الحدث الذي بدأ أمس وما زال مستمراً ، لن يتم عرضه.

إذا قمت بتبديل ترتيب الأجزاء "عامل التصفية" و "الترتيب" ، فسوف أرى كل الأحداث ، ولكن الحدث الذي يبدأ في 10 وينتهي في 20 سيتم وضعه على كل الأحداث في العشرين.

أعلم أنه يمكنني إنشاء استعلامات في SQL بنفسي ، لكن هل ستعمل مع Thematic؟ وكيف يجب علي كتابة بيانات لأرشيف ، فئة ، قائمة علامات؟

الحل :

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

function my_loop_where($where){
    global $wpdb;
    $where .= " AND pm_where.meta_value >= '".date('Y-m-d')."'";
    return $where;
}

function my_loop_join($join){
    global $wpdb;
    $join .= " LEFT JOIN " . $wpdb->postmeta . " AS pm_order ON (" . $wpdb->posts . ".ID = pm_order.post_id AND pm_order.meta_key = 'event_date_start')";
    $join .= " LEFT JOIN " . $wpdb->postmeta . " AS pm_where ON (" . $wpdb->posts . ".ID = pm_where.post_id AND pm_where.meta_key = 'event_date_end')";
    return $join;
}

function my_loop_order(){
    return 'pm_order.meta_value ASC';
}

وأكثر من مجرد إضافة عامل تصفية لهذه الوظائف داخل على سبيل المثال حلقة الفهرس:

function my_index_loop($content) {
    global $query_string;
    add_filter('posts_where', 'my_loop_where' );    
    add_filter('posts_join', 'my_loop_join' );
    add_filter('posts_orderby', 'my_loop_order' );
    query_posts($query_string . "&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')/*."&meta_key=event_date_start&orderby=meta_value&order=ASC"*/);
}
add_filter('thematic_indexloop', 'my_index_loop');

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

1
2ndkauboy

لن ينجح هذا ، لأنك تقوم بتعيين المعلمة meta_key نفسها مرتين بقيم مختلفة وستكون واحدة فقط فعالة.

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

1
Rarst