尝试通过Jetpack JSON API获取自定义发布元数据

时间:2013-12-19 作者:Jody Heavener

我正在使用Wordpress的Jetpack为我的Events 自定义帖子类型,效果良好:

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100

然而,这个CPT还包括由Custom Meta Boxes and Fields for Wordpress. 这些字段包括:

  • _ecmb_supporting_bands
  • _ecmb_tickets_avail
  • _ecmb_event_agelim

    https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key=\'_ecmb_supporting_bands\'

    或者在元键周围没有引号:https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key=_ecmb_supporting_bands

    不幸的是,这不起作用。有人知道我如何在JSON响应中返回这些自定义元字段吗?

2 个回复
最合适的回答,由SO网友:birgire 整理而成

从文档中:

根据JetPack JSON API docs:

默认情况下,API中允许所有元数据密钥,只要它们不是受保护的密钥。默认情况下,以\\u1开头的任何元数据键都受保护。但是,用户可以使用edit\\u post\\u meta(用于编辑和查看)、add\\u post\\u meta和delete\\u post\\u meta功能访问和编辑受保护的元数据密钥,这些功能适用于每个操作。我们还添加了一个过滤器rest\\u api\\u allowed\\u public\\u元数据,允许您专门将任何用户访问的某些元数据密钥列为白名单,即使该密钥受到保护。

所以rest_api_allowed_public_metadata 过滤器是您正在寻找的。

源代码:

如果您查看JetPack的源代码,您将发现以下部分:

    function is_metadata_public( $key ) {
            if ( empty( $key ) )
                    return false;

            // whitelist of post types that can be accessed
            if ( in_array( $key, apply_filters( \'rest_api_allowed_public_metadata\', array() ) ) )
                    return true;

            return false;
    }
在文件中class.json-api-endpoints.php.

您还可以查看allow_bbpress_public_metadata() 作用here 了解如何实现此功能rest_api_allowed_public_metadata 滤器

示例:

下面是一个类似的示例:

/**
 * Whitelist protected meta keys
 *
 * @param array $allowed_meta_keys 
 * @return array $allowed_meta_keys 
 */
function custom_rest_api_allowed_public_metadata( $allowed_meta_keys )
{
    // only run for REST API requests
    if ( ! defined( \'REST_API_REQUEST\' ) || ! REST_API_REQUEST )
        return $allowed_meta_keys;

    $allowed_meta_keys[] = \'_ecmb_supporting_bands\';
    $allowed_meta_keys[] = \'_ecmb_tickets_avail\';
    $allowed_meta_keys[] = \'_ecmb_event_agelim\';

    return $allowed_meta_keys;
}

add_filter( \'rest_api_allowed_public_metadata\', \'custom_rest_api_allowed_public_metadata\' );
JSON输出与此类似:

"metadata":[{"id":"196711","key":"_ecmb_event_agelim","value":"18"},
            {"id":"196709","key":"_ecmb_supporting_bands","value":"The Rolling Stones"}, 
            {"id":"196710","key":"_ecmb_tickets_avail","value":"5500"}]

SO网友:Jose Antonio Escobar Garcia

除了@birgire reply之外,将筛选代码放置在某个地方可能会很棘手:

如果你把它放在主题的“functions.php”文件下,主题更新可能会覆盖你的代码,编写一个只需添加过滤器的插件是很模糊的,这就是为什么我要使用下面的插件,它允许你在Wordpress管理面板中编写自定义操作和过滤器,而不必担心丢失它。http://wordpress.org/plugins/add-actions-and-filters/ .

我和你有同样的问题,包括过滤器后,现在它就像一个魅力。

结束

相关推荐

WordPress统计每个父自定义帖子类型的子帖子,并在用于Google Maps jQuery插件的json数组中使用

因此,我已经找了几天了,但在任何地方都找不到解决这个问题的方法。这是一个客户相当定制的请求。。。我正在使用jQuery谷歌地图插件为管理员使用带有纬度和长坐标的自定义元框创建的每个帖子(区域)添加标记。每个标记都有一个与之关联的工具提示。在工具提示中,我得到了一些文本、用于创建标记本身的每个帖子的标题以及帖子(区域)的永久链接。但我想显示每个帖子(区域)的所有子帖子(交易)的数量。我对(区域)帖子本身进行了处理,但无法让它们显示在我的地图工具提示中。这是我到目前为止所拥有的代码,我认为我离解决方案还很远,