为什么当我调用WordPress rest API时,post meta[]是空的?

时间:2019-11-20 作者:anonymous-dev

我通过使用/wp-json/wp/v2/my_post_type?my_categorie=43 但是在检查JSON对象时,我注意到meta是空的?我正在使用高级自定义字段,我想在meta[]中获取该帖子类型的所有自定义字段。

我确实设法用旧的传统方式完成了这项工作,但meta缺少一些有关高级自定义字段的信息。例如,在我的高级自定义字段中,我为价格字段使用了一个前置字符,该字段在价格前面放置了一个欧元符号。我注意到,在旧的传统方式中,prepend丢失了。

然后,我查看了高级自定义字段中的一些函数https://www.advancedcustomfields.com/resources/ 发现他们get_field_objects() 使用帖子的id从帖子中获取字段。这确实为我提供了所需的一切,但只针对一篇帖子。问题是,据我所知,这一次只能为一篇文章完成,因此我认为这将非常缓慢,因为我需要获取与术语匹配的所有文章,然后对每个文章执行此函数,这将进行数据库调用以获取字段。我想为我的自定义帖子类型中匹配一个术语的所有帖子都这样做。

但奇怪的是get_field_objects() 查看“网络”选项卡,我真的找不到与此相关的get?所以我不确定它是否会调用数据库。一定是对的吧?否则它将如何获得这些字段?此外,如果我想调用get\\u field\\u objects(),我必须以旧的传统方式进行。

How I currently get them. This is pretty slow

function do_get_posts_by_term_with_fields()
{
    if (!isset($_GET) || !isset($_GET[\'post_type\']) || !isset($_GET[\'taxonomy_name\']) || !isset($_GET[\'term_id\'])) {
        echo "There is something wrong with your get request.";
        die;
    }

    $post_type = $_GET[\'post_type\'];
    $term_id = $_GET[\'term_id\'];
    $taxonomy_name = $_GET[\'taxonomy_name\'];

    $args = array(
        \'post_type\'   => $post_type,
        \'tax_query\' => array(
            array(
                \'taxonomy\' => $taxonomy_name,
                \'field\' => \'id\',
                \'terms\' => $term_id,
                \'include_children\' => false
            )
        )
    );
    $posts = get_posts($args);
    $posts_with_meta =  array_map(\'do_add_fields_to_posts\', $posts);
    echo (json_encode($posts_with_meta));
    die;
}
add_action(\'wp_ajax_get_posts_by_term_with_fields\', \'do_get_posts_by_term_with_fields\');
add_action(\'wp_ajax_nopriv_get_posts_by_term_with_fields\', \'do_get_posts_by_term_with_fields\');

function do_add_fields_to_posts($post)
{
    $post->meta = get_field_objects($post->ID);
    return $post;
}

1 个回复
SO网友:Jacob Peattie

首先,您的问题提到了REST API,但实际上您似乎没有使用REST API。您正在使用管理ajax。php。在你的问题背景下,这是一个重要的区别。

其次get_field_objects() 函数是一个ACF函数,用于获取有关ACF字段的数据。不是元,而是由ACF创建的文本字段。因此,您将获得字段类型、标签、说明等信息,而不仅仅是值。

如果希望将所有帖子元分配给一篇帖子,那么应该使用get_post_meta() 不指定密钥:

$post->meta = get_post_meta( $post->ID );
综上所述,对于您的用例,您实际上应该只使用REST API。你只需要使用register_post_meta() 将所需的元键添加到响应中,如文档所示here:

$meta_args = array(
    \'type\'         => \'string\',
    \'description\'  => \'A meta key associated with a string meta value.\',
    \'single\'       => true,
    \'show_in_rest\' => true,
);
register_post_meta( \'page\', \'my_meta_key\', $meta_args );

相关推荐

Ajax-action.php找不到添加的操作

尊敬的Wordpress插件开发人员同事:,我目前正在开发一个WordPress定制预订插件。在这个插件中,我添加了一个日历短代码,它在页面上嵌入了一个Html月历。我还添加了一些Jquery,当用户单击相应的按钮时,这些Jquery应该会得到上个月或下个月的日历。jquery向管理ajax发送post请求。php,这将触发一个添加的ajax操作。唯一的问题是管理ajax。php返回400,这意味着它找不到操作。我知道会触发Wp\\u Lbs\\u日历的构造函数(这意味着必须添加操作),因为show函数成