Обработка нескольких пользовательских массовых действий в списке заказов администратора Woocommerce

В WooCommerce, используя плагин Admin Custom Fields , я добавил пользовательские поля «Rebates Status» с 3 значениями «No Rebates», «Unpaid» и «Paid» в списке «WooCommerce Admin Orders».

введите описание изображения здесь

Я также показал это на экране порядка просмотра, как на скриншоте ниже:

введите описание изображения здесь

Теперь я хотел бы массово обновить статус бонусов для выбранных заказов, точно так же, как wooCommerce позволяет делать это для массового изменения статуса заказов.

Основываясь на « » , я успешно добавил 3 статуса массового редактирования (как вы можете видеть на первом скриншоте) :

add_filter( 'bulk_actions-edit-shop_order', 'decrease_meals_orders_bulk_actions' );
function decrease_meals_orders_bulk_actions( $bulk_actions ) {
    $bulk_actions['mr_norebates'] = 'Mark Transactions as No Rebates'
    $bulk_actions['mr_unpaid'] = 'Mark Transactions as Unpaid'
    $bulk_actions['mr_paid'] = 'Mark Transactions as Paid'
    return $bulk_actions;
}

Но никакие изменения не применяются, когда я пытаюсь массово обновить статус Rebates для выбранных заказов.

Мета-ключ для статуса _wc_acof_2

Я застрял также и не знаю, как решить проблему.

Любая помощь приветствуется.

Всего 2 ответа


Это полный, компактный и оптимизированный способ заставить его работать для каждого из 3-х действий, чтобы массово обновить свой пользовательский «Статус бонуса» с отображением сводного уведомления:

// Your settings in a function
function custom_admin_orders_bulk_actions( $labels = false ){
    $domain = 'woocommerce'
    return array(
        'mr_norebates'  => $labels ? __('No Rebates', $domain) : 'norebates',
        'mr_unpaid'     => $labels ? __('Unpaid', $domain)     : 'unpaid',
        'mr_paid'       => $labels ? __('Paid', $domain)       : 'paid',
    );
}

// Display the custom actions on admin Orders bulk action dropdown
add_filter( 'bulk_actions-edit-shop_order', 'set_transactions_orders_bulk_actions' );
function set_transactions_orders_bulk_actions( $bulk_actions ) {
    foreach( custom_admin_orders_bulk_actions(true) as $key => $label ) {
        $bulk_actions[$key] = sprintf( __('Mark Transactions as %s', 'woocommerce'), $label );
    }
    return $bulk_actions;
}

// Process the bulk action from selected orders
add_filter( 'handle_bulk_actions-edit-shop_order', 'set_transactions_bulk_action_edit_shop_order', 10, 3 );
function set_transactions_bulk_action_edit_shop_order( $redirect_to, $action, $post_ids ) {
    $actions = custom_admin_orders_bulk_actions();

    if ( in_array( $action, array_keys($actions) ) ) {
        $processed_ids = array(); // Initializing

        foreach ( $post_ids as $post_id ) {
            // Save the new value
            update_post_meta( $post_id, '_wc_acof_2', $actions[$action] );

            $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(
            'rebate_action'   => $action,
            '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', 'set_transactions_bulk_action_admin_notice' );
function set_transactions_bulk_action_admin_notice() {
    global $pagenow;

    if ( 'edit.php' === $pagenow && isset($_GET['post_type']) && 'shop_order' === $_GET['post_type']
    && isset($_GET['rebate_action']) && isset($_GET['processed_count']) && isset($_GET['processed_ids']) ) {

        foreach( custom_admin_orders_bulk_actions(true) as $key => $label ) {
            if (  $_GET['rebate_action'] === $key ) {

                $count = intval( $_GET['processed_count'] );

                printf( '<div class="notice notice-success fade is-dismissible"><p>' .
                    _n( '%s selected order updated to "%s" rebate status.',
                    '%s selected orders updated to "%s" rebate status.',
                    $count, 'woocommerce' )
                 . '</p></div>', $count, $label );
            }
        }
    }
}

Код помещается в файл functions.php вашей активной дочерней темы (или активной темы). Проверено и работает.

Основано на: обработка


на самом деле я заставил это работать с помощью вашего кода, но это слишком долго, я ценю, если вы можете сделать это просто ...

add_filter( 'bulk_actions-edit-shop_order', 'decrease_meals_orders_bulk_actions' );
function decrease_meals_orders_bulk_actions( $bulk_actions ) {
    $bulk_actions['mr_norebates'] = 'Mark Transactions as No Rebates'
    $bulk_actions['mr_unpaid'] = 'Mark Transactions as Unpaid'
    $bulk_actions['mr_paid'] = 'Mark Transactions as Paid'
    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 === 'mr_norebates' ){
        $processed_ids = array(); // Initializing

        foreach ( $post_ids as $post_id ) {
            // Get number of meals
            $nb_meal = get_post_meta( $post_id, '_wc_acof_2', true );

            // Save the decreased number of meals ($meals - 1)
            update_post_meta( $post_id, '_wc_acof_2', $nb_meal = 'norebates' );

            $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(
            'mr_norebates' => 'No Rebates',
            'processed_count' => count( $processed_ids ),
            'processed_ids' => implode( ',', $processed_ids ),
        ), $redirect_to );
    }

    elseif ( $action === 'mr_unpaid' ){
        $processed_ids = array(); // Initializing

        foreach ( $post_ids as $post_id ) {
            // Get number of meals
            $nb_meal = get_post_meta( $post_id, '_wc_acof_2', true );

            // Save the decreased number of meals ($meals - 1)
            update_post_meta( $post_id, '_wc_acof_2', $nb_meal = 'unpaid' );

            $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(
            'mr_unpaid' => 'Unpaid',
            'processed_count' => count( $processed_ids ),
            'processed_ids' => implode( ',', $processed_ids ),
        ), $redirect_to );
    }
    elseif ( $action === 'mr_paid' ){
        $processed_ids = array(); // Initializing

        foreach ( $post_ids as $post_id ) {
            // Get number of meals
            $nb_meal = get_post_meta( $post_id, '_wc_acof_2', true );

            // Save the decreased number of meals ($meals - 1)
            update_post_meta( $post_id, '_wc_acof_2', $nb_meal = 'paid' );

            $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(
            'mr_paid' => 'Paid',
            '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['mr_norebates'] ) ) return; // Exit

    $count = intval( $_REQUEST['processed_count'] );

    printf( '<div id="message" class="updated fade"><p>' .
        _n( 'Selected %s transaction updated.',
        'Selected %s transactions updated.',
        $count,
        'mr_norebates'
    ) . '</p></div>', $count );

Есть идеи?

10000