WooCommerce Показать поля оформления заказа в зависимости от категории продукта - PullRequest
0 голосов
/ 12 ноября 2018

Я добавил код ниже, чтобы показать раскрывающийся список переключателя валют на странице оформления заказа WooCommerce, которая работает нормально, но я не хочу отображать поле переключателя валют, если кто-то добавил продукт из категории «Игры» и использует только валюту магазина по умолчанию

Код 1

add_action('woocommerce_before_checkout_billing_form', 'wps_add_select_checkout_field');
function wps_add_select_checkout_field( $checkout ) {
    echo '<label for="payment_option" class="payment_option">'.__('Preferred currency').'</label>';
    echo '<div class="own">', do_shortcode('[woocs]'), '</div>';
    return $checkout;
}

//* Process the checkout
add_action('woocommerce_checkout_process', 'wps_select_checkout_field_process');
function wps_select_checkout_field_process() {
    global $woocommerce;
    // Check if set, if its not set add an error.
    if ($_POST['payopt'] == "blank")
     wc_add_notice( '<strong>Please select a currency</strong>', 'error' );
}

На основе этой ветки ответов: Проверка товаров в корзине для категории продуктов в Woocommerce Я попробовал приведенный ниже код и думаю, что что-то не хватает. Если я использую приведенный ниже код, он вообще не показывает переключатель валют, даже если продукт относится к категории "Игры" или других категорий.

Код 2

add_action('woocommerce_before_cart', 'check_product_category_in_cart');
function check_product_category_in_cart() {
    // Here set your product categories in the array (can be IDs, slugs or names)
    $categories = array('games');
    $found      = false; // Initializing

    // Loop through cart items      
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // If product categories is found
        if ( !has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
            $found = true; // Set to true
            break; // Stop the loop
        }
    }

    // If any defined product category is found, run below code
    if ( $found ) {
        add_action('woocommerce_before_checkout_billing_form', 'wps_add_select_checkout_field');
        function wps_add_select_checkout_field( $checkout ) {
            echo '<label for="payment_option" class="payment_option">'.__('Preferred currency').'</label>';
            echo '<div class="own">', do_shortcode('[woocs]'), '</div>';
            return $checkout;
        }
        //* Process the checkout
        add_action('woocommerce_checkout_process', 'wps_select_checkout_field_process');
        function wps_select_checkout_field_process() {
            global $woocommerce;
            // Check if set, if its not set add an error.
            if ($_POST['payopt'] == "blank")
             wc_add_notice( '<strong>Please select a currency</strong>', 'error' );
        }
    }
}

Есть ли у вас какие-либо другие предложения для того же? Где я могу добавить переключатель валют на странице оформления заказа в зависимости от категории товара в корзине. Код 1 отлично работает на странице оформления заказа, но я не хочу запускать этот код, если категория продукта - игры.

1 Ответ

0 голосов
/ 12 ноября 2018

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

// Utility function that checks if at least a cart items remains to a product category
function has_product_category_in_cart( $product_category ) {
    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // If any product category is found in cart items
        if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) ) {
            return true;
        }
    }
    return false;
}

// Add a custom select field in checkout
add_action('woocommerce_before_checkout_billing_form', 'add_custom_checkout_select_field');
function add_custom_checkout_select_field( $checkout ) {
    // Here set in the function your product category term ID, slugs, names or array
    if ( ! has_product_category_in_cart( 'games' ) && shortcode_exists( 'woocs' ) ) {
        echo '<label for="payment_option" class="payment_option">'.__('Preferred currency').'</label>';
        echo '<div class="own">' . do_shortcode('[woocs]') . '</div>';
    }
}

// Custom Checkout fields validation
add_action('woocommerce_checkout_process', 'custom_checkout_select_field_validation');
function custom_checkout_select_field_validation() {
    if ( isset($_POST['payopt']) && empty($_POST['payopt']) )
        wc_add_notice( '<strong>Please select a currency</strong>', 'error' );
}

Код помещается в файл function.php вашей активной дочерней темы (активной темы).Не проверено, но оно должно работать.

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