- Statut : non résolu
- Ce sujet contient 36 réponses, 5 participants et a été mis à jour pour la dernière fois par mathieu42, le il y a 2 années et 5 mois.
-
AuteurMessages
-
30 janvier 2015 à 13 h 45 min #983039
mieux vaut utiliser wordpad comme éditeur.
Sinon tu fais copier coller du code directement dans le fichier checkout, tout à la fin et tu sauvegardes.
Je l’ai fais sur plusieurs sites et ça fonctionne nickel.30 janvier 2015 à 16 h 48 min #983040Je suis vraiment navré, mais je viens de modifier avec wordpad, comme conseillé. Voici le code complet :
[c] /**
* Checkout
*
* The WooCommerce checkout class handles the checkout process, collecting user data and processing the payment.
*
* @class WC_Cart
* @version 2.1.0
* @package WooCommerce/Classes
* @category Class
* @author WooThemes
*/
class WC_Checkout {/** @var array Array of posted form data. */
public $posted;/** @var array Array of fields to display on the checkout. */
public $checkout_fields;/** @var bool Whether or not the user must create an account to checkout. */
public $must_create_account;/** @var bool Whether or not signups are allowed. */
public $enable_signup;/** @var object The shipping method being used. */
private $shipping_method;/** @var WC_Payment_Gateway The payment gateway being used. */
private $payment_method;/** @var int ID of customer. */
private $customer_id;/**
* @var WC_Checkout The single instance of the class
* @since 2.1
*/
protected static $_instance = null;/**
* Main WC_Checkout Instance
*
* Ensures only one instance of WC_Checkout is loaded or can be loaded.
*
* @since 2.1
* @static
* @return WC_Checkout Main instance
*/
public static function instance() {
if ( is_null( self::$_instance ) )
self::$_instance = new self();
return self::$_instance;
}/**
* Cloning is forbidden.
*
* @since 2.1
*/
public function __clone() {
_doing_it_wrong( __FUNCTION__, __( ‘Cheatin’ huh?’, ‘woocommerce’ ), ‘2.1’ );
}/**
* Unserializing instances of this class is forbidden.
*
* @since 2.1
*/
public function __wakeup() {
_doing_it_wrong( __FUNCTION__, __( ‘Cheatin’ huh?’, ‘woocommerce’ ), ‘2.1’ );
}/**
* Constructor for the checkout class. Hooks in methods and defines checkout fields.
*
* @access public
* @return void
*/
public function __construct () {
add_action( ‘woocommerce_checkout_billing’, array( $this,’checkout_form_billing’ ) );
add_action( ‘woocommerce_checkout_shipping’, array( $this,’checkout_form_shipping’ ) );$this->enable_signup = get_option( ‘woocommerce_enable_signup_and_login_from_checkout’ ) == ‘yes’ ? true : false;
$this->enable_guest_checkout = get_option( ‘woocommerce_enable_guest_checkout’ ) == ‘yes’ ? true : false;
$this->must_create_account = $this->enable_guest_checkout || is_user_logged_in() ? false : true;// Define all Checkout fields
$this->checkout_fields = WC()->countries->get_address_fields( $this->get_value( ‘billing_country’ ), ‘billing_’ );
$this->checkout_fields = WC()->countries->get_address_fields( $this->get_value( ‘shipping_country’ ), ‘shipping_’ );if ( get_option( ‘woocommerce_registration_generate_username’ ) == ‘no’ ) {
$this->checkout_fields = array(
‘type’ => ‘text’,
‘label’ => __( ‘Account username’, ‘woocommerce’ ),
‘required’ => true,
‘placeholder’ => _x( ‘Username’, ‘placeholder’, ‘woocommerce’ )
);
}if ( get_option( ‘woocommerce_registration_generate_password’ ) == ‘no’ ) {
$this->checkout_fields = array(
‘type’ => ‘password’,
‘label’ => __( ‘Account password’, ‘woocommerce’ ),
‘required’ => true,
‘placeholder’ => _x( ‘Password’, ‘placeholder’, ‘woocommerce’ )
);
}$this->checkout_fields = array(
‘order_comments’ => array(
‘type’ => ‘textarea’,
‘class’ => array(‘notes’),
‘label’ => __( ‘Order Notes’, ‘woocommerce’ ),
‘placeholder’ => _x(‘Notes about your order, e.g. special notes for delivery.’, ‘placeholder’, ‘woocommerce’)
)
);$this->checkout_fields = apply_filters( ‘woocommerce_checkout_fields’, $this->checkout_fields );
do_action( ‘woocommerce_checkout_init’, $this );
}/**
* Checkout process
*/
public function check_cart_items() {
// When we process the checkout, lets ensure cart items are rechecked to prevent checkout
do_action(‘woocommerce_check_cart_items’);
}/**
* Output the billing information form
*
* @access public
* @return void
*/
public function checkout_form_billing() {
wc_get_template( ‘checkout/form-billing.php’, array( ‘checkout’ => $this ) );
}/**
* Output the shipping information form
*
* @access public
* @return void
*/
public function checkout_form_shipping() {
wc_get_template( ‘checkout/form-shipping.php’, array( ‘checkout’ => $this ) );
}/**
* create_order function.
* @access public
* @throws Exception
* @return int|WP_ERROR
*/
public function create_order() {
global $wpdb;// Give plugins the opportunity to create an order themselves
if ( $order_id = apply_filters( ‘woocommerce_create_order’, null, $this ) ) {
return $order_id;
}try {
// Start transaction if available
$wpdb->query( ‘START TRANSACTION’ );$order_data = array(
‘status’ => apply_filters( ‘woocommerce_default_order_status’, ‘pending’ ),
‘customer_id’ => $this->customer_id,
‘customer_note’ => isset( $this->posted ) ? $this->posted : »
);// Insert or update the post data
$order_id = absint( WC()->session->order_awaiting_payment );// Resume the unpaid order if its pending
if ( $order_id > 0 && ( $order = wc_get_order( $order_id ) ) && $order->has_status( array( ‘pending’, ‘failed’ ) ) ) {$order_data = $order_id;
$order = wc_update_order( $order_data );if ( is_wp_error( $order ) ) {
throw new Exception( __( ‘Error: Unable to create order. Please try again.’, ‘woocommerce’ ) );
} else {
$order->remove_order_items();
do_action( ‘woocommerce_resume_order’, $order_id );
}} else {
$order = wc_create_order( $order_data );
if ( is_wp_error( $order ) ) {
throw new Exception( __( ‘Error: Unable to create order. Please try again.’, ‘woocommerce’ ) );
} else {
$order_id = $order->id;
do_action( ‘woocommerce_new_order’, $order_id );
}
}// Store the line items to the new/resumed order
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$item_id = $order->add_product(
$values,
$values,
array(
‘variation’ => $values,
‘totals’ => array(
‘subtotal’ => $values,
‘subtotal_tax’ => $values,
‘total’ => $values,
‘tax’ => $values,
‘tax_data’ => $values // Since 2.2
)
)
);if ( ! $item_id ) {
throw new Exception( __( ‘Error: Unable to create order. Please try again.’, ‘woocommerce’ ) );
}// Allow plugins to add order item meta
do_action( ‘woocommerce_add_order_item_meta’, $item_id, $values, $cart_item_key );
}// Store fees
foreach ( WC()->cart->get_fees() as $fee_key => $fee ) {
$item_id = $order->add_fee( $fee );if ( ! $item_id ) {
throw new Exception( __( ‘Error: Unable to create order. Please try again.’, ‘woocommerce’ ) );
}// Allow plugins to add order item meta to fees
do_action( ‘woocommerce_add_order_fee_meta’, $order_id, $item_id, $fee, $fee_key );
}// Store shipping for all packages
foreach ( WC()->shipping->get_packages() as $package_key => $package ) {
if ( isset( $package[ $this->shipping_methods[ $package_key ] ] ) ) {
$item_id = $order->add_shipping( $package[ $this->shipping_methods[ $package_key ] ] );if ( ! $item_id ) {
throw new Exception( __( ‘Error: Unable to create order. Please try again.’, ‘woocommerce’ ) );
}// Allows plugins to add order item meta to shipping
do_action( ‘woocommerce_add_shipping_order_item’, $order_id, $item_id, $package_key );
}
}// Store tax rows
foreach ( array_keys( WC()->cart->taxes + WC()->cart->shipping_taxes ) as $tax_rate_id ) {
if ( ! $order->add_tax( $tax_rate_id, WC()->cart->get_tax_amount( $tax_rate_id ), WC()->cart->get_shipping_tax_amount( $tax_rate_id ) ) && ‘zero-rated’ !== $tax_rate_id ) {
throw new Exception( __( ‘Error: Unable to create order. Please try again.’, ‘woocommerce’ ) );
}
}// Store coupons
foreach ( WC()->cart->get_coupons() as $code => $coupon ) {
if ( ! $order->add_coupon( $code, WC()->cart->get_coupon_discount_amount( $code ) ) ) {
throw new Exception( __( ‘Error: Unable to create order. Please try again.’, ‘woocommerce’ ) );
}
}// Billing address
$billing_address = array();
if ( $this->checkout_fields ) {
foreach ( array_keys( $this->checkout_fields ) as $field ) {
$field_name = str_replace( ‘billing_’, », $field );
$billing_address[ $field_name ] = $this->get_posted_address_data( $field_name );
}
}// Shipping address.
$shipping_address = array();
if ( $this->checkout_fields ) {
foreach ( array_keys( $this->checkout_fields ) as $field ) {
$field_name = str_replace( ‘shipping_’, », $field );
$shipping_address[ $field_name ] = $this->get_posted_address_data( $field_name, ‘shipping’ );
}
}$order->set_address( $billing_address, ‘billing’ );
$order->set_address( $shipping_address, ‘shipping’ );
$order->set_payment_method( $this->payment_method );
$order->set_total( WC()->cart->shipping_total, ‘shipping’ );
$order->set_total( WC()->cart->get_order_discount_total(), ‘order_discount’ );
$order->set_total( WC()->cart->get_cart_discount_total(), ‘cart_discount’ );
$order->set_total( WC()->cart->tax_total, ‘tax’ );
$order->set_total( WC()->cart->shipping_tax_total, ‘shipping_tax’ );
$order->set_total( WC()->cart->total );// Update user meta
if ( $this->customer_id ) {
if ( apply_filters( ‘woocommerce_checkout_update_customer_data’, true, $this ) ) {
foreach ( $billing_address as $key => $value ) {
update_user_meta( $this->customer_id, ‘billing_’ . $key, $value );
}
foreach ( $shipping_address as $key => $value ) {
update_user_meta( $this->customer_id, ‘shipping_’ . $key, $value );
}
}
do_action( ‘woocommerce_checkout_update_user_meta’, $this->customer_id, $this->posted );
}// Let plugins add meta
do_action( ‘woocommerce_checkout_update_order_meta’, $order_id, $this->posted );// If we got here, the order was created without problems!
$wpdb->query( ‘COMMIT’ );} catch ( Exception $e ) {
// There was an error adding order data!
$wpdb->query( ‘ROLLBACK’ );
return new WP_Error( ‘checkout-error’, $e->getMessage() );
}return $order_id;
}/**
* Process the checkout after the confirm order button is pressed
*
* @access public
* @return void
*/
public function process_checkout() {
if ( ! wp_verify_nonce( $_POST, ‘woocommerce-process_checkout’ ) ) {
return;
}if ( ! defined( ‘WOOCOMMERCE_CHECKOUT’ ) )
define( ‘WOOCOMMERCE_CHECKOUT’, true );// Prevent timeout
@set_time_limit(0);do_action( ‘woocommerce_before_checkout_process’ );
if ( sizeof( WC()->cart->get_cart() ) == 0 ) {
wc_add_notice( sprintf( __( ‘Sorry, your session has expired. Return to homepage‘, ‘woocommerce’ ), home_url() ), ‘error’ );
}do_action( ‘woocommerce_checkout_process’ );
// Checkout fields (not defined in checkout_fields)
$this->posted = isset( $_POST ) ? 1 : 0;
$this->posted = isset( $_POST ) && ! empty( $_POST ) ? 1 : 0;
$this->posted = isset( $_POST ) ? stripslashes( $_POST ) : »;
$this->posted = isset( $_POST ) ? $_POST : »;
$this->posted = isset( $_POST ) ? true : false;if ( isset( $_POST ) ) {
_deprecated_argument( ‘WC_Checkout::process_checkout()’, ‘2.1’, ‘The « shiptobilling » field is deprecated. THe template files are out of date’ );$this->posted = $_POST ? false : true;
}// Ship to billing only option
if ( WC()->cart->ship_to_billing_address_only() ) {
$this->posted = false;
}// Update customer shipping and payment method to posted method
$chosen_shipping_methods = WC()->session->get( ‘chosen_shipping_methods’ );if ( isset( $this->posted ) && is_array( $this->posted ) ) {
foreach ( $this->posted as $i => $value ) {
$chosen_shipping_methods[ $i ] = wc_clean( $value );
}
}WC()->session->set( ‘chosen_shipping_methods’, $chosen_shipping_methods );
WC()->session->set( ‘chosen_payment_method’, $this->posted );// Note if we skip shipping
$skipped_shipping = false;// Get posted checkout_fields and do validation
foreach ( $this->checkout_fields as $fieldset_key => $fieldset ) {// Skip shipping if not needed
if ( $fieldset_key == ‘shipping’ && ( $this->posted == false || ! WC()->cart->needs_shipping() ) ) {
$skipped_shipping = true;
continue;
}// Ship account if not needed
if ( $fieldset_key == ‘account’ && ( is_user_logged_in() || ( $this->must_create_account == false && empty( $this->posted ) ) ) ) {
continue;
}foreach ( $fieldset as $key => $field ) {
if ( ! isset( $field ) ) {
$field = ‘text’;
}// Get Value
switch ( $field ) {
case « checkbox » :
$this->posted[ $key ] = isset( $_POST[ $key ] ) ? 1 : 0;
break;
case « multiselect » :
$this->posted[ $key ] = isset( $_POST[ $key ] ) ? implode( ‘, ‘, array_map( ‘wc_clean’, $_POST[ $key ] ) ) : »;
break;
case « textarea » :
$this->posted[ $key ] = isset( $_POST[ $key ] ) ? wp_strip_all_tags( wp_check_invalid_utf8( stripslashes( $_POST[ $key ] ) ) ) : »;
break;
default :
$this->posted[ $key ] = isset( $_POST[ $key ] ) ? ( is_array( $_POST[ $key ] ) ? array_map( ‘wc_clean’, $_POST[ $key ] ) : wc_clean( $_POST[ $key ] ) ) : »;
break;
}// Hooks to allow modification of value
$this->posted[ $key ] = apply_filters( ‘woocommerce_process_checkout_’ . sanitize_title( $field ) . ‘_field’, $this->posted[ $key ] );
$this->posted[ $key ] = apply_filters( ‘woocommerce_process_checkout_field_’ . $key, $this->posted[ $key ] );// Validation: Required fields
if ( isset( $field ) && $field && empty( $this->posted[ $key ] ) ) {
wc_add_notice( ‘‘ . $field . ‘ ‘ . __( ‘is a required field.’, ‘woocommerce’ ), ‘error’ );
}if ( ! empty( $this->posted[ $key ] ) ) {
// Validation rules
if ( ! empty( $field ) && is_array( $field ) ) {
foreach ( $field as $rule ) {
switch ( $rule ) {
case ‘postcode’ :
$this->posted[ $key ] = strtoupper( str_replace( ‘ ‘, », $this->posted[ $key ] ) );if ( ! WC_Validation::is_postcode( $this->posted[ $key ], $_POST[ $fieldset_key . ‘_country’ ] ) ) :
wc_add_notice( __( ‘Please enter a valid postcode/ZIP.’, ‘woocommerce’ ), ‘error’ );
else :
$this->posted[ $key ] = wc_format_postcode( $this->posted[ $key ], $_POST[ $fieldset_key . ‘_country’ ] );
endif;
break;
case ‘phone’ :
$this->posted[ $key ] = wc_format_phone_number( $this->posted[ $key ] );if ( ! WC_Validation::is_phone( $this->posted[ $key ] ) )
wc_add_notice( ‘‘ . $field . ‘ ‘ . __( ‘is not a valid phone number.’, ‘woocommerce’ ), ‘error’ );
break;
case ’email’ :
$this->posted[ $key ] = strtolower( $this->posted[ $key ] );if ( ! is_email( $this->posted[ $key ] ) )
wc_add_notice( ‘‘ . $field . ‘ ‘ . __( ‘is not a valid email address.’, ‘woocommerce’ ), ‘error’ );
break;
case ‘state’ :
// Get valid states
$valid_states = WC()->countries->get_states( isset( $_POST[ $fieldset_key . ‘_country’ ] ) ? $_POST[ $fieldset_key . ‘_country’ ] : ( ‘billing’ === $fieldset_key ? WC()->customer->get_country() : WC()->customer->get_shipping_country() ) );if ( ! empty( $valid_states ) && is_array( $valid_states ) ) {
$valid_state_values = array_flip( array_map( ‘strtolower’, $valid_states ) );// Convert value to key if set
if ( isset( $valid_state_values[ strtolower( $this->posted[ $key ] ) ] ) ) {
$this->posted[ $key ] = $valid_state_values[ strtolower( $this->posted[ $key ] ) ];
}
}// Only validate if the country has specific state options
if ( ! empty( $valid_states ) && is_array( $valid_states ) && sizeof( $valid_states ) > 0 ) {
if ( ! in_array( $this->posted[ $key ], array_keys( $valid_states ) ) ) {
wc_add_notice( ‘‘ . $field . ‘ ‘ . __( ‘is not valid. Please enter one of the following:’, ‘woocommerce’ ) . ‘ ‘ . implode( ‘, ‘, $valid_states ), ‘error’ );
}
}
break;
}
}
}
}
}
}// Update customer location to posted location so we can correctly check available shipping methods
if ( isset( $this->posted ) ) {
WC()->customer->set_country( $this->posted );
}
if ( isset( $this->posted ) ) {
WC()->customer->set_state( $this->posted );
}
if ( isset( $this->posted ) ) {
WC()->customer->set_postcode( $this->posted );
}// Shipping Information
if ( ! $skipped_shipping ) {// Update customer location to posted location so we can correctly check available shipping methods
if ( isset( $this->posted ) ) {
WC()->customer->set_shipping_country( $this->posted );
}
if ( isset( $this->posted ) ) {
WC()->customer->set_shipping_state( $this->posted );
}
if ( isset( $this->posted ) ) {
WC()->customer->set_shipping_postcode( $this->posted );
}} else {
// Update customer location to posted location so we can correctly check available shipping methods
if ( isset( $this->posted ) ) {
WC()->customer->set_shipping_country( $this->posted );
}
if ( isset( $this->posted ) ) {
WC()->customer->set_shipping_state( $this->posted );
}
if ( isset( $this->posted ) ) {
WC()->customer->set_shipping_postcode( $this->posted );
}}
// Update cart totals now we have customer address
WC()->cart->calculate_totals();// Terms
if ( ! isset( $_POST ) && empty( $this->posted ) && wc_get_page_id( ‘terms’ ) > 0 ) {
wc_add_notice( __( ‘You must accept our Terms & Conditions.’, ‘woocommerce’ ), ‘error’ );
}if ( WC()->cart->needs_shipping() ) {
if ( ! in_array( WC()->customer->get_shipping_country(), array_keys( WC()->countries->get_shipping_countries() ) ) ) {
wc_add_notice( sprintf( __( ‘Unfortunately we do not ship %s. Please enter an alternative shipping address.’, ‘woocommerce’ ), WC()->countries->shipping_to_prefix() . ‘ ‘ . WC()->customer->get_shipping_country() ), ‘error’ );
}// Validate Shipping Methods
$packages = WC()->shipping->get_packages();
$this->shipping_methods = WC()->session->get( ‘chosen_shipping_methods’ );foreach ( $packages as $i => $package ) {
if ( ! isset( $package[ $this->shipping_methods[ $i ] ] ) ) {
wc_add_notice( __( ‘Invalid shipping method.’, ‘woocommerce’ ), ‘error’ );
$this->shipping_methods[ $i ] = »;
}
}
}if ( WC()->cart->needs_payment() ) {
// Payment Method
$available_gateways = WC()->payment_gateways->get_available_payment_gateways();if ( ! isset( $available_gateways[ $this->posted ] ) ) {
$this->payment_method = »;
wc_add_notice( __( ‘Invalid payment method.’, ‘woocommerce’ ), ‘error’ );
} else {
$this->payment_method = $available_gateways[ $this->posted ];
$this->payment_method->validate_fields();
}
}// Action after validation
do_action( ‘woocommerce_after_checkout_validation’, $this->posted );if ( ! isset( $_POST ) && wc_notice_count( ‘error’ ) == 0 ) {
try {
// Customer accounts
$this->customer_id = apply_filters( ‘woocommerce_checkout_customer_id’, get_current_user_id() );if ( ! is_user_logged_in() && ( $this->must_create_account || ! empty( $this->posted ) ) ) {
$username = ! empty( $this->posted ) ? $this->posted : »;
$password = ! empty( $this->posted ) ? $this->posted : »;
$new_customer = wc_create_new_customer( $this->posted, $username, $password );if ( is_wp_error( $new_customer ) ) {
throw new Exception( $new_customer->get_error_message() );
}$this->customer_id = $new_customer;
wc_set_customer_auth_cookie( $this->customer_id );
// As we are now logged in, checkout will need to refresh to show logged in data
WC()->session->set( ‘reload_checkout’, true );// Also, recalculate cart totals to reveal any role-based discounts that were unavailable before registering
WC()->cart->calculate_totals();// Add customer info from other billing fields
if ( $this->posted && apply_filters( ‘woocommerce_checkout_update_customer_data’, true, $this ) ) {
$userdata = array(
‘ID’ => $this->customer_id,
‘first_name’ => $this->posted ? $this->posted : »,
‘last_name’ => $this->posted ? $this->posted : »,
‘display_name’ => $this->posted ? $this->posted : »
);
wp_update_user( apply_filters( ‘woocommerce_checkout_customer_userdata’, $userdata, $this ) );
}
}// Do a final stock check at this point
$this->check_cart_items();// Abort if errors are present
if ( wc_notice_count( ‘error’ ) > 0 )
throw new Exception();$order_id = $this->create_order();
if ( is_wp_error( $order_id ) ) {
throw new Exception( $order_id->get_error_message() );
}do_action( ‘woocommerce_checkout_order_processed’, $order_id, $this->posted );
// Process payment
if ( WC()->cart->needs_payment() ) {// Store Order ID in session so it can be re-used after payment failure
WC()->session->order_awaiting_payment = $order_id;// Process Payment
$result = $available_gateways[ $this->posted ]->process_payment( $order_id );// Redirect to success/confirmation/payment page
if ( $result == ‘success’ ) {$result = apply_filters( ‘woocommerce_payment_successful_result’, $result, $order_id );
if ( is_ajax() ) {
echo ‘‘ . json_encode( $result ) . ‘‘;
exit;
} else {
wp_redirect( $result );
exit;
}}
} else {
if ( empty( $order ) ) {
$order = wc_get_order( $order_id );
}// No payment was required for order
$order->payment_complete();// Empty the Cart
WC()->cart->empty_cart();// Get redirect
$return_url = $order->get_checkout_order_received_url();// Redirect to success/confirmation/payment page
if ( is_ajax() ) {
echo ‘‘ . json_encode(
array(
‘result’ => ‘success’,
‘redirect’ => apply_filters( ‘woocommerce_checkout_no_payment_needed_redirect’, $return_url, $order )
)
) . ‘‘;
exit;
} else {
wp_safe_redirect(
apply_filters( ‘woocommerce_checkout_no_payment_needed_redirect’, $return_url, $order )
);
exit;
}}
} catch ( Exception $e ) {
if ( ! empty( $e ) ) {
wc_add_notice( $e->getMessage(), ‘error’ );
}
}} // endif
// If we reached this point then there were errors
if ( is_ajax() ) {// only print notices if not reloading the checkout, otherwise they’re lost in the page reload
if ( ! isset( WC()->session->reload_checkout ) ) {
ob_start();
wc_print_notices();
$messages = ob_get_clean();
}echo ‘‘ . json_encode(
array(
‘result’ => ‘failure’,
‘messages’ => isset( $messages ) ? $messages : »,
‘refresh’ => isset( WC()->session->refresh_totals ) ? ‘true’ : ‘false’,
‘reload’ => isset( WC()->session->reload_checkout ) ? ‘true’ : ‘false’
)
) . ‘‘;unset( WC()->session->refresh_totals, WC()->session->reload_checkout );
exit;
}
}/**
* Get a posted address field after sanitization and validation.
* @param string $key
* @param string $type billing for shipping
* @return string
*/
public function get_posted_address_data( $key, $type = ‘billing’ ) {
if ( ‘billing’ === $type || false === $this->posted ) {
$return = isset( $this->posted[ ‘billing_’ . $key ] ) ? $this->posted[ ‘billing_’ . $key ] : »;
} else {
$return = isset( $this->posted[ ‘shipping_’ . $key ] ) ? $this->posted[ ‘shipping_’ . $key ] : »;
}// Use logged in user’s billing email if neccessary
if ( ’email’ === $key && empty( $return ) && is_user_logged_in() ) {
$current_user = wp_get_current_user();
$return = $current_user->user_email;
}
return $return;
}/**
* Gets the value either from the posted data, or from the users meta data
*
* @access public
* @param string $input
* @return string|null
*/
public function get_value( $input ) {
if ( ! empty( $_POST[ $input ] ) ) {return wc_clean( $_POST[ $input ] );
} else {
$value = apply_filters( ‘woocommerce_checkout_get_value’, null, $input );
if ( $value !== null ) {
return $value;
}// Get the billing_ and shipping_ address fields
$address_fields = array_merge( WC()->countries->get_address_fields(), WC()->countries->get_address_fields( », ‘shipping_’ ) );if ( is_user_logged_in() && array_key_exists( $input, $address_fields ) ) {
$current_user = wp_get_current_user();if ( $meta = get_user_meta( $current_user->ID, $input, true ) ) {
return $meta;
}if ( $input == ‘billing_email’ ) {
return $current_user->user_email;
}
}switch ( $input ) {
case ‘billing_country’ :
return apply_filters( ‘default_checkout_country’, WC()->customer->get_country() ? WC()->customer->get_country() : WC()->countries->get_base_country(), ‘billing’ );
case ‘billing_state’ :
return apply_filters( ‘default_checkout_state’, WC()->customer->has_calculated_shipping() ? WC()->customer->get_state() : », ‘billing’ );
case ‘billing_postcode’ :
return apply_filters( ‘default_checkout_postcode’, WC()->customer->get_postcode() ? WC()->customer->get_postcode() : », ‘billing’ );
case ‘shipping_country’ :
return apply_filters( ‘default_checkout_country’, WC()->customer->get_shipping_country() ? WC()->customer->get_shipping_country() : WC()->countries->get_base_country(), ‘shipping’ );
case ‘shipping_state’ :
return apply_filters( ‘default_checkout_state’, WC()->customer->has_calculated_shipping() ? WC()->customer->get_shipping_state() : », ‘shipping’ );
case ‘shipping_postcode’ :
return apply_filters( ‘default_checkout_postcode’, WC()->customer->get_shipping_postcode() ? WC()->customer->get_shipping_postcode() : », ‘shipping’ );
default :
return apply_filters( ‘default_checkout_’ . $input, null, $input );
}
}
}
}
/**
* Add the field to the checkout
*/
add_action( ‘woocommerce_after_order_notes’, ‘my_custom_checkout_field’ );function my_custom_checkout_field( $checkout ) {
echo ‘
‘ . __(‘Informations Soci‚t‚) . ‘
‘;
woocommerce_form_field( ‘my_field_name’, array(
‘type’ => ‘text’,
‘class’ => array(‘my-field-class form-row-wide’),
‘label’ => __(‘Nø de Siret),
‘required’ => true,
‘placeholder’ => __(‘(siret)’),
), $checkout->get_value( ‘my_field_name’ ));echo ‘
‘;
}
/**
* Process the checkout
*/
add_action(‘woocommerce_checkout_process’, ‘my_custom_checkout_field_process’);function my_custom_checkout_field_process() {
// Check if set, if its not set add an error.
if ( ! $_POST )
wc_add_notice( __( ‘Merci de compl‚ter ces champs’ ), ‘error’ );
}
/**
* 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 ( ! empty( $_POST ) ) {
update_post_meta( $order_id, ‘Nø de Siret’, sanitize_text_field( $_POST ) );
}
}
/**
* 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){
echo ‘‘.__(‘Nø de Siret’).’: ‘ . get_post_meta( $order->id, ‘Nø de Siret’, true ) . ‘
‘;
}
/**
* Add the field to the checkout
*/
add_action( ‘woocommerce_after_order_notes’, ‘my_custom_checkout_field2’ );function my_custom_checkout_field2( $checkout ) {
echo ‘
‘;woocommerce_form_field( ‘my_field_name2’, array(
‘type’ => ‘text’,
‘class’ => array(‘my-field-class form-row-wide’),
‘label’ => __(‘Raison sociale’),
‘required’ => true,
‘placeholder’ => __(‘(nom)’),
), $checkout->get_value( ‘my_field_name2’ ));echo ‘
‘;
}
/**
* Process the checkout
*/
add_action(‘woocommerce_checkout_process’, ‘my_custom_checkout_field2_process’);function my_custom_checkout_field2_process() {
// Check if set, if its not set add an error.
if ( ! $_POST )
wc_add_notice( __( ‘Merci de compl‚ter ces champs’ ), ‘error’ );
}
/**
* Update the order meta with field value
*/
add_action( ‘woocommerce_checkout_update_order_meta’, ‘my_custom_checkout_field2_update_order_meta’ );function my_custom_checkout_field2_update_order_meta( $order_id ) {
if ( ! empty( $_POST ) ) {
update_post_meta( $order_id, ‘Raison sociale’, sanitize_text_field( $_POST ) );
}
}
/**
* Display field value on the order edit page
*/
add_action( ‘woocommerce_admin_order_data_after_billing_address’, ‘my_custom_checkout_field2_display_admin_order_meta’, 10, 1 );function my_custom_checkout_field2_display_admin_order_meta($order){
echo ‘‘.__(‘Raison sociale’).’: ‘ . get_post_meta( $order->id, ‘Raison sociale’, true ) . ‘
‘;
}
[/c]Et le résultat est une page complètement blanche http://sansmaitre.be/checkout/
Je ne vois pas comment je pourrais mettre ce code autrement, à moins, une fois de plus ,que j’ai mal collé ?
30 janvier 2015 à 19 h 57 min #983041quand je clique sur le lien, la page est effectivement vide.
Mais avez-vous fait une simulation de commande ?
La page checkout appelle tout son contenu quand une commande est sur le point d’être réglée.
Si vous n’avez sélectionné aucun produit, forcément la page commande sera vide30 janvier 2015 à 20 h 59 min #983042Oui, j’ai un panier « test » qui me permet de faire les tests. Pour le moment, etant occupé à régler les zones pour les envois, j’ai remis le fichier original, je peux remettre celui avec la modif après si vous le souhaitez.
30 janvier 2015 à 21 h 52 min #983043Votre wordpad a visiblement généré quelques erreurs.
Recopier ce code avec notepad:/**
* Add the field to the checkout
*/
add_action( ‘woocommerce_after_order_notes’, ‘my_custom_checkout_field’ );function my_custom_checkout_field( $checkout ) {
echo ‘
‘ . __(‘Informations sur votre société’) . ‘
‘;
woocommerce_form_field( ‘my_field_name’, array(
‘type’ => ‘text’,
‘class’ => array(‘my-field-class form-row-wide’),
‘label’ => __(‘N° de Siret’),
‘required’ => true,
‘placeholder’ => __(‘(numéro)’),
), $checkout->get_value( ‘my_field_name’ ));echo ‘
‘;
}
/**
* Process the checkout
*/
add_action(‘woocommerce_checkout_process’, ‘my_custom_checkout_field_process’);function my_custom_checkout_field_process() {
// Check if set, if its not set add an error.
if ( ! $_POST )
wc_add_notice( __( ‘Merci de renseigner tous les champs’ ), ‘error’ );
}
/**
* 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 ( ! empty( $_POST ) ) {
update_post_meta( $order_id, ‘N° de Siret’, sanitize_text_field( $_POST ) );
}
}
/**
* 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){
echo ‘‘.__(‘N° de Siret’).’: ‘ . get_post_meta( $order->id, ‘N° de Siret’, true ) . ‘
‘;
}à la fin du fichier checkout. Puis sauvegarder.
C’est juste le premier champ « N° de siret »
Si ca fonctionne on fera le second « raison sociale ».Puis faites juste une simulation de commande en remplissant votre panier. Puis voir panier. Puis procédez à la commande pour remplir les champs de coordonnées du client.
En principe vous avez un titre « Informations sur votre société » suivi en dessous d’un titre de champ « N° de siret » et le champ à remplir.
Dites moi si cela fonctionne30 janvier 2015 à 23 h 19 min #983044Impeccable. Ca s’affiche. Désolé pour le retard de réponse, je terminais les montants d’expédition.
Juste un petit changement est possible ? Ce n’est pas requis mais facultatif (étant donné que le formulaire sert tant pour les privés que pour les sociétés.
1.000 mercis 👏
31 janvier 2015 à 14 h 39 min #983045Bien le bonjour.
J’ai pu supprimer la mention « requis » et ajouter la raison sociale grâce à ton code.
Il ne me reste plus qu’à trouver comment insérer ces informations dans la facture.
Mais pour le formulaire, c’est terminé. Un super grand merci pour ton aide très efficace.👏👏👏👏👏
1 février 2015 à 14 h 53 min #983046J’allais justement y revenir mais je vois que vous avez résolu votre soucis.
Pour le 2ème champ pour la raison sociale, vous aviez déjà le code dans ma 1ère proposition de code.
Il suffisait en effet de le mettre au bout du 1er champ sur le N° de siret.Pour le caractère facultatif du champ cela se passe au niveau du « process checkout » de la ligne de code.
J’ai vu que vous aviez obtenu la réponse dans un autre post.
A noter également que l’étoile en face du champ induit à votre client que ce champ est obligatoire.
Pour retirer l’étoile il faut dans la ligne de code transformer le « ‘required’ => true, » en « ‘required’ => false, ».Voilà
1 février 2015 à 15 h 35 min #983047Merci beaucoup. Oui, effectivement, comme j’avais mis que tout était ok ici, et que je trouvais qu’il s’agissait d’une autre question, j’ai préféré ouvrir un autre post, afin de pouvoir aider d’autres futurs lecteurs.
J’ai encore une question à ce sujet, car je n’ai pas trouvé comment ajouter les infos de sociétés et autres dans les comptes clients pour consultation , … Mais je pense qu’on entre dans le domaine très complexe de WordPress, et je n’ai pas encore fini mes recherches sur Internet avant e poser la question sur ce forum.
En tout vas 1.000 mercis.
1 février 2015 à 15 h 43 min #983048En tout CAS, …
1 février 2015 à 17 h 39 min #983049Je ne comprends pas ta question sur les infos de sociétés dans les comptes clients ?
1 février 2015 à 18 h 06 min #983050En fait, lorsque je crée un client dans la boutique par une commande, et que je vais retrouver sa fiche, je ne trouve pas les infos de société, ni sur les mails qui lui sont transmis
ce qui implique que je vais devoir facturer manuellement pour les autres refuges qui vont s’approvisionner chez nous
2 février 2015 à 10 h 08 min #983051tu retrouves toutes les coordonnées de tes clients quand tu cliques sur leurs noms dans la page de la commande
2 février 2015 à 10 h 35 min #983052Snif, je viesn de voir que là, on a un petit problème, …. Dans les champs personnalisés, on retrouve sous Nom : « N° de TVA au format européen » et en valeur ce qui a été encodé dans « Raison sociale », ….
2 février 2015 à 10 h 42 min #983053Voilà qui explique mieux qu’un long discours.
-
AuteurMessages
- Vous devez être connecté pour répondre à ce sujet.