You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
398 lines
17 KiB
398 lines
17 KiB
<?php
|
|
|
|
add_action( 'wp_enqueue_scripts', 'enqueue_custom_checkout_scripts' );
|
|
|
|
function enqueue_custom_checkout_scripts() {
|
|
|
|
if ( is_checkout() ) {
|
|
wp_enqueue_script( 'custom-checkout-update', get_stylesheet_directory_uri() . '/gp-include/assets/checkout/js/script.js?v=1.51');
|
|
}
|
|
}
|
|
|
|
|
|
add_filter( 'woocommerce_cart_needs_shipping_address', '__return_false' );
|
|
add_filter( 'woocommerce_shipping_calculator_enable_postcode', '__return_false' );
|
|
add_filter( 'woocommerce_shipping_calculator_enable_city', '__return_false' );
|
|
add_filter( 'woocommerce_shipping_calculator_enable_state', '__return_false' );
|
|
add_filter( 'woocommerce_shipping_packages', 'display_all_shipping_methods' );
|
|
|
|
function display_all_shipping_methods( $packages ) {
|
|
foreach ( $packages as &$package ) {
|
|
// Убираем ограничения по адресу
|
|
$package['destination']['country'] = '';
|
|
$package['destination']['state'] = '';
|
|
$package['destination']['postcode'] = '';
|
|
$package['destination']['city'] = '';
|
|
}
|
|
return $packages;
|
|
}
|
|
|
|
|
|
add_filter( 'woocommerce_checkout_fields', 'customize_billing_fields' );
|
|
|
|
function customize_billing_fields( $fields ) {
|
|
// Удаляем все стандартные поля
|
|
unset( $fields['billing']['billing_company'] );
|
|
unset( $fields['billing']['billing_country'] );
|
|
unset( $fields['billing']['billing_address_1'] );
|
|
unset( $fields['billing']['billing_address_2'] );
|
|
unset( $fields['billing']['billing_city'] );
|
|
unset( $fields['billing']['billing_state'] );
|
|
unset( $fields['billing']['billing_postcode'] );
|
|
// unset( $fields['billing']['billing_last_name'] );
|
|
// Перенастраиваем только нужные поля
|
|
$fields['billing']['billing_first_name'] = array(
|
|
'type' => 'text',
|
|
'label' => __('First Name', 'woocommerce'),
|
|
'placeholder' => __('', 'woocommerce'),
|
|
'required' => true,
|
|
'class' => array('form-row-wide'),
|
|
'priority' => 10,
|
|
);
|
|
$fields['billing']['billing_last_name'] = array(
|
|
'type' => 'text',
|
|
'label' => __('Last Name', 'woocommerce'),
|
|
'placeholder' => __('', 'woocommerce'),
|
|
'required' => true,
|
|
'class' => array('form-row-wide'),
|
|
'priority' => 10,
|
|
);
|
|
$fields['billing']['billing_email'] = array(
|
|
'type' => 'email',
|
|
'label' => __('E-mail', 'woocommerce'),
|
|
'placeholder' => __('', 'woocommerce'),
|
|
'required' => true,
|
|
'class' => array('form-row-wide'),
|
|
'priority' => 20,
|
|
);
|
|
$fields['billing']['billing_phone'] = array(
|
|
'type' => 'tel',
|
|
'label' => __('Phone', 'woocommerce'),
|
|
'placeholder' => __('', 'woocommerce'),
|
|
'required' => true,
|
|
'class' => array('form-row-wide'),
|
|
'priority' => 30,
|
|
);
|
|
// $fields['billing']['billing_state'] = array(
|
|
// 'type' => 'text',
|
|
// 'label' => __('Район/область', 'woocommerce'),
|
|
// 'placeholder' => __('Район/область', 'woocommerce'),
|
|
// 'required' => true,
|
|
// 'class' => array('form-row-wide'),
|
|
// 'priority' => 40,
|
|
// );
|
|
$fields['billing']['billing_postcode'] = array(
|
|
'type' => 'text',
|
|
'label' => __('Postcode', 'woocommerce'),
|
|
'placeholder' => __('', 'woocommerce'),
|
|
'required' => true,
|
|
'class' => array('form-row-wide'),
|
|
'priority' => 40,
|
|
);
|
|
$fields['billing']['billing_city'] = array(
|
|
'type' => 'text',
|
|
'label' => __('Town/City', 'woocommerce'),
|
|
'placeholder' => __('', 'woocommerce'),
|
|
'required' => true,
|
|
'class' => array('form-row-wide'),
|
|
'priority' => 40,
|
|
);
|
|
|
|
$fields['billing']['billing_address_1'] = array(
|
|
'type' => 'text',
|
|
'label' => __('House number and street name', 'woocommerce'),
|
|
'placeholder' => __('House number and street name', 'woocommerce'),
|
|
'required' => false,
|
|
'class' => array('form-row-wide'),
|
|
'priority' => 40,
|
|
);
|
|
$fields['billing']['billing_address_2'] = array(
|
|
'type' => 'text',
|
|
'label' => __('Apartment, suite, unit, etc. (optional)', 'woocommerce'),
|
|
'placeholder' => __('Apartment, suite, unit, etc. (optional)', 'woocommerce'),
|
|
'required' => false,
|
|
'class' => array('form-row-wide'),
|
|
'priority' => 40,
|
|
);
|
|
|
|
return $fields;
|
|
}
|
|
// remove_action( 'woocommerce_review_order_before_payment', 'woocommerce_review_order_shipping' );
|
|
|
|
add_action( 'init', function() {
|
|
update_option( 'woocommerce_enable_coupons', 'yes' ); // Включение купонов
|
|
} );
|
|
|
|
add_action( 'wp_ajax_apply_coupon', 'custom_apply_coupon' );
|
|
add_action( 'wp_ajax_nopriv_apply_coupon', 'custom_apply_coupon' );
|
|
|
|
function custom_apply_coupon() {
|
|
$coupon_code = isset( $_POST['coupon_code'] ) ? sanitize_text_field( $_POST['coupon_code'] ) : '';
|
|
|
|
if ( empty( $coupon_code ) ) {
|
|
wp_send_json_error( array( 'message' => 'Код купона не указан.' ) );
|
|
}
|
|
|
|
// Применение купона
|
|
$applied = WC()->cart->apply_coupon( $coupon_code );
|
|
|
|
if ( $applied ) {
|
|
wp_send_json_success();
|
|
} else {
|
|
wp_send_json_error( array( 'message' => 'Купон не применён. Проверьте код.' ) );
|
|
}
|
|
}
|
|
|
|
|
|
add_filter( 'woocommerce_available_payment_gateways', 'set_default_payment_gateway' );
|
|
|
|
function set_default_payment_gateway( $available_gateways ) {
|
|
if ( is_cart() || is_checkout() ) {
|
|
// Устанавливаем способ оплаты по умолчанию
|
|
$default_payment_gateway = 'tbank'; // ID способа оплаты, например 'cod' для "наличными при доставке"
|
|
|
|
// Проверяем, доступен ли этот способ оплаты
|
|
if ( isset( $available_gateways[ $default_payment_gateway ] ) ) {
|
|
foreach ( $available_gateways as $gateway_id => $gateway ) {
|
|
// Оставляем только выбранный способ оплаты
|
|
if ( $gateway_id !== $default_payment_gateway ) {
|
|
unset( $available_gateways[ $gateway_id ] );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $available_gateways;
|
|
}
|
|
add_filter( 'woocommerce_checkout_terms_and_conditions_checkbox_enabled', '__return_false' );
|
|
add_filter( 'woocommerce_checkout_terms_is_required', '__return_false' );
|
|
remove_action( 'woocommerce_checkout_before_terms_and_conditions', 'wc_checkout_privacy_policy_text', 20 );
|
|
remove_action( 'woocommerce_checkout_terms_and_conditions', 'wc_terms_and_conditions_page_content', 30 );
|
|
remove_action( 'woocommerce_checkout_after_terms_and_conditions', 'wc_privacy_policy_text', 20 );
|
|
|
|
add_action( 'woocommerce_checkout_process', 'remove_terms_validation' );
|
|
|
|
function remove_terms_validation() {
|
|
remove_action( 'woocommerce_checkout_process', 'woocommerce_checkout_terms_and_conditions' );
|
|
}
|
|
|
|
add_filter( 'woocommerce_order_button_html', 'custom_checkout_button_classes' );
|
|
|
|
function custom_checkout_button_classes( $button ) {
|
|
// Заменяем стандартные классы
|
|
$button = '<div class="order-your-calculation__submit">
|
|
<button type="submit" class="button alt button--gradient button--high button--100-perc" name="woocommerce_checkout_place_order" id="place_order" value="Place order" data-value="Place order"><span>Place order</span></button>
|
|
</div>';
|
|
return $button;
|
|
|
|
|
|
|
|
}
|
|
|
|
/*
|
|
add_filter( 'woocommerce_checkout_fields', 'customize_checkout_registration_fields' );
|
|
|
|
function customize_checkout_registration_fields( $fields ) {
|
|
// Убираем поле ввода пароля
|
|
unset( $fields['account']['account_password'] );
|
|
|
|
return $fields;
|
|
}
|
|
*/
|
|
|
|
// Автоматическая генерация пароля
|
|
add_filter( 'woocommerce_checkout_posted_data', 'generate_password_for_registration' );
|
|
|
|
function generate_password_for_registration( $data ) {
|
|
|
|
|
|
$billing_first_name = isset( $_POST['billing_first_name'] ) ? sanitize_text_field( $_POST['billing_first_name'] ) : '';
|
|
$billing_last_name = isset( $_POST['billing_last_name'] ) ? sanitize_text_field( $_POST['billing_last_name'] ) : '';
|
|
$billing_address_1 = isset( $_POST['billing_address_1'] ) ? sanitize_text_field( $_POST['billing_address_1'] ) : '';
|
|
$billing_address_2 = isset( $_POST['billing_address_2'] ) ? sanitize_text_field( $_POST['billing_address_2'] ) : '';
|
|
$billing_city = isset( $_POST['billing_city'] ) ? sanitize_text_field( $_POST['billing_city'] ) : '';
|
|
$billing_postcode = isset( $_POST['billing_postcode'] ) ? sanitize_text_field( $_POST['billing_postcode'] ) : '';
|
|
$billing_country = isset( $_POST['billing_country'] ) ? sanitize_text_field( $_POST['billing_country'] ) : '';
|
|
$billing_state = isset( $_POST['billing_state'] ) ? sanitize_text_field( $_POST['billing_state'] ) : '';
|
|
$billing_phone = isset( $_POST['billing_phone'] ) ? sanitize_text_field( $_POST['billing_phone'] ) : '';
|
|
$billing_email = isset( $_POST['billing_email'] ) ? sanitize_email( $_POST['billing_email'] ) : '';
|
|
|
|
|
|
$data['shipping_first_name'] = $data['billing_first_name'];
|
|
$data['shipping_last_name'] = $data['billing_last_name'];
|
|
$data['shipping_address_1'] = $data['billing_address_1'] . $data['billing_address_2'];
|
|
$data['shipping_city'] = $data['billing_city'];
|
|
$data['shipping_postcode'] = $data['billing_postcode'];
|
|
$data['shipping_country'] = $data['billing_country'];
|
|
$data['shipping_state'] = $data['billing_state'];
|
|
|
|
|
|
|
|
return $data;
|
|
}
|
|
|
|
|
|
function handle_user_registration_on_checkout() {
|
|
// Получаем данные из POST-запроса
|
|
if ( isset( $_POST['billing_email'] ) && isset( $_POST['reg'] )) {
|
|
if ($_POST['reg'] == '1'){
|
|
|
|
|
|
$email = sanitize_email( $_POST['billing_email'] );
|
|
$pass = sanitize_text_field( $_POST['pass'] );
|
|
|
|
// Регистрация пользователя
|
|
$user_id = custom_register_user_from_post( $email, $pass );
|
|
|
|
if ( is_wp_error( $user_id ) ) {
|
|
// Если email уже существует, выводим ошибку
|
|
wc_add_notice( $user_id->get_error_message(), 'error' );
|
|
} else {
|
|
|
|
wp_set_current_user( $user_id ); // Устанавливаем текущего пользователя
|
|
wp_set_auth_cookie( $user_id ); // Устанавливаем куки для авторизации
|
|
do_action( 'wp_login', $email, $user ); // Событие входа в систему
|
|
|
|
}}
|
|
|
|
}
|
|
}
|
|
add_action( 'woocommerce_checkout_process', 'handle_user_registration_on_checkout' );
|
|
|
|
|
|
function custom_register_user_from_post( $email, $pass ) {
|
|
// Проверяем, есть ли уже пользователь с таким email
|
|
if ( email_exists( $email ) ) {
|
|
return new WP_Error( 'email_exists', 'Этот email уже зарегистрирован.' );
|
|
}
|
|
|
|
// Создаем пользователя в WordPress
|
|
$user_id = wp_create_user( $email, $pass, $email );
|
|
if ( is_wp_error( $user_id ) ) {
|
|
return $user_id; // Возвращаем ошибку, если не удалось создать пользователя
|
|
}
|
|
|
|
update_user_meta( $user_id, 'billing_email', $email ); // Устанавливаем email
|
|
update_user_meta( $user_id, 'user_email', $email ); // Устанавливаем email для входа
|
|
|
|
// Устанавливаем роль пользователя как 'customer' для WooCommerce
|
|
$user = new WP_User( $user_id );
|
|
$user->set_role( 'customer' );
|
|
return $user_id;
|
|
}
|
|
|
|
|
|
add_filter( 'woocommerce_form_field', 'add_error_containers_to_checkout_fields', 10, 4 );
|
|
|
|
function add_error_containers_to_checkout_fields( $field, $key, $args, $value ) {
|
|
if ( is_checkout() ) {
|
|
// Добавляем контейнер для ошибок под полем
|
|
$error_container = '<div id="' . esc_attr( $key ) . '-error" class="form-input__error"></div>';
|
|
$field .= $error_container;
|
|
}
|
|
return $field;
|
|
}
|
|
|
|
add_filter( 'woocommerce_add_error', 'remove_payments_word_from_errors_multilang' );
|
|
|
|
function remove_payments_word_from_errors_multilang( $error ) {
|
|
// Слова для удаления в разных языках
|
|
$translations = array(
|
|
'Платежи', // Русский
|
|
'Billing', // Английский
|
|
);
|
|
|
|
foreach ( $translations as $word ) {
|
|
$error = str_replace( $word, '', $error );
|
|
}
|
|
|
|
return trim( $error );
|
|
}
|
|
|
|
|
|
add_action( 'woocommerce_checkout_process', 'validate_phone_field_with_li_data_id' );
|
|
|
|
function validate_phone_field_with_li_data_id() {
|
|
// Получаем значение телефона из формы
|
|
$phone = isset( $_POST['billing_phone'] ) ? sanitize_text_field( $_POST['billing_phone'] ) : '';
|
|
|
|
// Проверяем формат телефона
|
|
if ( ! preg_match( '/^\+?[0-9\s\-\(\)]+$/', $phone ) ) {
|
|
wc_add_notice( 'phone_err', 'error', 'billing_phone' );
|
|
}
|
|
}
|
|
|
|
add_action( 'woocommerce_checkout_process', 'make_address_required_for_specific_shipping' );
|
|
|
|
function make_address_required_for_specific_shipping() {
|
|
// Получаем выбранный метод доставки
|
|
$chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );
|
|
$chosen_shipping = isset( $chosen_shipping_methods[0] ) ? $chosen_shipping_methods[0] : '';
|
|
|
|
// Проверяем, выбран ли метод доставки "official_cdek:137"
|
|
if ( $chosen_shipping === 'official_cdek:137' ) {
|
|
// Проверяем, заполнен ли адрес
|
|
if ( empty( $_POST['billing_address_1'] ) ) {
|
|
wc_add_notice('adress_error', 'error' );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
function auto_fill_shipping_fields_from_billing( $order_id ) {
|
|
// Получаем объект заказа
|
|
$order = wc_get_order( $order_id );
|
|
|
|
if ( ! $order ) {
|
|
return; // Если заказ недоступен, выходим
|
|
}
|
|
|
|
// Получаем значения полей billing из глобального $_POST
|
|
$billing_first_name = isset( $_POST['billing_first_name'] ) ? sanitize_text_field( $_POST['billing_first_name'] ) : '';
|
|
$billing_last_name = isset( $_POST['billing_last_name'] ) ? sanitize_text_field( $_POST['billing_last_name'] ) : '';
|
|
$billing_address_1 = isset( $_POST['billing_address_1'] ) ? sanitize_text_field( $_POST['billing_address_1'] ) : '';
|
|
$billing_address_2 = isset( $_POST['billing_address_2'] ) ? sanitize_text_field( $_POST['billing_address_2'] ) : '';
|
|
$billing_city = isset( $_POST['billing_city'] ) ? sanitize_text_field( $_POST['billing_city'] ) : '';
|
|
$billing_postcode = isset( $_POST['billing_postcode'] ) ? sanitize_text_field( $_POST['billing_postcode'] ) : '';
|
|
$billing_country = isset( $_POST['billing_country'] ) ? sanitize_text_field( $_POST['billing_country'] ) : '';
|
|
$billing_state = isset( $_POST['billing_state'] ) ? sanitize_text_field( $_POST['billing_state'] ) : '';
|
|
$billing_phone = isset( $_POST['billing_phone'] ) ? sanitize_text_field( $_POST['billing_phone'] ) : '';
|
|
$billing_email = isset( $_POST['billing_email'] ) ? sanitize_email( $_POST['billing_email'] ) : '';
|
|
|
|
// Копируем данные в поля доставки
|
|
$order->set_shipping_first_name( $billing_first_name );
|
|
$order->set_shipping_last_name( $billing_last_name );
|
|
$order->set_shipping_address_1( $billing_address_1 );
|
|
$order->set_shipping_address_2( $billing_address_2 );
|
|
$order->set_shipping_city( $billing_city );
|
|
$order->set_shipping_postcode( $billing_postcode );
|
|
$order->set_shipping_country( $billing_country );
|
|
$order->set_shipping_state( $billing_state );
|
|
|
|
// Сохраняем изменения в заказе
|
|
$order->save();
|
|
}
|
|
|
|
|
|
|
|
// function custom_checkout_fields( $fields ) {
|
|
// // Проверяем, находимся ли мы на странице регистрации
|
|
// if ( isset( $_POST['createaccount'] ) && $_POST['createaccount'] == '1' ) {
|
|
// // Сделать поле телефона необязательным на этапе регистрации
|
|
// $fields['billing']['billing_phone']['required'] = false;
|
|
// } else {
|
|
// // Убедиться, что поле телефона обязательно при оформлении заказа
|
|
// $fields['billing']['billing_phone']['required'] = true;
|
|
// }
|
|
|
|
// return $fields;
|
|
// }
|
|
// add_filter( 'woocommerce_checkout_fields', 'custom_checkout_fields' );
|
|
//remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10 );
|
|
add_filter( 'woocommerce_coupons_enabled', 'coupon_field_on_checkout' );
|
|
function coupon_field_on_checkout( $enabled ) {
|
|
return false;
|
|
|
|
} |