0
votes

I wish to add a custom select field with validation to the WooCommerce checkout page if certain products are in cart.

With my current code I retrieve the value of my custom WooCommerce form field. However, it display "array" at the order page.

I have an select field which have an option of 1 and 0. Upon selection of the select field, i want it to display either 1 or 0 at the order page but im unable to do so.

Please guide me on what should i do with my current codes:


//AMBASSADOR CUSTOM CHECKOUT FIELDS, CONTENT add marketplace for sameday TEST
add_action( 'woocommerce_after_checkout_billing_form', 'aym_custom_checkout_field' );
function aym_custom_checkout_field( $checkout ) {
     //Check if Product in Cart
     $prod_in_cart_17563 = aym_is_conditional_product_in_cart_17563( 212 );
     if ( $prod_in_cart_17563 === true ) {
    $domain  = 'wocommerce';
    $default = 'Y';

         woocommerce_form_field( '_my_field_name', array(
         'type'  => 'select',
         'class' => array( 'form-row-wide' ),
         'label' => __( 'Market Place - Please Select Y to complete this order' ),
        'required'    => true,
         'options' => array(
            'Y' => __('1'),
            'N' => __('0')
        ),'default' => $default), 

$checkout->get_value( '_my_field_name' ) );
     }
}

//AMBSSADOR BUNDLE add marketplace for same day pa rt 2
function aym_is_conditional_product_in_cart_17563( $product_id ) {
 //Check to see if user has product in cart
 global $woocommerce;

 //flag no product in cart
 $prod_in_cart_17563 = false;

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

     if ( $_product->id === $product_id ) {
         //product is in cart!
         $prod_in_cart_17563 = true;

     }
 }

 return $prod_in_cart_17563;
}

//process orders in order page

// Custom checkout fields validation
add_action( 'woocommerce_checkout_process', 'custom_checkout_field_process' );
function custom_checkout_field_process() {
    if ( isset($_POST['_my_field_name']) && empty($_POST['_my_field_name']) )
        wc_add_notice( __( 'Please fill in "My 1st new field".' ), 'error' );
}

// Save custom checkout fields the data to the order
add_action( 'woocommerce_checkout_create_order', 'custom_checkout_field_update_meta', 10, 2 );
function custom_checkout_field_update_meta( $order, $data ){
    if( isset($_POST['_my_field_name']) && ! empty($_POST['_my_field_name']) )
        $order->update_meta_data( '_my_field_name', sanitize_text_field( $_POST['_my_field_name'] ) );
}

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

function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ($_POST['_my_field_name']) update_post_meta( $order_id, 'My Field', esc_attr($_POST['_my_field_name']));
}


// View fields in Edit Order Page
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_custom_fields_value_admin_order', 10, 1 );
function display_custom_fields_value_admin_order( $order ){
    // Display the delivery option
    if( $delivery_option =  $order->get_meta('_my_field_name') )
        echo '<p><strong>'.__('Delivery type').':</strong> ' . $delivery_option . '</p>';

}

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

function my_custom_checkout_field_display_admin_order_meta( $order ) {
    if( $selectoption = $order->get_meta('_my_field_name') ) {
        //$value = wc_get_hearaboutus_options()[$selectoptions];
        $meta= get_post_meta( $post->ID, $selectoption, true );
        $myvalues = unserialize( $meta );
         echo '<p><strong>'.__('Market_Place').':</strong> ' . $myvalues . '</p>';

       
    }
}
1

1 Answers

0
votes

I have partly rewritten / modified your code with some (extra) features

  • The ability to check for multiple product IDs in the shopping cart
  • The custom field is only added if a certain product id is in the shopping cart
  • The possibility to check out if the custom field is not present (product ID is NOT in cart)
  • No possibility to checkout as long as the value 'Y' is not selected from the custom select menu (Product ID is IN cart)
  • Explanation via comment tags added in the code
