如何按一个自定义域对帖子进行排序,并按另一个域进行过滤?

时间:2010-09-15 作者:2ndkauboy

在我的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\');
现在,我可以轻松地在索引和类别循环中使用该过滤器和顺序,但在归档页面上保留默认的“日志样式”过滤器和顺序。

1 个回复
最合适的回答,由SO网友:Rarst 整理而成

这行不通,因为您正在设置相同的meta_key 参数两次使用不同的值,只有一个有效。

与其构建原始查询,不如使用过滤器来修改WP查询。Query Overview 文档中列出了可以插入mod的钩子列表(作为插件可以修改的内容下的结尾)。

结束

相关推荐