Исключить для конкретного продукта проверку поля в Woocommerce

#php #wordpress #validation #woocommerce #hook-woocommerce

#php #wordpress #проверка #woocommerce #hook-woocommerce

Вопрос:

У меня есть веб-сайт Woocommerce, и у каждого продукта есть поле IMEI. Мне нужно только для определенного продукта удалить проверку поля (чтобы не проверять поле IMEI). Я перепробовал много способов, но не могу заставить это работать.

Вот скриншот:

введите описание изображения здесь

И код:

 function custom_output_engraving_field() {
    $product;
    ?>
    <div class="imei-engraving-field">
        <label for="imei-values" name="suwp-imei-values-label">IMEI: <br> (Enter 15 digits), dial *#06# to display </label>
         <input type="text" id="imei-engraving" name="imei-engraving" placeholder="<?php _e( 'Enter engraving text', 'myimei' ); ?>" maxlength="15">
         <label for="imeinote-values" name="suwp-imeinote-values-label">IMEI Note: </label>
         <textarea rows="10" cols="30" id="imeinote-engraving" name="imeinote-engraving" placeholder="<?php _e( 'Enter engraving text', 'myimeinote' ); ?>"> </textarea>
    </div>
    <?php
}

add_action( 'woocommerce_before_add_to_cart_button', 'custom_output_engraving_field', 15 );

function suwpimei_custom_fields_validation($true, $product_id, $quantity ) {

    $imei_values = trim($_REQUEST['imei-engraving']);

    $imei = trim($imei_values);
    $chk_dup_imei[] = $imei;
    $serial_length = 15;
    $actual_length = (int)strlen($imei);
    $flag_continue_imei = TRUE;
    $flag_msg_imei = array();

    if ( empty( $imei_values ) ) {
        // empty submission
        $flag_continue_imei = FALSE;
        $flag_msg_imei = 'Please enter at least one IMEI.<br />';

    } else {
        if ( $actual_length != $serial_length amp;amp; suwpimei_is_digits($imei) == 1 ) {

            $flag_continue_imei = FALSE;
            $flag_msg_imei = $imei . ' should be ' . $serial_length . ' characters, not '. $actual_length . '. This is not a valid IMEI entry.<br />';

        }

        if ( suwpimei_is_digits($imei) != 1 ) {

            $flag_continue_imei = FALSE;
            $flag_msg_imei = $imei . ' is invalid. IMEI should be digits only: no letters, punctuation, or spaces.<br />';

        }

        if ( $actual_length == $serial_length amp;amp; suwpimei_is_digits($imei) == 1 ) {

            // only do the suwp_check_imei when imei is 15 digits
            if ($serial_length == 15) {

                if (suwpimei_check_imei($imei) == 0) {

                    $flag_continue_imei = FALSE;
                    $flag_msg_imei = $imei . ' is not a valid IMEI entry.<br />';

                }
            }
        }
    }

    $flag_msg_string = '';
    $flag_msg_string = $flag_msg_imei;

    if ( !$flag_continue_imei ) {
        wc_add_notice( $flag_msg_string, 'error' );
        return false;
    }

    if( ! empty ( WC()->cart->get_cart() ) ) {
        //WC()->cart->empty_cart();
        wc_add_notice( 'Only allowed 1 item in cart, please remove previous item.', 'error' );
        return false;
    }

    return true;
}

add_action( 'woocommerce_add_to_cart_validation', 'suwpimei_custom_fields_validation', 10, 3 );
  

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

1. Просто сравните $product_id, переданный в suwpimei_custom_fields_validation(), с этим конкретным продуктом. Если это то же самое, не проверяйте поле.

2. благодарю за быстрый ответ. Мой идентификатор продукта 873 я пытался сравнить, может быть, я не могу получить идентификатор чего-то другого, не могли бы вы, пожалуйста, отредактировать мой код заранее спасибо

3. Какое поле не следует проверять, IMEI или IMEI Note?

4. обратите внимание на IMEI обоих полей и IMEI IMEI.

Ответ №1:

Вы можете просто сопоставить $product_id с продуктом, который вы не хотите проверять.

 function suwpimei_custom_fields_validation( $true, $product_id, $quantity ) {
    // Compare against the product which you don't want to validate.
    // If it matches, just bail out, return whatever is passed in $true.
    if ( $product_id == 873 ) {
        return $true;
    }

    $imei_values        = trim( $_REQUEST['imei-engraving'] );
    $imei               = trim( $imei_values );
    $chk_dup_imei[]     = $imei;
    $serial_length      = 15;
    $actual_length      = intval( strlen( $imei ) );
    $flag_continue_imei = true;
    $flag_msg_imei      = array();

    if ( empty( $imei_values ) ) {
        // empty submission.
        $flag_continue_imei = false;
        $flag_msg_imei = 'Please enter at least one IMEI.<br />';
    } else {

        if ( $actual_length != $serial_length amp;amp; suwpimei_is_digits( $imei ) == 1 ) {
            $flag_continue_imei = false;
            $flag_msg_imei = $imei . ' should be ' . $serial_length . ' characters, not ' . $actual_length . '. This is not a valid IMEI entry.<br />';
        }

        if ( suwpimei_is_digits( $imei ) != 1 ) {

            $flag_continue_imei = false;
            $flag_msg_imei = $imei . ' is invalid. IMEI should be digits only: no letters, punctuation, or spaces.<br />';

        }

        if ( $actual_length == $serial_length amp;amp; suwpimei_is_digits( $imei ) == 1 ) {

            // only do the suwp_check_imei when imei is 15 digits
            if ($serial_length == 15) {

                if (suwpimei_check_imei($imei) == 0) {

                    $flag_continue_imei = FALSE;
                    $flag_msg_imei = $imei . ' is not a valid IMEI entry.<br />';

                }
            }

        }

    }

    $flag_msg_string = '';
    $flag_msg_string = $flag_msg_imei;

    if ( ! $flag_continue_imei ) {
        wc_add_notice( $flag_msg_string, 'error' );
        return false;
    }

    if( ! empty ( WC()->cart->get_cart() ) ) {
        //WC()->cart->empty_cart();
        wc_add_notice( 'Only allowed 1 item in cart, please remove previous item.', 'error' );
        return false;
    }

    return true;
}
add_action( 'woocommerce_add_to_cart_validation', 'suwpimei_custom_fields_validation', 10, 3 );
  

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

1. @sifat Рад помочь. 🙂