【问题标题】:WooCommerce add conditional checkout fieldsWooCommerce 添加条件结帐字段
【发布时间】:2017-11-07 19:08:19
【问题描述】:

我们有一个销售旅行团的 WooCommerce。问题是,一位游客可以为四个人购买旅行团,或者旅行中的每个人都可以得到他们的passport_numberexpiration_date

现在我们可以很容易地在结帐页面中显示所需的字段,但是必须有购买的产品(旅游)数量的条件。

我做了很多研究,我只能找到基于product_id的条件字段,但没有基于产品的数量,所以我希望这个问题对其他人有所帮助。

非常感谢任何帮助或指导。

【问题讨论】:

  • 能把目前写的代码贴上来吗?

标签: wordpress woocommerce


【解决方案1】:

您似乎问了很长时间,但我会为将来可能需要它的人添加它。这是我们解决此问题的完整代码。

此代码假定购物车上选择的商品只是其中一个包裹,而不是它们的混合。然后客户可以选择他们想要的乘客数量。

/**
 * Add the fields to the checkout
 **/
add_action( 'woocommerce_before_order_notes', 'product_quantities_custom_checkout_fields' );

function product_quantities_custom_checkout_fields( $checkout ) {

 //Check for product quantities
 $quantity_of_products_in_cart = product_quantities_in_cart();

 if($quantity_of_products_in_cart != 0) {
    echo '<div id="quantity_checkout_field"><h3>' . __( 'Passengers Information' ) . '</h3>';

    $i = 0;
    while ($i < $quantity_of_products_in_cart) {
        $j = $i + 1;

        $passenger_name = 'passenger_name_'. $j;
        $passenger_birth_date = 'passenger_birth_date_'. $j;
        $passenger_dni = 'passenger_dni_'. $j;
        $passenger_passport = 'passenger_passport_'. $j;
        $passenger_phone = 'passenger_phone_'. $j;
        $passenger_address = 'passenger_address_'. $j;
        $passenger_city = 'passenger_city_'. $j;

        echo '<p style="margin: 24px 0 0px; color: #222; display: table-cell; font-weight: bold;">Passenger ' . $j . '</p>';

         woocommerce_form_field( $passenger_name, array(
         'type'  => 'text',
         'class' => array( 'passenger_name form-row-first' ),
         'required'  => true,
         'label' => __('Name and Surname', 'woocommerce'),
         ), $checkout->get_value( $passenger_name ) );

         woocommerce_form_field( $passenger_birth_date, array(
         'type'  => 'text',
         'class' =>array('passenger_birth_date form-row-last'),
         'input_class' => array('hasDatepicker'),
         'required'  => true,
         'label' => __('Birth Date', 'woocommerce'),
         'placeholder'      => __('day/month/year (example: 21/11/1994)'),
         ), $checkout->get_value( $passenger_birth_date ) );

         woocommerce_form_field( $passenger_dni, array(
         'type'  => 'text',
         'class' => array( 'passenger_dni form-row-first' ),
         'required'  => true,
         'label' => __('DNI Number', 'woocommerce'),
         ), $checkout->get_value( $passenger_dni ) );

         woocommerce_form_field( $passenger_passport, array(
         'type'  => 'text',
         'class' => array( 'passenger_passport form-row-last' ),
         'required'  => true,
         'label' => __('Pasaport Number', 'woocommerce'),
         ), $checkout->get_value( $passenger_passport ) );

         woocommerce_form_field( $passenger_phone, array(
         'type'  => 'text',
         'class' => array( 'passenger_phone form-row-first' ),
         'required'  => true,
         'label' => __('Phone', 'woocommerce'),
         ), $checkout->get_value( $passenger_phone ) );

         woocommerce_form_field( $passenger_address, array(
         'type'  => 'text',
         'class' => array( 'passenger_address form-row-last' ),
         'required'  => true,
         'label' => __('Address', 'woocommerce'),
         ), $checkout->get_value( $passenger_address ) );

         woocommerce_form_field( $passenger_city, array(
         'type'  => 'text',
         'class' => array( 'passenger_city form-row-wide' ),
         'required'  => true,
         'label' => __('City', 'woocommerce'),
         ), $checkout->get_value( $passenger_city ) );

         $i++;
    }

         echo '</div>';
 }

}

