Обработка пользовательских массовых действий в списке заказов администратора в Woocommerce - PullRequest
0 голосов
/ 21 октября 2018

Я добавил настраиваемое действие на мою страницу заказов woocommerce, как показано ниже, и у меня также есть поле настраиваемого заказа "количество блюд".Теперь я хочу, чтобы я выбирал заказы оптом и использовал это настраиваемое действие, тогда количество блюд должно быть уменьшено на 1.
Например, если для идентификаторов заказов 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 Ответ

0 голосов
/ 21 октября 2018

Вы не используете правильный путь и крючки.Кроме того, при использовании плагина WooCommerce Admin Fields Custom Order Fields правильный мета-ключ настраиваемого поля должен быть _wc_acof_3.

Так что попробуйте следующее:

// 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() {
    global $pagenow;

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

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

        printf( '<div class="notice notice-success fade is-dismissible"><p>' .
            _n( 'Decreased meals for %s Order.',
            'Decreased meals for %s Orders.',
            $count,
            'woocommerce'
        ) . '</p></div>', $count );
    }

Код входит в файл function.php вашей активной дочерней темы (или активной темы).Проверено и работает.

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...