【发布时间】:2022-01-19 11:43:46
【问题描述】:
我需要在获得新订单时自动设置某个订单状态(不同于处理中)。
这是通过这个函数实现的:
add_action('woocommerce_thankyou','change_order_status');
function change_order_status( $order_id ) {
if ( ! $order_id ) { return; }
$order = wc_get_order( $order_id );
if( 'processing'== $order->get_status() ) {
$order->update_status( 'wc-custom-status' );
}
}
这完全有效。现在,我只需要在产品具有自定义功能时发生这种情况。
自定义产品的方法是在添加到购物车之前填写输入字段。输入附加到项目数据:
// Add custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 10, 2 );
function add_custom_cart_item_data( $cart_item_data, $product_id ){
if( isset($_POST['custom_text']) ) {
$cart_item_data['custom_text'] = sanitize_text_field( $_POST['custom_text'] );
$cart_item_data['unique_key'] = md5( microtime().rand() ); // Make each item unique
}
return $cart_item_data;
}
然后使用以下命令检索自定义文本并将其显示在购物车和订单数据中:
// Display custom cart item data on cart and checkout
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 10, 2 );
function display_custom_cart_item_data( $cart_item_data, $cart_item ) {
if ( !empty( $cart_item['custom_text'] ) ){
$cart_item_data[] = array(
'name' => __('Customization', 'woocommerce'),
'value' => $cart_item['custom_text'] // Already sanitized field
);
}
return $cart_item_data;
}
// Save and display custom item data everywhere on orders and email notifications
add_action( 'woocommerce_checkout_create_order_line_item', 'add_product_custom_field_as_order_item_meta', 10, 4 );
function add_product_custom_field_as_order_item_meta( $item, $cart_item_key, $values, $order ) {
if ( isset($values['custom_text']) ) {
$item->update_meta_data('Add on', $values['custom_text'] );
}
}
我正在尝试使用 if ( isset($values['custom_text']) ) 部分作为函数的触发器,仅在设置了产品添加和其他类似方法(如 if ( !empty( $cart_item['custom_text'] ) ) 但我不确定这是要走的路:
add_action('woocommerce_thankyou','change_order_status');
function change_order_status( $order_id ) {
if ( ! $order_id ) {return;}
$order = wc_get_order( $order_id );
if ( isset($values['custom_text']) ) {
if( 'processing'== $order->get_status() ) {
$order->update_status( 'wc-custom-status' );
}
}
}
以上没有任何作用。用这种方法我能接近它吗?
编辑:我也试过了
add_action('woocommerce_thankyou','change_order_status');
function change_order_status( $order_id ) {
if ( ! $order_id ) {return;}
$order = wc_get_order( $order_id );
foreach ( $order->get_items() as $item_id => $item ) {
$allmeta = $item->get_meta_data();
if ( isset($values['custom_text']) ) {
if( 'processing'== $order->get_status() ) {
$order->update_status( 'wc-custom-status' );
}
}
}
}
【问题讨论】:
-
在您的感谢操作中,您必须访问订单项目并检查项目是否具有此值。目前 $values 是什么?如何循环订购商品 - foreach ( $order->get_items() as $item_id => $item ) { $allmeta = $item->get_meta_data();获取所有 meta 或 $somemeta = $item->get_meta( '_whatever', true );获取特定的元 } - 来源 - businessbloomer.com/…
-
再说一遍 $values 是什么?
-
你是对的。我想我意识到有时使用的变量没有在函数中定义(尽管它们在参数中)......无论如何,这是一个很长的镜头,我很感激这个通知。我什至无法提供像 @7uc1f3r 这样的代码,经过一些测试后它可以完美运行。谢谢你们!
标签: wordpress woocommerce metadata product orders