Автоматическое удаление из корзины товаров в корзине, а затем уведомление пользователя учетной записи - Woocommerce - PullRequest
0 голосов
/ 07 января 2019

Я хочу позволить клиентам добавлять товары в свою корзину Woocommerce и оставлять их там так долго, как они хотят, чтобы они могли добавлять их в свою досуг. Любые строки, которых нет в наличии, должны быть автоматически удалены из корзины и появилось сообщение о том, что это произошло. Что-то вроде «Все отсутствующие товары были удалены из учетной записи, поскольку они больше не доступны».

Пока я пробовал это

public function is_in_stock() {
return apply_filters( 'woocommerce_product_is_in_stock', 'instock' === $this->get_stock_status(), $this );
}
function notes_in_cart() {
 global $woocommerce;

if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {
    return;
}

if ( isset( $_POST['post_data'] ) ) {
    parse_str( $_POST['post_data'], $post_data );
} else {
    $post_data = $_POST; // fallback for final checkout (non-ajax)
}

if ( WC()->cart->needs_shipping() ){

    // set $out_of_stock_exists to false by default
    $out_of_stock_exists = false;
    foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
        if($values['data']->backorders_allowed()){ //check if backorders are allowed on this product
            // get the stock quantity - returns the available amount number
            $stock_info = $values['data']->get_stock_quantity();

            if($stock_info < $values['quantity']){ 
    set $out_of_stock_exists to true and stop foreach execution
                $out_of_stock_exists = true;
                break;
            }
        }

    }

    //if cart has items out of stock
    if ($out_of_stock_exists) {
        ?>
        <tr class="ceckoutStockMeta">
            <th>Item Shipments</th>
            <td>
                <p style="color: red;">*All out of stock items have been removed from your cart as they are no longer available.</p><br>
                <form>

                    <input type="radio" name="stockOp" id="stockOption1" value="ship" />
                    <label for="stockOption1">Ship what is available now</label><br>

                    <input type="radio" name="stockOp" id="stockOption2" value="hold" />
                    <label for="stockOption2">Wait and ship together</label>
                </form>
            </td>
        </tr>

        <?php

    }
}
add_action( 'woocommerce_cart_totals_after_order_total', 'notes_in_cart' );
add_action( 'woocommerce_review_order_after_order_total', 'notes_in_cart' );

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

Может кто-нибудь сказать мне, если это правильно?

Что касается автоматического удаления нетканых строк из корзины аккаунта, я предполагаю, что это произойдет «из коробки» с Woocommerce. Может кто-нибудь подтвердить это или предоставить способ сделать это?

Спасибо, Bryan

1 Ответ

0 голосов
/ 10 января 2019

Во всяком случае, я с тех пор выяснил, где я иду не так, и я был совершенно на неправильном пути. Я публикую правильный код ниже, на случай, если кому-то еще понадобится эта функциональность в будущем. Это делает оба; обновляет корзину, когда ее нет в наличии и одновременно оставляет новое сообщение.

/**
 * This code will automatically remove any out of stock items from a shopping cart.
 * This would be in cases when users add products to their cart and come back it it later.
*
*/
function orb_check_for_out_of_stock_products() {
if ( WC()->cart->is_empty() ) {
    return;
}

$removed_products = [];

foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
    $product_obj = $cart_item['data'];

    if ( ! $product_obj->is_in_stock() ) {
        WC()->cart->remove_cart_item( $cart_item_key );
        $removed_products[] = $product_obj;
    }
}

if (!empty($removed_products)) {
    wc_clear_notices(); // remove any WC notice about sorry about out of stock products to be removed from cart.

    foreach ( $removed_products as $idx => $product_obj ) {
        $product_name = $product_obj->get_title();
        $msg = sprintf( __( "The product '%s' was removed from your cart because it is now out of stock. Sorry for any inconvenience caused.", 'woocommerce' ), $product_name);

        wc_add_notice( $msg, 'error' );
    }
}

}
add_action('woocommerce_before_cart', 'orb_check_for_out_of_stock_products');

Благодарю тех, кто предложил помощь, и большое спасибо Святославу Маринову из http://orbisius.com/ за то, что он связался со мной напрямую с его мнением. Именно он вел меня в правильном направлении.

Всем хорошего дня! Не стесняйтесь обновлять этот код любыми улучшениями, которые вы можете определить.

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