Php 根据Woocommerce 3中的订单状态向配送服务发送订单
我的订单会自动发送到外部送货服务。但当订单的状态发生变化时,它会再次发送到外部交付服务。如何修复它Php 根据Woocommerce 3中的订单状态向配送服务发送订单,php,wordpress,if-statement,woocommerce,orders,Php,Wordpress,If Statement,Woocommerce,Orders,我的订单会自动发送到外部送货服务。但当订单的状态发生变化时,它会再次发送到外部交付服务。如何修复它 add_action( 'woocommerce_order_status_changed', 'order_stock_reduction_based_on_status', 20, 4 ); function order_stock_reduction_based_on_status( $order_id, $old_status, $new_status, $order ){ //
add_action( 'woocommerce_order_status_changed', 'order_stock_reduction_based_on_status', 20, 4 );
function order_stock_reduction_based_on_status( $order_id, $old_status, $new_status, $order ){
// Only for 'processing' and 'hold-on' order statuses change
if ( $new_status == 'processing' || $new_status == 'hold-on' ) {
// Checking if this has already been done avoiding reload
if (get_post_meta($order_id, 'delivery_order_id', true)) {
return; // Exit if already processed
}
}
$order_data = $order->get_data();
// Send data
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://app.example.com/api/index.php?new_order");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
curl_close($ch);
$decoded = (array) json_decode($result);
// Output
if( isset($decoded['result']) && $decoded['result'] == 'success' && isset($decoded['order_id']) && !empty($decoded['order_id']) ){
update_post_meta( $order_id, 'delivery_order_id', esc_attr( $decoded['order_id'] ) );
}
}
我认为问题很简单。第一个
IF
语句应该在末尾关闭,以避免重复问题
因此,您的代码将是:
add_action( 'woocommerce_order_status_changed', 'order_stock_reduction_based_on_status', 20, 4 );
function order_stock_reduction_based_on_status( $order_id, $old_status, $new_status, $order ){
// Only for 'processing' and 'hold-on' order statuses change
if ( $new_status == 'processing' || $new_status == 'hold-on' ) {
// Checking if this has already been done avoiding reload
$delivery_order_id = get_post_meta($order_id, 'delivery_order_id', true);
if ( ! empty( $delivery_order_id ) ) {
return; // Exit if already processed
}
$order_data = $order->get_data();
// Send data
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://app.example.com/api/index.php?new_order");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
curl_close($ch);
$decoded = (array) json_decode($result);
// Output
if( isset($decoded['result']) && $decoded['result'] == 'success' && isset($decoded['order_id']) && !empty($decoded['order_id']) ){
update_post_meta( $order_id, 'delivery_order_id', esc_attr( $decoded['order_id'] ) );
}
} // <== <== <== <== Closing bracket HERE
}
add_action('woocommerce_order_status_changed'、'order_stock_reduction_based_on u status',20,4);
功能订单库存减少基于订单状态($order\u id,$old\u status,$new\u status,$order){
//仅用于“处理”和“保留”订单状态更改
如果($new_status=='processing'| |$new_status=='hold on'){
//检查是否已完成此操作以避免重新加载
$delivery\u order\u id=get\u post\u meta($order\u id,'delivery\u order\u id',true);
如果(!空($delivery\u order\u id)){
return;//如果已处理,则退出
}
$order_data=$order->get_data();
//发送数据
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,”https://app.example.com/api/index.php?new_order");
curl_setopt($ch,CURLOPT_FAILONERROR,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch,CURLOPT_超时,30);
卷曲设置($ch,卷曲设置桩,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$result=curl\u exec($ch);
卷曲关闭($ch);
$decoded=(数组)json_decode($result);
//输出
如果(isset($decoded['result'])和&$decoded['result']='success'&&isset($decoded['order\u id'])和&!empty($decoded['order\u id'])){
更新发布元数据($order\u id,'delivery\u order\u id',esc\u attr($decoded['order\u id']);
}
}//您是否测试过设置post meta字段以存储订单是否已发送到外部配送服务?然后,您可以检查该值,如果该值为真,则返回该值。就像您已经为Exit(如果已处理)所做的一样。是的,此字段有值,但当您在“管理”面板中更改订单的状态时,订单仍会重新发送。当rE提交,此字段被新字段覆盖。您指的是哪个字段?交货\订单\ id