我正在加入woocommerce订阅操作事件,当我收到一个POST
请求时,连接似乎很好,但是有效负载仅包含以下内容,而我期望像下订单时即触发webhook。有什么想法吗?
{
"action": "woocommerce_checkout_subscription_created",
"arg": {
"order_type": "shop_subscription"
}
}
我对PHP有足够的能力,但是我不知道从何处开始使用wordpress。任何帮助将不胜感激
更新: 因此,我找到了负责创建我所看到的有效负载的代码,它是:
/**
* Get WP API integration payload.
*
* @since 3.0.0
* @param string $resource Resource type.
* @param int $resource_id Resource ID.
* @param string $event Event type.
* @return array
*/
private function get_wp_api_payload( $resource, $resource_id, $event ) {
$rest_api_versions = wc_get_webhook_rest_api_versions();
$version_suffix = end( $rest_api_versions ) !== $this->get_api_version() ? strtoupper( str_replace( 'wp_api', '', $this->get_api_version() ) ) : '';
switch ( $resource ) {
case 'coupon':
case 'customer':
case 'order':
case 'product':
$class = 'WC_REST_' . ucfirst( $resource ) . 's' . $version_suffix . '_Controller';
$request = new WP_REST_Request( 'GET' );
$controller = new $class();
// Bulk and quick edit action hooks return a product object instead of an ID.
if ( 'product' === $resource && 'updated' === $event && is_a( $resource_id, 'WC_Product' ) ) {
$resource_id = $resource_id->get_id();
}
$request->set_param( 'id', $resource_id );
$result = $controller->get_item( $request );
$payload = isset( $result->data ) ? $result->data : array();
break;
// Custom topics include the first hook argument.
case 'action':
$payload = array(
'action' => current( $this->get_hooks() ),
'arg' => $resource_id,
);
break;
default:
$payload = array();
break;
}
return $payload;
}
显然,编辑此代码并不明智,因为它将在woocomm的下一次更新中被吹走。我应该如何将我需要的参数添加到有效载荷中?
答案 0 :(得分:0)
我遇到了同样的问题,但最终我明白了该怎么做:$ subscription对象仅序列化WC_subscrition对象的公共成员,因此,如果要使用私有字段,则必须使用getter。例如,如果您需要woocommerce_subscription_payment_complete操作的试用期到期日,则可以这样:
function fn_woocommerce_subscription_payment_complete ($subscription)
{
'subscription_trial_end' => $subscription->get_date( 'trial_end' );
//do whatever you want
}
add_action( 'woocommerce_subscription_payment_complete', 'fn_woocommerce_subscription_payment_complete', 10, 1 );
最后,请注意从action传递的参数数量(add_action()中的最后一个参数)
答案 1 :(得分:0)
要添加到 Mauro's 答案中,实际上只有 WC_Subscription
对象中的公共变量被序列化。通过使用以下代码在 WC_Subscription 类中创建一个新的临时公共变量,我能够在 webhook 负载中包含 id(或任何其他属性):
function fn_woocommerce_subscription_payment_complete ($subscription)
{
$subscription->my_id=$subscription->get_id();
}
add_action( 'woocommerce_subscription_renewal_payment_complete', 'fn_woocommerce_subscription_payment_complete', 10, 1 );