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

问题描述 投票:1回答:1

我有一个站点运行旧版本的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

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

woocommerce hook-woocommerce woocommerce-rest-api
1个回答
2
投票

WC API确实是一个很棒的工具。将自己的自定义数据添加到WC API商店订单在WooCommerce 3.x中的响应仍然可以像以前使用旧版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后缀(如上所述)。

以下函数有条件地获取用户元并返回用户的社交个人资料的头像URL(如果可用)。

/**
 * 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 );

Result:

[{
"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": ""
  }
},
}]
© www.soinside.com 2019 - 2024. All rights reserved.