ACF自定义域WP_QUERY,但如果域不存在,则需要获取所有帖子

时间:2016-02-05 作者:Solomon Closson

我在所有帖子上都设置了一个自定义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 呼叫

谢谢:)

2 个回复
最合适的回答,由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 或者

相关推荐