WooCommerce: отображать настраиваемые поля оформления заказа, если в корзине есть определенные идентификаторы товаров - PullRequest
2 голосов
/ 12 мая 2019

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

Мне удалось отобразить выпадающий список, когда в корзине есть определенный product_ID. Когда выбрано определенное значение, отображается текстовая область.

Это должно произойти примерно с 10 продуктами, а не только с одним.

После прочтения ряда тем и поиска в Интернете я не могу понять, как добавить более одного идентификатора продукта.

add_action( 'woocommerce_after_order_notes', 'grills_versandauswahl_checkout_field' );
function grills_versandauswahl_checkout_field( $checkout ) {

    $grill_in_cart = grills_is_conditional_product_in_cart ( 125 );

    if ( $grill_in_cart === true ) {
        echo '<div id="my_custom_checkout_field"><h3>' . __(     'Versandoptionen' ) . '</h3><p style="margin: 0 0 8px;">text</p>';

        woocommerce_form_field( 'versandoption', array(
            'type'          => 'select',
            'class'         => array( 'wps-drop' ),
            'label'         => __( 'Versandoptionen' ),
            'required'      => true,
            'options'       => array(
                'blank'     => __( 'Ausw&auml;hlen', 'wps' ),
                'fixtermin' => __( 'Fixtermin', 'wps' ),
                'avis'      => __( 'Telefonisches Avis', 'wps' ),
            )
        ), $checkout->get_value( 'versandoption' ) );

        woocommerce_form_field( 'inscription_textbox', array(
            'type'  => 'textarea',
            'class' => array( 'inscription-text form-row-wide' ),
            'label' => __( 'Wunschtermin / Ablageort' ),
        ), $checkout->get_value( 'inscription_textbox' ) );

        echo '</div>';
    }
}

function grills_is_conditional_product_in_cart( $product_id ) {
    //Check to see if user has product in cart
    global $woocommerce;

    //flag no book in cart
    $grill_in_cart = false;

    foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
        $_product = $values['data'];

        if ( $_product->id === $product_id ) {
            //book is in cart!
            $grill_in_cart = true;
        }
    }
    return $grill_in_cart;
}

1 Ответ

0 голосов
/ 12 мая 2019

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

// Custom conditional function
function grills_in_cart( $product_ids ) {
    foreach ( WC()->cart->get_cart() as $item ) {
        if ( array_intersect($product_ids, array( $item['product_id'], $item['variation_id']) ) ) {
            return true;
        }
    }
    return false;
}

// Conditionally display custom checkout fields for specific product IDS
add_action( 'woocommerce_after_order_notes', 'grills_versandauswahl_checkout_field' );
function grills_versandauswahl_checkout_field( $checkout ) {
    // Here define the targeted product IDs in this array
    $targeted_ids = array( 125, 132, 154 );
    $text_domain  = 'woocommerce';

    if ( grills_in_cart( $targeted_ids ) ) {
        echo '<div id="my_custom_checkout_field">
        <h3>' . __( "Versandoptionen", $text_domain ) . '</h3>
        <p style="margin: 0 0 8px;">' . __( "text", $text_domain ) . '</p>';

        woocommerce_form_field( 'versandoption', array(
            'type'     => 'select',
            'class'    => array('wps-drop'),
            'label'    => __( "Versandoptionen", $text_domain ),
            'required' => true,
            'options'  => array(
                'blank'     => __( "Ausw&auml;hlen", $text_domain ),
                'fixtermin' => __( "Fixtermin", $text_domain ),
                'avis'      => __( "Telefonisches Avis", $text_domain ),
            ),
        ), $checkout->get_value( 'versandoption' ) );

        woocommerce_form_field( 'inscription_textbox', array(
            'type'  => 'textarea',
            'class' => array( 'inscription-text form-row-wide' ),
            'label' => __( 'Wunschtermin / Ablageort', $text_domain ),
        ), $checkout->get_value( 'inscription_textbox' ) );

        echo '</div>';
    }
}

Код помещается в файл functions.php вашей активной дочерней темы (или активной темы). Проверено и работает.

Примечание: $global $woocommerce; + $woocommerce->cart заменено на WC()->cart

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