我在所有帖子上都设置了一个自定义ACF字段,名为event_date
, 我想在给定的时间内获取所有帖子category
, 但是有一些帖子event_date
已定义按的描述顺序放在第一位event_date
. 这个args
我正在使用query_posts
具体如下:
$args = array(
\'posts_per_page\' => -1,
\'cat\' => $category_id,
\'meta_query\' => array(
array(
\'key\' => \'event_date\',
\'value\' => date("Ymd", time()),
\'compare\' => $type == \'upcoming\' ? \'>=\' : \'<\'
)
),
\'orderby\' => \'meta_value\',
\'order\' => \'DESC\',
\'meta_key\' => \'event_date\'
);
但我面临的问题是,ACF字段是为帖子类型创建的,在创建了所有帖子之后,所以很多帖子都没有
event_date
甚至为meta\\u键定义(当使用
query_posts($args)
. 有太多的帖子,无法浏览所有帖子并手动保存,这将花费很长时间。
基本上,如果meta_key
对于任何帖子都没有event_date
比我需要使用date
实际的帖子本身(发布时)来订购。我需要所有帖子event_date
按以下顺序显示第一个event_date
, 比所有没有event_date
定义后,需要按照描述顺序使用帖子的发布日期显示。我该怎么做?最好是1合一query_posts
呼叫
谢谢:)
最合适的回答,由SO网友:Milo 整理而成
您可以通过OR
meta_query
还将检查密钥是否不存在:
\'meta_query\' => array(
\'relation\' => \'OR\',
array(
\'key\' => \'event_date\',
\'compare\' => \'NOT EXISTS\',
),
array(
\'key\' => \'event_date\',
\'value\' => date("Ymd", time()),
\'compare\' => \'>\',
),
),
\'orderby\' => array(
\'meta_value_num\' => \'DESC\',
\'date\' => \'ASC\',
),
SO网友:Pieter Goosen
我最可能的做法是运行一个脚本,将所需的自定义字段添加到没有指定自定义字段的帖子中。
您可以尝试以下操作:(NOTE: 这是未经测试的
add_action( \'wp\', function ()
{
$args = [
\'post_type\' => \'post\', // Set according to needs
\'posts_per_page\' => -1, // Set to execute smaller chucks per page load if necessary
\'suppress_filters\' => true,
\'fields\' => \'ids\',
\'meta_query\' => [
[
\'key\' => \'event_date\',
\'compare\' => \'NOT EXISTS\'
]
]
];
$q = get_posts( $args );
foreach ( $q as $post_id ) {
add_post_meta(
$post_id, // Post ID
\'event_date\', // Custom field name
get_the_date( \'Ymd\', $post_id )
);
}
});
您只需加载任何页面即可运行此操作,然后即可将其删除。如果你设置较小的Chunks,比如
posts_per_page=100
, 您将刷新页面,直到完成所有帖子。请注意,这是一个非常昂贵的资源意图脚本,可能会导致超时致命错误,因此如果您有大量的帖子,则可以在每页加载时运行较少的帖子。
之后,您可以按照问题正常运行查询。只是一个提示,永远不要使用query_posts
, 使用WP_Query
运行自定义查询(或使用get_posts
或者