Как упорядочить сообщения по одному пользовательскому полю и отфильтровать их по другому?
В моем блоге WordPress у меня есть события, которые я хочу упорядочить и отфильтровать по пользовательским полям. Порядок должен быть выполнен с помощью настраиваемого поля "event_date_end", что означает, что должно отображаться каждое событие, которое все еще выполняется.
Для упорядочивания событий я использую второе настраиваемое поле "event_date_start". Таким образом, событие, которое начинается 10-го и заканчивается 20-го, должно отображаться до 20-го, но должно быть упорядочено рядом со всеми другими событиями, начинающимися с 10-го.
Я используйте тему в качестве родительской темы, поэтому я использую функцию 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, но будут ли они работать с тематическими? И как я должен писать заявления для архива, категории, списка тегов?
Решение:
Прочитав упомянутые страницы, я нашел следующее решение. Мне пришлось использовать некоторые необработанные 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 answers
Это не сработает, потому что вы устанавливаете один и тот же параметр meta_key
дважды с разными значениями, и только один будет эффективным.
Вместо создания необработанных запросов лучше использовать фильтры для изменения запроса WP. Обзор запросов в документации есть список крючков, в которые вы можете вставлять свои моды (в конце под Какие плагины могут изменять).