// Add custom 'select' field after checkout billing form (if product ID is in cart) 
function action_woocommerce_after_checkout_billing_form( $checkout ) {
    // Check if Product in Cart
    // Multiple product IDs can be entered, separated by a comma
    $product_in_cart = is_product_in_cart( array( 212, 30, 815 ) );
    
    // True
    if ( $product_in_cart ) {
        $domain  = 'woocommerce';
        $default = 'Y';

        woocommerce_form_field( '_my_field_name', array(
            'type'      => 'select',
            'class'     => array( 'form-row-wide' ),
            'label'     => __( 'Market Place - Please Select Y to complete this order', $domain ),
            'required'  => true,
            'options'   => array(
                'Y' => __( 'Y', $domain ),
                'N' => __( 'N', $domain ),
            ),
            'default'   => $default,
        ), $checkout->get_value( '_my_field_name' ) );
     }
}
add_action( 'woocommerce_after_checkout_billing_form', 'action_woocommerce_after_checkout_billing_form', 10, 1 );

// Function to check if a certain product ID is in cart
function is_product_in_cart( $targeted_ids ) {
    // Flag no product in cart
    $flag = false;
    
    // WC Cart NOT null
    if ( ! is_null( WC()->cart ) ) {
        // Loop through cart items
        foreach( WC()->cart->get_cart() as $cart_item ) {
            // Check cart item for defined product Ids
            if ( in_array( $cart_item['product_id'], $targeted_ids ) ) {
                // Product is in cart
                $flag = true;
                
                // Break loop
                break;
            }
        }
    }

    return $flag;
}

// Custom checkout 'select' field validation
function action_woocommerce_checkout_process() {
    // Isset    
    if ( isset( $_POST['_my_field_name'] ) ) {
        $domain = 'woocommerce';
        $my_field_name = $_POST['_my_field_name'];
        
        // Empty
        if ( empty ( $my_field_name ) ) {
            wc_add_notice( __( 'Please Select Y to complete this order', $domain ), 'error' );
        }
        
        // NOT empty but value is 'N'
        if ( ! empty ( $my_field_name ) && $my_field_name == 'N' ) {
            wc_add_notice( __( 'Please Select Y to complete this order', $domain ), 'error' );
        }       
    }
}
add_action( 'woocommerce_checkout_process', 'action_woocommerce_checkout_process', 10, 0 );

// Save custom checkout 'select' field
function action_woocommerce_checkout_create_order( $order, $data ) {
    // Isset    
    if ( isset( $_POST['_my_field_name'] ) ) {
        $my_field_name = $_POST['_my_field_name'];
    
        // NOT empty & equal to 'Y'
        if ( ! empty( $my_field_name ) && $my_field_name == 'Y' ) {
            $order->update_meta_data( '_my_field_name', sanitize_text_field( $my_field_name ) );
        }
    } 
}
add_action( 'woocommerce_checkout_create_order', 'action_woocommerce_checkout_create_order', 10, 2 );

// Display the custom 'select' field value on admin order pages after billing adress
function action_woocommerce_admin_order_data_after_billing_address( $order ) {
    $domain = 'woocommerce';
    
    // Get meta
    $my_field_name = $order->get_meta( '_my_field_name' );
    
    // NOT empty
    if ( ! empty ( $my_field_name ) ) {
        echo '<p><strong>' . __( 'Delivery type', $domain ) . ':</strong> ' . $order->get_meta( '_my_field_name' ) . '</p>';
    }
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'action_woocommerce_admin_order_data_after_billing_address', 10, 1 );

// Display the custom 'select' field value on 'order received' and 'order view' pages (frontend)
function action_woocommerce_order_details_after_order_table( $order ) {
    $domain = 'woocommerce';
    
    // Get meta
    $my_field_name = $order->get_meta( '_my_field_name' );
    
    // NOT empty
    if ( ! empty ( $my_field_name ) ) {
        echo '<p><strong>' . __( 'Delivery type', $domain ) . ':</strong> ' . $order->get_meta( '_my_field_name' ) . '</p>';
    }
}
add_action( 'woocommerce_order_details_after_order_table', 'action_woocommerce_order_details_after_order_table', 10, 1 );