2ndkauboy
  • 0
Новичок

Как упорядочить сообщения по одному пользовательскому полю и отфильтровать их по другому?

  • 0

В моем блоге WordPress есть события, которые я хочу упорядочить и отфильтровать по произвольным полям. Порядок должен быть сделан с помощью настраиваемого поля «event_date_end», что означает, что должно отображаться каждое событие, которое все еще выполняется.

Чтобы упорядочить события, я использую второе настраиваемое поле «event_date_start». Таким образом, событие, которое начинается 10-го числа и заканчивается 20-го числа, должно отображаться до 20-го числа, но должно располагаться рядом со всеми другими событиями, начинающимися 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-м, будет помещено ко всем событиям 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');

Теперь я могу легко использовать этот фильтр и упорядочивать циклы индекса и категории, но сохранять фильтр «стиль журнала» по умолчанию и упорядочивать страницы архива.

Share
  1. Это не сработает, потому что вы устанавливаете один и тот же meta_key параметр дважды с разными значениями, и только одно из них будет эффективным.

    Вместо создания необработанных запросов лучше использовать фильтры для изменения запроса WP. В документации Обзора запросов есть список хуков, в которые вы можете вставлять свои моды (в конце раздела Что могут модифицировать плагины ).

    • 0

Оставить ответ

You must login to add an answer.