Автоматическое добавление товара в корзину при посещении одной страницы товара в WooCommerce

#php #wordpress #woocommerce #product #hook-woocommerce

Вопрос:

Поэтому мне нужно, чтобы товар автоматически добавлялся в корзину, если пользователь посещает страницу товара так, как это

 add_action( 'template_redirect', 'add_product_to_cart' );
function add_product_to_cart() {
    global $product;

    if ( ! is_admin() ) {
        $product_id = 13;
        $found = false;
        //check if product already in cart
        if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
            foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
                $_product = $values['data'];
                if ( $_product->get_id() == $product_id )
                    $found = true;
            }
            // if product not found, add it
            if ( ! $found )
                WC()->cart->add_to_cart( $product_id );
        } else {
            // if no products in cart, add it
            WC()->cart->add_to_cart( $product_id );
        }
    }
}
 

Это отлично работает, но мне нужно сделать это для любого посещенного продукта, поэтому измените код, чтобы получить текущий идентификатор продукта следующим образом

 add_action( 'template_redirect', 'add_product_to_cart' );
function add_product_to_cart() {
    global $product;
    if ( ! is_admin() ) {
        $product_id = $product->get_id();
        $found = false;
        //check if product already in cart
        if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
            foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
                $_product = $values['data'];
                if ( $_product->get_id() == $product_id )
                    $found = true;
            }
            // if product not found, add it
            if ( ! $found )
                WC()->cart->add_to_cart( $product_id );
        } else {
            // if no products in cart, add it
            WC()->cart->add_to_cart( $product_id );
        }
    }
}
 

Но при этом я получаю эту ошибку:

Неперехваченная ошибка: Вызов функции-члена get_id() при значении null. Как это сделать?

Комментарии:

1. Одна из вызываемых переменных get_id() имеет значение NULL. Используйте var_dump , чтобы определить, какой именно.

Ответ №1:

Ошибка произойдет, когда $product неизвестно. Это связано с тем, что template_redirect крючок выполняется не только на одной странице продукта. Так что лучше использовать такой крючок, как woocommerce_single_product_summary

Таким образом, вы получаете:

 function action_woocommerce_single_product_summary() {
    // Get the global product object
    global $product;
    
    // Quantity for add to cart
    $quantity = 1;
    
    // Is a WC product
    if ( is_a( $product, 'WC_Product' ) ) {
        // Get ID
        $product_id = $product->get_id();
        
        // WC Cart
        if ( WC()->cart ) {
            // Get cart
            $cart = WC()->cart;
            
            // Cart NOT empty
            if ( sizeof( $cart->get_cart() ) > 0 ) {
                // Cart id
                $product_cart_id = $cart->generate_cart_id( $product_id );
            
                // Find product in cart
                $in_cart = $cart->find_product_in_cart( $product_cart_id );
                
                // NOT in cart
                if ( ! $in_cart ) {
                    $cart->add_to_cart( $product_id, $quantity );
                }
            } else {
                $cart->add_to_cart( $product_id, $quantity );          
            }
        }
    }
}
add_action( 'woocommerce_single_product_summary', 'action_woocommerce_single_product_summary', 10, 0 );
 

Комментарии:

1. Большое вам спасибо @7uc1f3r, что крючок сделал свое дело!