有没有办法通过任何可用的内置WordPress API获得受保护的元字段?(xmlrpc,wp-json)

时间:2016-12-14 作者:samy

WordPress有几个内置API:

  • XML-RPC
  • REST API

    我想访问插件的受保护元字段。我试着遵循给出的例子herehere.

    我确实设法通过添加以下代码使wp json API返回自定义的post类型:

    /**
     * Add REST API support to an already registered post type.
     */
    add_action( \'init\', \'my_custom_post_type_rest_support\', 25 );
    
    function my_custom_post_type_rest_support() {
    
      global $wp_post_types;
    
      // be sure to set this to the name of your post type!
      $post_type_name = \'tribe_venue\';
    
      if( isset( $wp_post_types[ $post_type_name ] ) ) {
          $wp_post_types[$post_type_name]->show_in_rest = true;
          $wp_post_types[$post_type_name]->rest_base = $post_type_name;
          $wp_post_types[$post_type_name]->rest_controller_class = \'WP_REST_Posts_Controller\';
      }
    
      $post_type_name2 = \'tribe_events\';
    
      if( isset( $wp_post_types[ $post_type_name2 ] ) ) {
          $wp_post_types[$post_type_name2]->show_in_rest = true;
          $wp_post_types[$post_type_name2]->rest_base = $post_type_name2;
          $wp_post_types[$post_type_name2]->rest_controller_class = \'WP_REST_Posts_Controller\';
      }
    }
    
    但我无法在响应中包含受保护的元密钥。

    我尝试了以下代码:

    add_filter( \'is_protected_meta\', function ( $protected, $key, $type ) {
        if ( $type === \'tribe_venue\' && $key === \'_VenueVenue\' ) {
            return true;
        }
        return $protected;
    }, 10, 3 );
    
    add_filter( \'rae_include_protected_meta\', \'__return_true\' );
    
    以及以下代码:

    function custom_rest_api_allowed_public_metadata($allowed_meta_keys){
        $allowed_meta_keys[] = \'_VenueVenue\';
        $allowed_meta_keys[] = \'_VenueAddress\';
        $allowed_meta_keys[] = \'_VenueCity\';
        return $allowed_meta_keys;
    }
    
    add_filter( \'rest_api_allowed_public_metadata\', \'custom_rest_api_allowed_public_metadata\' );
    
    但两者都不起作用。

    有人知道需要什么才能通过任何API访问这些受保护的字段吗?是否有一个可行的例子?

2 个回复
SO网友:Levi Dulstein

对我来说,最简单的解决方案是在JSON响应中创建额外的字段,并用选定的post meta填充它:

function create_api_posts_meta_field() {

    // "tribe_venue" is your post type name, 
    // "protected-fields" is a name for new JSON field

    register_rest_field( \'tribe_venue\', \'protected-fields\', [
        \'get_callback\' => \'get_post_meta_for_api\',
        \'schema\' => null,
    ] );
}

add_action( \'rest_api_init\', \'create_api_posts_meta_field\' );

/**
 * Callback function to populate our JSON field
 */
function get_post_meta_for_api( $object ) {

    $meta = get_post_meta( $object[\'id\'] );

    return [
        \'venue\'   => $meta[\'_VenueVenue\']   ?: \'\',
        \'address\' => $meta[\'_VenueAddress\'] ?: \'\',
        \'city\'    => $meta[\'_VenueCity\']    ?: \'\',
    ];
}
您应该能够在/wp-json/wp/v2/tribe_venue//wp-json/wp/v2/tribe_venue/{POST_ID}

SO网友:J.C. Hiatt

对于REST API,有一个rest_query_vars 您可以使用的筛选器:

function my_allow_meta_query( $valid_vars ) {

    $valid_vars = array_merge( $valid_vars, array( \'meta_key\', \'meta_value\') );

    return $valid_vars;
}

add_filter( \'rest_query_vars\', \'my_allow_meta_query\' );
这允许您使用如下路由查询元字段:

wp-json/wp/v2/posts?filter[meta_key]=MY-KEY&filter[meta_value]=MY-VALUE

还有更复杂的方法可以做到这一点。查看下面的源链接。

资料来源:https://1fix.io/blog/2015/07/20/query-vars-wp-api/

相关推荐

如果有新数据,则使用wp_cron和wp_mail发送电子邮件警报(外部API)-伪代码

我想每天检查两次是否发布了一些新数据,如果是这样的话,请给我发一封电子邮件。在这里的伪代码中,我认为我可以做到:获取新电影列表(外部API请求)获取旧电影列表(在某处存储,但如何存储?)</比较两个列表发送电子邮件和wp\\U邮件,下次更新旧列表的内容(如何?)</每天用wp\\u cron重复这一过程两次我的问题是,我不知道如何以及在哪里存储以前的电影列表?我曾想过可以在函数中调用一个全局变量,但从目前为止的情况来看,似乎最好避免使用全局变量?另外,我不知道是否可以为下一个任务更新全局变量。