Woocommerce - нужно проверить переменные продукта $ _POST, прежде чем добавить в корзину кнопку - PullRequest
0 голосов
/ 23 октября 2019

Я не нашел подходящего места в своем пользовательском плагине, чтобы поместить код для проверки параметров, выбранных на странице продукта. Я добавил несколько настраиваемых полей флажков, сохраненных как $ cart_item ['saturday_option'] и $ cart_item ['Sunday_option'] (если флажок = ИСТИНА)

Мне нужен валидатор, чтобы проверить, установил ли клиент даты и параметры дляисключить те дни, которые суммируются по продолжительности 0.

рабочий демонстрационный сайт: https://noad.pl/kalendarz/product/dieta-numer-dwa/

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

Я нашел некоторые решения в стеке, некоторые решения идут на использование пользовательской сессии WC () -> сессия, помещает некоторые переменные в сессию и затем проверяет их внутри

одна из нерабочие решения (сессия пуста)

function so_validate_add_cart_item( $passed, $product_id, $quantity, $variation_id = '', $variations= '', $cart_item_data = array()) {

$id = empty( $variation_id ) ? $product_id : $variation_id;

if ( ! $passed ) {
        return $passed;
}

$product = wc_get_product( $id );

if ( ! $product ) {
        return false;
}

$noad_sesja = WC()->session->get( 'noad_kalendarz' );

if ( isset( $noad_sesja[$id] ) && ! empty( $noad_sesja[$id] ) ) {

    if ( isset( $noad_sesja[$id]['saturday_option'] ) || isset( $noad_sesja[$id]['sunday_option'] ) ) {
        $booking_session = WC()->session->get( 'booking' ); 
        $now = strtotime($booking_session[$id]['start']);
        $your_date = strtotime($booking_session[$id]['end']);
        $datediff = $now - $your_date;

        $dni = round($datediff / (60 * 60 * 24));

        if ($noad_sesja[$id]['_noad_count_sundays'] + $noad_sesja[$id]['_noad_count_sundays'] = $datediff)
            wc_add_notice( esc_html__( 'Wykluczono wszystkie dni!', 'woocommerce-easy-booking-system' ), 'error' );
        $passed = false;
    }
}
return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'so_validate_add_cart_item', 200, 6 );

я установил сессию таким образом (где-то нашел это как решение):

add_action( 'woocommerce_init', function(){
if ( ! WC()->session->has_session() ) {
    WC()->session->set_customer_session_cookie( true );
    }
} );

с последующим:

add_filter('woocommerce_add_cart_item_data', 'add_custom_product_data_day', 111, 3);
function add_custom_product_data_day( $cart_item_data, $product_id, $variation_id ) {


if (isset($_POST['saturday_option']) && !empty($_POST['saturday_option']) && $_POST['saturdayday_option'] != 'no') {
    $cart_item_data['saturday_option'] = $_POST['saturday_option'];
}   
WC()->session->set( 'noad_kalendarz', $cart_item_data );
return $cart_item_data;
}

Мне не нужно использовать сессию. Я ищу место, где я смогу проверить переменные cart_item [] или $ _POST [] и выполнить код перед добавлением в корзину.

Я использую небольшой модифицированный плагин Woocommerce-easyбронирование https://pl.wordpress.org/plugins/woocommerce-easy-booking-system/

и настраиваемые поля с измененным кодом (у меня есть дополнительные настраиваемые поля): Добавить флажок на отдельных страницах продукта, который добавляет дополнительную стоимость в Woocommerce

РЕДАКТИРОВАТЬ: заменить неправильноchar - с _ в строке

noad_sesja = WC()->session->get( 'noad_kalendarz' );

сессия еще пуста

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