根据自定义字段布尔值将POST从wp_Query中排除

时间:2020-08-05 作者:user1486133

我试图给用户一个选项来选择;“从主页博客列表中排除”;然后在我的主页上查询,这样某些帖子就不会出现在主页上。

我正在使用Wordpress自定义字段;真/假;。

在一篇勾选了方框的帖子上,根据以下查询参数,我假设这篇帖子不会出现在主页上:

$query_args = array(
    \'meta_query\' => array(
        \'key\' => \'exclude_from_homepage_bloglist\',
        \'value\' => false
    )
);
然而,即使勾选了真/假框,查询仍然会输出有问题的帖子。

我在元查询中哪里出错了?

2 个回复
SO网友:Tom J Nowell

排除查询中的内容非常昂贵,但也是可以避免的。更重要的是,根据帖子的元数据过滤帖子也非常昂贵。随着帖子数量的增加,该查询将以指数级的速度变慢。

相反,你可以通过告诉它你想要什么,而不是你不想要什么来完全避免这种情况。因此,与其从主页中排除内容,不如将其包括在内。

为了避免后期元查询并使其超快速,请使用私有分类法。设置\'public\' => false 注册时。

最后,假设我们的私有分类法被称为filters, 我们可以加入save_post 和设置show_on_homepage 用这样的钩子:


add_action( \'init\', function() {
    register_taxonomy( \'filters\', \'post\', [
        \'public\' => false
    ] );
} );

add_filter( \'save_post\', function( int $post_id ) : int {
    $hide = get_post_meta( $post_id, \'exclude_from_homepage_bloglist\', true );

    if ( $hide ) {
        wp_remove_object_terms( $post_id, [ \'homepage-show\' ], \'filters\' );
    } else {
        wp_add_object_terms( $post_id, [ \'homepage-show\' ], \'filters\' );
    }
    
    return $post_id;
}
现在你有了一种超级快速的方法来过滤主页上的内容,例如:。

add_action( \'pre_get_posts\', function ( $query ) {
    if ( ! $query->is_home() ) {
        return; // we only want the homepage
    }
    $query->set( \'filters\', \'homepage-show\' );
}
你有一个非常有用的方法来突出事物!如果您还添加了featured 地区然后您可以添加featured 术语和查询如下:

$query = new WP_Query( [
    \'filters\' => \'featured\'
] );
// followed by a standard post loop...
当然,您仍然有您的post meta,如果您愿意,可以删除它并使用has_term 但您可能正在使用类似ACF的插件来为您提供UI。ACF和其他人可以被告知使用分类法进行保存,但您可以使用它并保留post meta,以便在需要时简化操作。您还需要将主页显示术语添加到所有现有帖子中,以便它们也显示在主页上

SO网友:mozboz

您的代码很接近,但令人困惑meta_query 是一个包含要检查的值数组的内容数组,因此需要额外级别的数组:

$query_args = array(
    \'meta_query\' => array(
        array(
            \'key\' => \'exclude_from_homepage_bloglist\',
            \'value\' => false
        )
    )
);
您可能还需要再次检查复选框中的值是否确实存储为PHP值false 如果未选中,这也可能导致此代码不起作用。

有关WP\\U查询参数的更多参考信息,请参见:https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters