按元排除帖子,并保留不含元的帖子

时间:2012-05-04 作者:beholder

edit: 我想我找到了答案,请在此处下方查看答案,或单击以下链接:https://wordpress.stackexchange.com/a/51175/15809

我一直试图找到一种方法来排除带有2个meta键+值的帖子,但也要保留没有meta的帖子。

我查看了parse查询请求,并在我的functions.php:

function filter_out_efter15_posts( $request ) {
    $dummy_query = new WP_Query();
    $dummy_query->parse_query( $request );

    if ( $dummy_query->is_home() || $dummy_query->is_category(\'notiser\') ) {
        $request[\'meta_query\'][0][\'key\'] = \'efter15\';
        $request[\'meta_query\'][0][\'value\'] = \'Nej\';
        $request[\'meta_query\'][0][\'compare\'] = \'=\';
        $request[\'meta_query\'][0][\'type\'] = \'CHAR\';

        $request[\'meta_query\'][1][\'key\'] = \'show_on_front_page\';
        $request[\'meta_query\'][1][\'value\'] = \'Ja\';
        $request[\'meta_query\'][1][\'compare\'] = \'=\';
        $request[\'meta_query\'][1][\'type\'] = \'CHAR\';

        return $request;
    }
    else {
        return $request;
    }
如上所述,首页/主页和类别上的查询notiser (仅包含具有这些meta的帖子的类别)筛选出具有meta键的所有帖子efter15 具有值Nej, 和元键show_on_front_page 具有值Ja.

然而,当我转到标签页时,上述功能不会改变任何内容,因此所有带有该标签的帖子都会显示出来。我仍然希望过滤掉带有metas的帖子。

我可以补充$dummy_query->is_tag(), 但是它会过滤掉所有其他没有meta的帖子。很明显,我无法设置特定的标记,比如类别。

希望你能理解我的意图。有没有干净好的方法来处理这个问题?我希望将查询的数量保持在最低限度,数据库中有20k多篇帖子,因此我不知道如何将它们全部运行到post__not_in, 阅读它可能会让事情慢下来一点。

我必须使用自定义选择查询吗?

谢谢

1 个回复
SO网友:beholder

我想我设法解决了这个问题。

我所做的是在我的functions.php 文件:

add_filter( \'posts_where\', \'exclude_my_posts\' );    

function exclude_my_posts( $where ) {
    global $wpdb;

    //  For the front page. Hide posts with "efter15" set to "Ja", and only show posts with "show_on_front_page" set to "Nej"
    if (is_front_page()) {
        return $where . " AND $wpdb->posts.ID NOT IN ( SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_key = \'efter15\' AND meta_value = \'Ja\' ) AND $wpdb->posts.ID NOT IN ( SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_key = \'show_on_front_page\' AND meta_value = \'Nej\' )";
    }
    //  Always show all in dashboard
    elseif (is_admin()) {
        return $where;
    }
    //  Everywhere else: Hide posts with "efter15" set to "Ja"
    else {
        return $where . " AND $wpdb->posts.ID NOT IN ( SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_key = \'efter15\' AND meta_value = \'Ja\' )";
    }

}
在我的索引中。php文件-目前它还用于类别、标记等(因此是is\\u front\\u page()):

<?php if (is_front_page()) {
    query_posts(array(\'category_name\' => \'notiser\', \'paged\' => get_query_var(\'paged\')));
} ?>
然后跟随循环和其余部分。到目前为止看起来不错。

结束

相关推荐

How to add paging to query

在下面的脚本中,我从存档中调用。php到函数。php检索已标记在为我的“博客”帖子保留的类别中的帖子列表。我在总结中列出了这些帖子,其数量由一个名为“blog\\u count”的选项决定。我需要将分页添加到此函数中,以便blog\\u计数确定初始页面计数,而不是返回的日志总数。要包含此分页,需要对get\\u posts()调用进行哪些更改?例如,我尝试添加“offset”=>3,但它只列出了offset帖子,而不是之前的帖子。//called from archive.php to handle