在我的WordPress博客中,我有一些事件要按自定义字段排序和筛选。顺序应由自定义字段“event\\u date\\u end”完成,这意味着应显示仍在运行的每个事件。
为了对事件进行排序,我使用了第二个自定义字段“event\\u date\\u start”。所以一个从10号开始到20号结束的活动应该一直显示到20号,但应该排在从10号开始的所有其他活动的后面。
我使用主题作为父主题,因此我使用query\\u 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\\u date\\u start”值进行筛选。因此,昨天开始但仍在进行的事件将不会显示。
如果我切换“过滤器”和“订单”部分的顺序,我将看到所有事件,但从10号开始到20号结束的事件将被放置到20号的所有事件。
我知道我可以自己用SQL创建查询,但它们是否可以用于主题?我必须如何为归档、分类和标记列表编写语句?
The solution:
在阅读了上述页面后,我找到了以下解决方案。我必须使用一些原始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\');
现在,我可以轻松地在索引和类别循环中使用该过滤器和顺序,但在归档页面上保留默认的“日志样式”过滤器和顺序。