我在后端使用pre\\u get\\u posts()作为自定义帖子类型屏幕,其中通常显示所有记录。
我的动作是只显示今天的帖子。这很好,但当我尝试对不同的日期使用默认过滤器时,我没有得到任何数据,即使我知道有数据。(删除操作将显示所有数据)。
是否有一种方法可以使用pre\\u get\\u帖子,但仍然过滤/显示以前的日期?
add_action ( \'pre_get_posts\', \'modify_query_get_apps_by_date\' );
function modify_query_get_apps_by_date( $query ) {
if ( is_admin() && $query->is_main_query() && $query->get( \'post_type\' ) == \'apps\' ) {
$query->set( \'meta_query\', [
[
\'key\' => \'app_date\',
\'value\' => date(\'d-m-Y\'),
],
]);
}
}
最合适的回答,由SO网友:Tom J Nowell 整理而成
问题是你always 设置元查询,如果不希望它应用于特定情况,则需要检查该情况并对其进行说明。类似于您已经检查的方式is_admin
, 或is_main_query
, 等
在这种情况下,您需要检查$_GET
参数,用于检测是否已在posts屏幕上应用了过滤器,并且仅在不存在元查询时设置元查询。在这种情况下,我相信使用的参数是m
, 但是URL中还有几个其他内容需要检查
进一步说明:
当你让过滤器工作时,你可能看不到预期的结果,因为过滤器在发布日期工作。如果希望看到按日期筛选的应用程序,则需要检测何时进行筛选,并添加不同的元查询来查询app_date
通过这些过滤器参数,然后撤消默认过滤器,通过其帖子元过滤帖子是昂贵的!真的,真的很贵!把这些当作你偶尔做的稀罕事。我见过一些主要网站因为简单的post meta查询而崩溃,这给数据库带来了很大的压力。这就是为什么要创建分类表,否则,类别和标记将存储在post meta中。如果您可以重新调整发布日期的用途,那么huge 差异您没有对日期值使用标准格式。不仅如此,它们还模棱两可!改用YYY-MM-DD并遵循商定的ISO标准,您将获得更好的兼容性,可以考虑使用\'type\' => \'DATE\'
通过将这些条件分隔为保护并提前退出,可以使函数更易于阅读和修改,例如:。if ( !is_admin() ){ return; }
, 这也使得调试更加容易,并且允许您在出现问题时单独测试每个检查,您的代码中也有一个bug,与您的问题无关,但仍然是一个bug。代码检查当前查询是否针对特定的职位类型,但因为它使用了赋值运算符=
而不是比较运算符==
, 它不检查它们是否匹配,而是设置/分配值。因此,所有查询现在都是apps
. 这与你问题中的问题无关。