我有一个功能在我的WooCommerce Wordpress网站的前端运行,该功能为正确回答一个简单问题的人生成票证编号,为那些回答不正确的人生成票证订单。它将用户答案保存在订单项元数据中,并且我将其保存在订单中每个项目的可编辑WooCommerce Text输入字段的后端中,因为每个项目都有不同的答案。
add_action( 'woocommerce_admin_order_item_values', 'pd_admin_order_item_values', 10, 3);
function pd_admin_order_item_values( $product, $item, $item_id ) {
$user_answer = $item->get_meta( "User Answer" );
?>
<div class="edit_custom_field"> <!-- use same css class in h4 tag -->
<?php
woocommerce_wp_text_input( array(
'id' => 'custom_field_name',
'label' => 'Update User Answer:',
'value' => $user_answer,
'wrapper_class' => 'form-field-wide'
) );
?>
</div>
<?php
}
我需要这样做,如果管理员将其更改为正确的字段并更新帖子,它将保存新数据并运行该功能以分配票证编号。我使用的是正确的钩子,我相信它会在我按订单更新时崩溃,但是日志说它运行的参数太少。我已经看到有人使用$ post_id和$ post代替了order变量,但是将其更改为调用这些变量也没有用。
add_action( 'woocommerce_process_shop_order_meta', 'custom_woocommerce_process_shop_order_meta', 10, 4 );
function custom_woocommerce_process_shop_order_meta( $item, $order_id, $order ){
// Loop through order items
foreach ($item->get_items() as $item_id => $item ) {
$admin_question = wc_sanitize_textarea( $_POST[ 'custom_field_name' ] );
$user_answer = $item->get_meta( $admin_question );
$admin_answer = $item->get_meta( "Answer" );
if( $admin_answer == $user_answer ){
// Check that tickets numbers haven't been generated yet for this item
if( $item->get_meta( "_tickets_number") )
continue;
$product = $item->get_product(); // Get the WC_Produt Object
$quantity = (int) $item->get_quantity(); // Get item quantity
// Get last ticket sold index from product meta data
$now_index = (int) $product->get_meta('_tickets_sold');
$tickets_ids = array(); // Initializing
// Generate an array of the customer tickets Ids from the product registered index (last ticket ID)
for ($i = 1; $i <= $quantity; $i++) {
$tickets_ids[] = $now_index + $i;
};
// Save the tickets numbers as order item custom meta data
$item->update_meta_data( "Tickets numbers", implode(' ', $tickets_ids) ); // Displayed string of tickets numbers on customer orders and emails
$item->update_meta_data( "User Answer", $user_answer ); // Displayed string of tickets numbers on customer orders and emails
$item->update_meta_data( "_tickets_number", $tickets_ids ); // (Optional) Array of the ticket numbers (Not displayed to the customer)
$item->save(); // Save item meta data
// Update the Ticket index for the product (custom meta data)
$product->update_meta_data('_tickets_sold', $now_index + $quantity );
$product->save(); // Save product data
} else {
$item->update_meta_data( "User Answer", $user_answer ); // Displayed string of tickets numbers on customer orders and emails
$item->save(); // Save item meta data
}
}
$order->save(); // Save all order data
}
我相信我的问题在于它在运行函数时无法调用order and order id变量,但是我不确定。
您正在使用add_action( 'woocommerce_process_shop_order_meta', 'custom_woocommerce_process_shop_order_meta', 10, 4 );
,而仅在回调中使用3参数。
实际上只有2。
function action_woocommerce_process_shop_order_meta( $post_id, $post ) {
}
add_action( 'woocommerce_process_shop_order_meta', 'action_woocommerce_process_shop_order_meta', 10, 2 );
结果是,如果我将订单移回保留状态,在此处编辑了元数据,然后将其移至再次处理,它将运行原始功能并分配一个编号。