Woocommerce REST API v2:向订单添加自定义数据的问题

时间:2018-02-20 22:26:47

标签: woocommerce hook-woocommerce woocommerce-rest-api

我有一个站点运行旧版本的Woo v2.5.5,使用旧版v3 for API。我能够使用动作woocommerce_api_order_response将数据添加到订单中。

类似的东西:

add_action( 'woocommerce_api_order_response', 'add_testing_api_function', 10, 1 );
function add_testing_api_function( $order_data ) {
    $order_data['foo'] = "testing";
    return $order_data;
}

这适用于较旧的API链接:

https://example.com/wc-api/v3/orders?consumer_key=KEY&consumer_secret=SECRET

但是,我需要更新到Woo v3.3 +,REST API服务器更新为:

https://example.com/wp-json/wc/v2/orders?consumer_key=KEY&consumer_secret=SECRET

我的自定义数据不再显示,并且挂钩似乎不起作用。还有其他我可以使用吗?

1 个答案:

答案 0 :(得分:2)

WC API确实是一个很棒的工具。在WooCommerce 3.x中将自己的自定义数据添加到WC API车间订单的响应中,仍然可以像使用旧版API一样容易地实现。

WooCommerce具有针对其大多数API响应(see)的这些准备过滤器。请注意,它们的格式为woocommerce_rest_prepare_{$post_type},其中$post_type是帖子类型或分类名称,例如shop_ordersproduct_cat。在WooCommerce 2.7+中,其中一些过滤器还带有_object后缀。

只要我们打算将自定义数据添加到订单,则使用的正确过滤器将是woocommerce_rest_prepare_shop_order_object,其中shop_order是我们的{$post_type},后跟_object后缀(如上所述)。

以下功能有条件地获取用户元数据,并返回用户的社交资料的头像网址(如果有)。

/**
 * Add custom data to WC API shop order response
 * Overriding "$object" here with $order so it's easier to access its properties
 */
function my_wc_rest_prepare_order( $response, $order, $request ) {

  if( empty( $response->data ) )
    return $response;

  $order_id = $order->get_id();

  // Get an instance of the WC_Order object
  $order = wc_get_order($order_id);

  // Get the user ID from WC_Order methods
  $user_id = $order->get_customer_id(); // $order->get_user_id(); // or $order->get_customer_id();

  // check for WooCommerce Social Login User Avatar
  if( class_exists( 'WC_Social_Login' ) ) {

    $fb_avatar = get_user_meta( $user_id, '_wc_social_login_facebook_profile_image', true );
    $gplus_avatar = get_user_meta( $user_id, '_wc_social_login_google_profile_image', true );

  }

  $social_data = array();
  $avatar_url  = array();

  $customer_picture = array(
    'default'   => get_avatar_url( $user_id ),
    'facebook'  => ( $fb_avatar ) ? esc_url( $fb_avatar ) : '',
    'google'    => ( $gplus_avatar ) ? esc_url( $gplus_avatar ) : ''
  );

  $response->data['social_data']['avatar_url'] = $customer_picture;

  return $response;
}
add_filter( 'woocommerce_rest_prepare_shop_order_object', 'my_wc_rest_prepare_order', 10, 3 );

结果:

[{
"social_data": {
  "avatar_url": {
    "default": "https://secure.gravatar.com/avatar/6e27402273b47316097247a2057492f8?s=96&d=mm&r=g",
    "facebook": "https://graph.facebook.com/2028542057604385/picture?width=150&height=150",
    "google": ""
  }
},
}]