WooCommerce管理员订单添加可编辑的元数据并保存它

问题描述 投票:0回答:2

我有一个功能在我的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变量,但是我不确定。

php wordpress woocommerce orders
2个回答
0
投票

您正在使用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 );

0
投票

结果是,如果我将订单移回保留状态,在此处编辑了元数据,然后将其移至再次处理,它将运行原始功能并分配一个编号。

© www.soinside.com 2019 - 2024. All rights reserved.