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
, 阅读它可能会让事情慢下来一点。
我必须使用自定义选择查询吗?
谢谢
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\')));
} ?>
然后跟随循环和其余部分。到目前为止看起来不错。