代码之家  ›  专栏  ›  技术社区  ›  rajat meena

在WooCommerce中处理管理订单列表上的自定义批量操作

  •  1
  • rajat meena  · 技术社区  · 6 年前

    我在WooCommerce订单页面中添加了一个自定义操作,如下图所示,我还有一个自定义订单字段“用餐数量”。现在我想要的是,当我批量选择订单并使用该自定义操作时,餐数应该减少1。
    例如,如果订单ID 1和2分别有15和12顿饭,那么在使用该操作之后,它应该变为14和11。

    我的订单页面、自定义挂钩和我创建的自定义订单字段的屏幕截图:

    screenshot of my orders page

    我的代码:

    add_filter( 'bulk_actions-edit-shop_order', 'decrease_number_of_meals_by_1' );
    function decrease_number_of_meals_by_1( $bulk_actions ) {
        $bulk_actions['decrease_number_of_meals'] = 'Decrease Number of Meals by 1';
        return $bulk_actions;
    }
    
    add_action( 'admin_action_decrease_number_of_meals', 'fire_my_hook' );
    function fire_my_hook() {
        if( !isset( $_REQUEST['post'] ) && !is_array( $_REQUEST['post'] ) )
            return;
    
        foreach( $_REQUEST['post'] as $order_id ) {
    
            $order = new WC_Order( $order_id );
            $no_of_meals = $order->get_post_meta( $order_id, '_wc_acof_{3}', true );
        }
    }
    

    我被困在这里,不知道该怎么做。
    请指导我如何做到这一点。

    1 回复  |  直到 6 年前
        1
  •  1
  •   LoicTheAztec    6 年前

    你没有用正确的方法和钩子。另外,正确的自定义字段meta key应该是 _wc_acof_3 使用WooCommerce管理自定义订单字段插件时。

    因此,请尝试以下方法:

    // Add a bulk action to Orders bulk actions dropdown
    add_filter( 'bulk_actions-edit-shop_order', 'decrease_meals_orders_bulk_actions' );
    function decrease_meals_orders_bulk_actions( $bulk_actions ) {
        $bulk_actions['decrease_meals'] = 'Decrease Number of Meals by 1';
        return $bulk_actions;
    }
    
    // Process the bulk action from selected orders
    add_filter( 'handle_bulk_actions-edit-shop_order', 'decrease_meals_bulk_action_edit_shop_order', 10, 3 );
    function decrease_meals_bulk_action_edit_shop_order( $redirect_to, $action, $post_ids ) {
        if ( $action === 'decrease_meals' ){
            $processed_ids = array(); // Initializing
    
            foreach ( $post_ids as $post_id ) {
                // Get number of meals
                $nb_meal = (int) get_post_meta( $post_id, '_wc_acof_3', true );
    
                // Save the decreased number of meals ($meals - 1)
                update_post_meta( $post_id, '_wc_acof_3', $nb_meal - 1 );
    
                $processed_ids[] = $post_id; // Adding processed order IDs to an array
            }
    
            // Adding the right query vars to the returned URL
            $redirect_to = add_query_arg( array(
                'decrease_meals' => '1',
                'processed_count' => count( $processed_ids ),
                'processed_ids' => implode( ',', $processed_ids ),
            ), $redirect_to );
        }
        return $redirect_to;
    }
    
    // Display the results notice from bulk action on orders
    add_action( 'admin_notices', 'decrease_meals_bulk_action_admin_notice' );
    function decrease_meals_bulk_action_admin_notice() {
        if ( empty( $_REQUEST['decrease_meals'] ) ) return; // Exit
    
        $count = intval( $_REQUEST['processed_count'] );
    
        printf( '<div id="message" class="updated fade"><p>' .
            _n( 'Decreased meals for %s Order.',
            'Decreased meals for %s Orders.',
            $count,
            'decrease_meals'
        ) . '</p></div>', $count );
    }
    

    代码位于活动子主题(或活动主题)的function.php文件中。测试和工作。

    enter image description here

    enter image description here