/**
 * Process the checkout
 */
add_action('woocommerce_checkout_process', 'quantity_checkout_field_process');

function quantity_checkout_field_process() {
    // Check if set, if its not set add an error.

    //Check for product quantities
    $quantity_of_products_in_cart = product_quantities_in_cart();

    if($quantity_of_products_in_cart != 0) {
        $i = 0;
        while ($i < $quantity_of_products_in_cart) {
            $j = $i + 1;

            $passenger_name = 'passenger_name_'. $j;
            $passenger_birth_date = 'passenger_birth_date_'. $j;
            $passenger_dni = 'passenger_dni_'. $j;
            $passenger_passport = 'passenger_passport_'. $j;
            $passenger_phone = 'passenger_phone_'. $j;
            $passenger_address = 'passenger_address_'. $j;
            $passenger_city = 'passenger_city_'. $j;

            if ( ! $_POST[$passenger_name] )
                wc_add_notice( __( 'Please check on filling the Name and Surname for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_birth_date] )
                wc_add_notice( __( 'Please check on filling the Birth Date for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_dni] )
                wc_add_notice( __( 'Please check on filling the DNI for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_passport] )
                wc_add_notice( __( 'Please check on filling the Pasaport for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_phone] )
                wc_add_notice( __( 'Please check on filling the Phone for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_address] )
                wc_add_notice( __( 'Please check on filling the Address for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_city] )
                wc_add_notice( __( 'Please check on filling the City for passenger '. $j .'.' ), 'error' );

            $i++;

        }

    }

}

/**
 * Update the order meta with field value
 */
add_action( 'woocommerce_checkout_update_order_meta', 'quantity_checkout_field_update_order_meta' );

function quantity_checkout_field_update_order_meta( $order_id ) {

    $quantity_of_products_in_cart = product_quantities_in_cart();

    if($quantity_of_products_in_cart != 0) {
        $i = 0;
        while ($i < $quantity_of_products_in_cart) {
            $j = $i + 1;

            $passenger_name = 'passenger_name_'. $j;
            $passenger_birth_date = 'passenger_birth_date_'. $j;
            $passenger_dni = 'passenger_dni_'. $j;
            $passenger_passport = 'passenger_passport_'. $j;
            $passenger_phone = 'passenger_phone_'. $j;
            $passenger_address = 'passenger_domicilio_'. $j;
            $passenger_city = 'passenger_city_'. $j;

            $passenger_name_display = 'Name of Passenger '. $j;
            $passenger_birth_date_display = 'Birth Date of Passenger '. $j;
            $passenger_dni_display = 'DNI of Passenger '. $j;
            $passenger_passport_display = 'Pasaport of Passenger '. $j;
            $passenger_phone_display = 'Phone of Passenger '. $j;
            $passenger_address_display = 'Address of Passenger '. $j;
            $passenger_city_display = 'City of Passenger '. $j;

            if ( ! empty( $_POST[$passenger_name] ) ) {
                update_post_meta( $order_id, $passenger_name_display, sanitize_text_field( $_POST[$passenger_name] ) );
            }

            if ( ! empty( $_POST[$passenger_birth_date] ) ) {
                update_post_meta( $order_id, $passenger_birth_date_display, sanitize_text_field( $_POST[$passenger_birth_date] ) );
            }

            if ( ! empty( $_POST[$passenger_dni] ) ) {
                update_post_meta( $order_id, $passenger_dni_display, sanitize_text_field( $_POST[$passenger_dni] ) );
            }

            if ( ! empty( $_POST[$passenger_passport] ) ) {
                update_post_meta( $order_id, $passenger_passport_display, sanitize_text_field( $_POST[$passenger_passport] ) );
            }

            if ( ! empty( $_POST[$passenger_phone] ) ) {
                update_post_meta( $order_id, $passenger_phone_display, sanitize_text_field( $_POST[$passenger_phone] ) );
            }

            if ( ! empty( $_POST[$passenger_addresso] ) ) {
                update_post_meta( $order_id, $passenger_address_display, sanitize_text_field( $_POST[$passenger_address] ) );
            }

            if ( ! empty( $_POST[$passenger_city] ) ) {
                update_post_meta( $order_id, $passenger_city_display, sanitize_text_field( $_POST[$passenger_city] ) );
            }
            $i++;
        }
    }
}


/**
 * Display field value on the order edit page
 */
add_action( 'woocommerce_admin_order_data_after_billing_address', 'quantity_checkout_field_display_admin_order_meta', 10, 1 );

function quantity_checkout_field_display_admin_order_meta($order){

    $order_quantities = (int) $order->get_item_count();

    $i = 0;
    while ($i < $order_quantities) {
        $j = $i + 1;

            $passenger_name_display = 'Name of Passenger '. $j;
            $passenger_birth_date_display = 'Birth Date of Passenger '. $j;
            $passenger_dni_display = 'DNI of Passenger '. $j;
            $passenger_passport_display = 'Pasaport of Passenger '. $j;
            $passenger_phone_display = 'Phone of Passenger '. $j;
            $passenger_address_display = 'Address of Passenger '. $j;
            $passenger_city_display = 'City of Passenger '. $j;

        echo '<p><strong>'.__($passenger_name_display).':</strong> ' . get_post_meta( $order->id, $passenger_name_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_birth_date_display).':</strong> ' . get_post_meta( $order->id, $passenger_birth_date_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_dni_display).':</strong> ' . get_post_meta( $order->id, $passenger_dni_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_passport_display).':</strong> ' . get_post_meta( $order->id, $passenger_passport_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_phone_display).':</strong> ' . get_post_meta( $order->id, $passenger_phone_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_address_display).':</strong> ' . get_post_meta( $order->id, $passenger_address_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_city_display).':</strong> ' . get_post_meta( $order->id, $passenger_city_display, true ) . '</p>';
        $i++;
    }

}


/**
 * Check for product quantities in cart
 *
 * @return int
 */
function product_quantities_in_cart( ) {
 //Check to see if user has product in cart
 global $woocommerce;

 $quantity_of_products_in_cart = $woocommerce->cart->get_cart_contents_count();

 return $quantity_of_products_in_cart;

}

/**
 * Add the field to order emails
 **/
add_filter('woocommerce_email_order_meta_keys', 'quantity_field_order_meta_keys');
function quantity_field_order_meta_keys( $keys ) {

    $quantity_of_products_in_cart = product_quantities_in_cart();

    if($quantity_of_products_in_cart != 0) {
        $i = 0;
        while ($i < $quantity_of_products_in_cart) {
            $j = $i + 1;

            $passenger_name_display = 'Name of Passenger '. $j;
            $passenger_birth_date_display = 'Birth Date of Passenger '. $j;
            $passenger_dni_display = 'DNI of Passenger '. $j;
            $passenger_passport_display = 'Pasaport of Passenger '. $j;
            $passenger_phone_display = 'Phone of Passenger '. $j;
            $passenger_address_display = 'Address of Passenger '. $j;
            $passenger_city_display = 'City of Passenger '. $j;

            $keys[] = $passenger_name_display;
            $keys[] = $passenger_birth_date_display;
            $keys[] = $passenger_dni_display;
            $keys[] = $passenger_passport_display;
            $keys[] = $passenger_phone_display;
            $keys[] = $passenger_address_display;
            $keys[] = $passenger_city_display;

            $i++;
        }
    }



    return $keys;
}

【讨论】:

    猜你喜欢
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2018-07-24
    • 2017-07-25
    • 2021-07-02
    • 2015-04-20
    • 2017-08-31
    相关资源
    最近更新 更多