Расширим функционал Woocommerce выбором при оформлении заказа: юр. или физ. лицо. Естественно данный выбор будет влиять на множество аспектов самого процесса заказа и прочих функций WC.
Создание переключателя и полей для организации
Начинаем с того, что создаем поле с переключателем юр. или физ. лица
// Добавление выбора физ. или юр. лицо
add_action( 'woocommerce_before_checkout_billing_form', 'organisation_checkout_field' );
function organisation_checkout_field( $checkout ) {
echo '<div id="organisation_checkout_field">';
woocommerce_form_field( 'organisation', array(
'type' => 'radio',
'class' => array('form-row-wide'),
'label' => '',
'options' => array(
'private_person' => 'Частное лицо',
'company' => 'Организация'
)
), $checkout->get_value( 'organisation' ));
echo '</div>';
}
Создаем поля, которые нужны при выборе юридического лица:
add_action( 'woocommerce_legal_face', 'my_custom_checkout_field_legal_face' );
function my_custom_checkout_field_legal_face( $checkout ) {
$current_user = wp_get_current_user();
$user_id = $current_user->ID;
echo '<div class="woocommerce-organisation-fields__field-wrapper"><h3>Реквизиты организации</h3>';
woocommerce_form_field( 'organisation_name', array(
'required' => true,
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'placeholder' => __('Наименование'),
), get_user_meta( $user_id, 'organisation_name', true ));
woocommerce_form_field( 'organisation_address', array(
'required' => true,
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'placeholder' => __('Адрес организации'),
), get_user_meta( $user_id, 'organisation_address', true ));
woocommerce_form_field( 'organisation_inn', array(
'required' => true,
'type' => 'text',
'class' => array('my-field-class form-row-first'),
'placeholder' => __('ИНН'),
), get_user_meta( $user_id, 'organisation_inn', true ));
woocommerce_form_field( 'organisation_kpp', array(
'required' => true,
'type' => 'text',
'class' => array('my-field-class form-row-last'),
'placeholder' => __('КПП'),
), get_user_meta( $user_id, 'organisation_kpp', true ));
woocommerce_form_field( 'organisation_checking_account', array(
'required' => true,
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'placeholder' => __('Расчетный счет'),
), get_user_meta( $user_id, 'organisation_checking_account', true ));
woocommerce_form_field( 'organisation_bank', array(
'required' => true,
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'placeholder' => __('Банк'),
), get_user_meta( $user_id, 'organisation_bank', true ));
echo '</div>';
}
‘required’ => true — обязательные для заполнения поля. В данной функции прописано автозаполнение полей если есть их значение.
Чтобы вставить поля Реквизиты нужно прописать экшн в шаблоне woocommerce/checkout/form-checkout.php после экшена woocommerce_checkout_billing (к нему самому привязаться не мог, т.к. тога поля выводятся ниже комментария)
<?php do_action( 'woocommerce_legal_face' ); ?>
Прописываем скрипты: один из пунктов выбора по умолчанию и скрытие группы полей Реквизиты, если выбран вариант физ. лицо
// Включить радио кнопку изначально
jQuery(function() {
var $radios = jQuery('input:radio[name=organisation]');
if($radios.is(':checked') === false) {
$radios.filter('[value="private_person"]').prop('checked', true);
}
});
// Скрытие реквизитов
jQuery(document).ready(function($){
$('.woocommerce-organisation-fields__field-wrapper').hide();
$("input[name=organisation]:radio").click(function () {
if ($('input[name=organisation]:checked').val() == "private_person") {
$('.woocommerce-organisation-fields__field-wrapper').hide();
} else if ($('input[name=organisation]:checked').val() == "company") {
$('.woocommerce-organisation-fields__field-wrapper').show();
}
});
});
Функция верификации (заполнены ли обязательные поля). Особенностью функции является вывод предупреждения только в случае если выбрано юр. лицо:
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
$radioVal = $_POST["organisation"];
if($radioVal == "company") {
if ( ! $_POST['organisation_name'] ) wc_add_notice( __( '<strong>Наименование организации</strong> является обязательным полем.' ), 'error' );
if ( ! $_POST['organisation_address'] ) wc_add_notice( __( '<strong>Адрес организации</strong> является обязательным полем.' ), 'error' );
if ( ! $_POST['organisation_inn'] ) wc_add_notice( __( '<strong>ИНН</strong> является обязательным полем.' ), 'error' );
if ( ! $_POST['organisation_kpp'] ) wc_add_notice( __( '<strong>КПП</strong> является обязательным полем.' ), 'error' );
if ( ! $_POST['organisation_checking_account'] ) wc_add_notice( __( '<strong>Расчетный счет</strong> является обязательным полем.' ), 'error' );
if ( ! $_POST['organisation_bank'] ) wc_add_notice( __( '<strong>Банк</strong> является обязательным полем.' ), 'error' );
}
}
Функция сохранения полей. Причем данные поля сохраняем не как order meta, а как user meta.
// Update user 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() {
$current_user = wp_get_current_user();
$user_id = $current_user->ID;
$radioVal = $_POST["organisation"];
if($radioVal == "company") { update_user_meta( $user_id, 'company', 'on' ); } else { delete_user_meta( $user_id, 'company' ); }
if ( ! empty( $_POST['organisation_name'] ) ) { update_user_meta( $user_id, 'organisation_name', sanitize_text_field( $_POST['organisation_name'] ) ); }
if ( ! empty( $_POST['organisation_address'] ) ) { update_user_meta( $user_id, 'organisation_address', sanitize_text_field( $_POST['organisation_address'] ) ); }
if ( ! empty( $_POST['organisation_inn'] ) ) { update_user_meta( $user_id, 'organisation_inn', sanitize_text_field( $_POST['organisation_inn'] ) ); }
if ( ! empty( $_POST['organisation_kpp'] ) ) { update_user_meta( $user_id, 'organisation_kpp', sanitize_text_field( $_POST['organisation_kpp'] ) ); }
if ( ! empty( $_POST['organisation_checking_account'] ) ) { update_user_meta( $user_id, 'organisation_checking_account', sanitize_text_field( $_POST['organisation_checking_account'] ) ); }
if ( ! empty( $_POST['organisation_bank'] ) ) { update_user_meta( $user_id, 'organisation_bank', sanitize_text_field( $_POST['organisation_bank'] ) ); }
}
Также эта функция сохраняет значение поля company (ON) если выбрано юр. лицо и удаляет мета поле company если выбрано физ. лицо. Далее поле company пригодится для проверки при выводе реквизитов.
Вывод полей в различных шаблонах
Выводим поля группы Реквизиты в бланке заказа:
// Вывести реквизиты в бланке заказа
add_action( 'woocommerce_order_details_after_customer_details', 'organisation_checkout_field_echo_in_order' );
function organisation_checkout_field_echo_in_order() {
$current_user = wp_get_current_user();
$user_id = $current_user->ID;
$user_id_company = get_user_meta( $user_id, 'company', 'on' );
if($user_id_company) {
echo '<h2>Реквизиты компании</h2>';
echo 'Наименование: '.get_user_meta( $user_id, 'organisation_name', true ).'<br>';
echo 'Адрес: '.get_user_meta( $user_id, 'organisation_address', true ).'<br>';
echo 'ИНН: '.get_user_meta( $user_id, 'organisation_inn', true ).'<br>';
echo 'КПП: '.get_user_meta( $user_id, 'organisation_kpp', true ).'<br>';
echo 'Расч. счет: '.get_user_meta( $user_id, 'organisation_checking_account', true ).'<br>';
echo 'Банк: '.get_user_meta( $user_id, 'organisation_bank', true );
}
}
Если необходимо вывести в Личном кабинете во вкладке Адреса, то необходимо прописать вышеописанную функцию к новому хуку:
add_action( 'woocommerce_insert_organisation_details', 'organisation_checkout_field_echo_in_order' );
А в шаблоне woocommerce/myaccount/my-address.php прописать вывод этого хука (после foreach):
<?php do_action( 'woocommerce_insert_organisation_details' ); ?>
Вывести реквизиты в адмике (в заказе):
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'organisation_checkout_field_echo_in_admin_order', 10 );
function organisation_checkout_field_echo_in_admin_order() {
$current_user = wp_get_current_user();
$user_id = $current_user->ID;
$user_id_company = get_user_meta( $user_id, 'company', 'on' );
if($user_id_company) {
echo '</div></div><div class="clear"></div>';
echo '<div class="order_data_column_container"><div class="order_data_column_wide">';
echo '<h3>Реквизиты компании</h3>';
echo 'Наименование: '.get_user_meta( $user_id, 'organisation_name', true ).'<br>';
echo 'Адрес: '.get_user_meta( $user_id, 'organisation_address', true ).'<br>';
echo 'ИНН: '.get_user_meta( $user_id, 'organisation_inn', true ).'<br>';
echo 'КПП: '.get_user_meta( $user_id, 'organisation_kpp', true ).'<br>';
echo 'Расч. счет: '.get_user_meta( $user_id, 'organisation_checking_account', true ).'<br>';
echo 'Банк: '.get_user_meta( $user_id, 'organisation_bank', true );
}
}
Вывести реквизиты в бланке писем
add_action( 'woocommerce_email_customer_details', 'woocommerce_email_after_order_table_func', 50 );
function woocommerce_email_after_order_table_func() {
$current_user = wp_get_current_user();
$user_id = $current_user->ID;
$user_id_company = get_user_meta( $user_id, 'company', 'on' );
if($user_id_company) {
?>
<h3>Реквизиты компании</h3>
<table>
<tr>
<td><strong>Наименование: </strong></td>
<td><?php echo wptexturize( get_user_meta( $user_id, 'organisation_name', true ) ); ?></td>
</tr>
<tr>
<td><strong>Адрес: </strong></td>
<td><?php echo wptexturize( get_user_meta( $order_id, 'organisation_address', true ) ); ?></td>
</tr>
<tr>
<td><strong>ИНН: </strong></td>
<td><?php echo wptexturize( get_user_meta( $user_id, 'organisation_inn', true ) ); ?></td>
</tr>
<tr>
<td><strong>КПП: </strong></td>
<td><?php echo wptexturize( get_user_meta( $user_id, 'organisation_kpp', true ) ); ?></td>
</tr>
<tr>
<td><strong>Расч. счет: </strong></td>
<td><?php echo wptexturize( get_user_meta( $order_id, 'organisation_checking_account', true ) ); ?></td>
</tr>
<tr>
<td><strong>Банк: </strong></td>
<td><?php echo wptexturize( get_user_meta( $user_id, 'organisation_bank', true ) ); ?></td>
</tr>
</table>
<?php
}
}
woocommerce_email_after_order_table — будут выводиться перед адресами
woocommerce_email_customer_details — будут выводиться после адресов
Изменить набор методов платежей в зависимости от формы плательщика
Нашел отличное решение и немного его доработал под вышеописанный переключатель
add_filter( 'woocommerce_available_payment_gateways', 'kvk_field_cheque_payment_method', 20, 1);
function kvk_field_cheque_payment_method( $gateways ){
if( !is_admin() ) {
foreach( $gateways as $gateway_id => $gateway ) {
if( WC()->session->get( 'is_company' ) ){
unset( $gateways['cod'] );
} else {
unset( $gateways['bacs'] );
}
}
return $gateways;
}
}
// The WordPress Ajax PHP receiver
add_action( 'wp_ajax_kvk_nummer', 'get_ajax_kvk_nummer' );
add_action( 'wp_ajax_nopriv_kvk_nummer', 'get_ajax_kvk_nummer' );
function get_ajax_kvk_nummer() {
if ( $_POST['organisation'] == 'company' ){
WC()->session->set('is_company', '1');
} else {
WC()->session->set('is_company', '0');
}
die();
}
// The jQuery Ajax request
add_action( 'wp_footer', 'checkout_kvk_fields_script' );
function checkout_kvk_fields_script() {
// Only checkout page
if( is_checkout() && ! is_wc_endpoint_url() ):
// Remove "is_company" custom WC session on load
if( WC()->session->get('is_company') ){
WC()->session->__unset('is_company');
}
?>
<script type="text/javascript">
jQuery( function($){
var a = 'input[name=organisation]';
// Ajax function
function checkKvkNummer( value ){
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'kvk_nummer',
'organisation': $('input[name=organisation]:checked').val(),
//'organisation': value != '' ? 1 : 0, // чредование значений для валидации text или включения checkbox
},
success: function (result) {
$('body').trigger('update_checkout');
}
});
}
// On start
checkKvkNummer($(a).val());
// On change event
$(a).change( function () {
checkKvkNummer($(this).val());
});
});
</script>
<?php
endif;
};
В данном случае при выборе физ. лица пропадает вариант оплаты банковским переводом, а при выборе юр. лица недоступен вариант оплаты наличными.
ID стандартных и популярных методов оплаты:
- bacs — прямой банковский перевод
- cheque — чековые платежи
- cod — оплата при доставке
- paypal — PayPal
- ym_api_bank_card — Банковские карты (через сервис Яндекс Касса)
Удалить стандартные поля банковского перевода
По умолчанию у метода оплаты банковским переводом есть набор полей для заполнения (от магазина), скроем их если они не нужны.
Убрать из шаблонов писем:
// Отключить стандартные поля банковского перевода в шаблоне письма
add_action( 'woocommerce_email_before_order_table', function(){
if ( ! class_exists( 'WC_Payment_Gateways' ) ) return;
$gateways = WC_Payment_Gateways::instance(); // gateway instance
$available_gateways = $gateways->get_available_payment_gateways();
if ( isset( $available_gateways['bacs'] ) )
remove_action( 'woocommerce_email_before_order_table', array( $available_gateways['bacs'], 'email_instructions' ), 10, 3 );
}, 1 );
Убрать из деталей заказа:
// Отключить стандартные поля банковского перевода в шаблоне заказа
add_action( 'init', 'remove_bacs_from_thank_you_page', 100 );
function remove_bacs_from_thank_you_page() {
if ( ! function_exists( 'WC' ) ) { return; } // Bail, if we don't have WC function
$available_gateways = WC()->payment_gateways()->get_available_payment_gateways();
$gateway = isset( $available_gateways['bacs'] ) ? $available_gateways['bacs'] : false;
if ( false == $gateway ) { return; } // We won't do anything if the gateway is not available
remove_action( 'woocommerce_thankyou_bacs', array( $gateway, 'thankyou_page' ) );
}
[site-socialshare]
Благодарю за материал, аналогов в сети не нашел!
Единственное — введенные данные не отображаются в админке в разделе «Пользователи». Почему?
Сделал вывод этих данных только в заказе, но в шаблоне пользователя не делал, достаточно было и так на тот момент. Думаю, что попозже (как будет больше свободного времени) это доработаю, нужно создать еще одну функцию вывода.
Здравствуйте, заранее прошу прощения, если мой вопрос покажется Вам глупым, я только вчера (буквально) начала знакомитьтся с php. Не могли бы Вы мне подсказать, что я делаю не так: после активации этого плагина появляется сообщение «Плагин создал 820 символов неожиданного вывода при активации. Если возникнет ошибка “headers already sent” с RSS-лентами или иные проблемы, то попробуйте деактивировать или удалить этот плагин.» (((
мне кажется, что я неправильно вставляю скрипт:
?>
<script type=»text/javscript»>
// Включить радио кнопку изначально
jQuery(function() {
var $radios = jQuery(‘input:radio[name=organisation]’);
if($radios.is(‘:checked’) === false) {
$radios.filter(‘[value=»private_person»]’).prop(‘checked’, true);
}
});
// Скрытие реквизитов
jQuery(document).ready(function($){
$(‘.woocommerce-organisation-fields__field-wrapper’).hide();
$(«input[name=organisation]:radio»).click(function () {
if ($(‘input[name=organisation]:checked’).val() == «private_person») {
$(‘.woocommerce-organisation-fields__field-wrapper’).hide();
} else if ($(‘input[name=organisation]:checked’).val() == «company») {
$(‘.woocommerce-organisation-fields__field-wrapper’).show();
}
});
});
</script>
Вопрос снят)))
Я рад. Не всегда получается отвечать оперативно. А в чем была проблема вкратце? Может кому то еще будет полезно.
Добрый день! Спасибо за такую полезную статью!
Вопрос: Вывел в Личном кабинете во вкладке Адреса реквизиты. А как изменять реквизиты так же как адреса плательщика и доставки?
Спасибо!
Хороший вопрос. Еще не доработал этот аспект данного функционала. Не уверен что в ближайшее время дойдут до этого руки, но как только сделаю это — результат опубликую.
У Вас ошибка в функции:
Вывести реквизиты в адмике (в заказе):
Эта функция показывает реквизиты текущего пользователя т.е администратора, а не клиента. Т.е данные будут одинаковые на всех заказах.
Исправленный вариант:
Вывести реквизиты в адмике (в заказе):
add_action( ‘woocommerce_admin_order_data_after_shipping_address’, ‘organisation_checkout_field_echo_in_admin_order’, 10 );
function organisation_checkout_field_echo_in_admin_order($order) {
$user_id = $order->get_user_id();
$user_id_company = get_user_meta( $user_id, ‘company’, ‘on’ );
if($user_id_company) {
echo ‘</div></div><div class=»clear»></div>’;
echo ‘<div class=»order_data_column_container»><div class=»order_data_column_wide»>’;
echo ‘<h3>Реквизиты компании</h3>’;
echo ‘Наименование: ‘.get_user_meta( $user_id, ‘organisation_name’, true ).'<br>’;
echo ‘Адрес: ‘.get_user_meta( $user_id, ‘organisation_address’, true ).'<br>’;
echo ‘ИНН: ‘.get_user_meta( $user_id, ‘organisation_inn’, true ).'<br>’;
echo ‘КПП: ‘.get_user_meta( $user_id, ‘organisation_kpp’, true ).'<br>’;
echo ‘Расч. счет: ‘.get_user_meta( $user_id, ‘organisation_checking_account’, true ).'<br>’;
echo ‘Банк: ‘.get_user_meta( $user_id, ‘organisation_bank’, true );
}
}
Спасибо за исправление! Вы правы, лучше брать ID юзера из заказа, а не текущего.
// Добавляем поля в кабинет пользователя в форму «детали учетной записи»
add_action( ‘woocommerce_edit_account_form’, ‘add_favorite_color_to_edit_account_form’ );
function add_favorite_color_to_edit_account_form() {
$current_user = wp_get_current_user();
$user_id = $current_user->ID;
$user_id_company = get_user_meta( $user_id, ‘company’, ‘on’ );
if($user_id_company) {
?>
<input type="text" class="woocommerce-Input woocommerce-Input—text input-text" name="organisation_name" id="organisation_name" value="» />
// …. перечисляем поля по такому же принципу
<?php
}
}
//сохраняем наши поля в кабинете пользователя
add_action( 'woocommerce_save_account_details', 'save_extra_user_form' );
function save_extra_user_form( $customer_id ){
if ( isset( $_POST['organisation_name'] ) ) { update_user_meta( $customer_id, 'organisation_name', $_POST['organisation_name'] ); }
//…. перечисляем все остальные поля по тому же принципу
}
<fieldset>
<legend><?php esc_html_e( ‘Реквизиты компании’, ‘woocommerce’ ); ?></legend>
<p class=»woocommerce-form-row woocommerce-form-row—wide form-row form-row-wide»>
<label for=»organisation_name»><?php _e( ‘Название компании’, ‘woocommerce’ ); ?>
<input type=»text» class=»woocommerce-Input woocommerce-Input—text input-text» name=»organisation_name» id=»organisation_name» value=»<?php echo wptexturize( get_user_meta( $user_id, ‘organisation_name’, true ) ); ?>» />
</p>
Здравствуйте, заранее прошу прощения, если мой вопрос покажется Вам глупым, я только вчера (буквально) начала знакомитьтся с php. Не могли бы Вы мне подсказать, что я делаю не так: после активации этого плагина появляется сообщение «Плагин создал 820 символов неожиданного вывода при активации. Если возникнет ошибка “headers already sent” с RSS-лентами или иные проблемы, то попробуйте деактивировать или удалить этот плагин.» (((мне кажется, что я неправильно вставляю скрипт:
?><script type=»text/javscript»>
// Включить радио кнопку изначальноjQuery(function() { var $radios = jQuery(‘input:radio[name=organisation]’); if($radios.is(‘:checked’) === false) { $radios.filter(‘[value=»private_person»]’).prop(‘checked’, true); }}); // Скрытие реквизитовjQuery(document).ready(function($){$(‘.woocommerce-organisation-fields__field-wrapper’).hide(); $(«input[name=organisation]:radio»).click(function () {if ($(‘input[name=organisation]:checked’).val() == «private_person») {$(‘.woocommerce-organisation-fields__field-wrapper’).hide();} else if ($(‘input[name=organisation]:checked’).val() == «company») {$(‘.woocommerce-organisation-fields__field-wrapper’).show();}});});</script>
Что он сделал????
Скрипты нужно вставлять в файл со скриптами. У Вас в начале кода лишние символы php: ?>.
Спасибо! статья отличная! Но, наверно, нужна доработка в том виде, что при выборе юр лица, поля для физ. лица не должны быть обязательными к заполнению.
Я оставил стандартные поля пользователя как контактного лица. Реквизиты компании это одно но оператор же будет связываться с конкретным человеком.
Долго не мог понять, почему в письме не показываются поля адреса и расч счета. Дело в том, что в get_user_meta указан $order_id, а не user_id
Спасибо за важное уточнение.
А как связать выбор юр или физ с доставкой и оплатой?, что бы при выборе нужного типа плательщика автоматом выбирались необходимые способы доставки и оплаты…
Как раз изменение набора методов оплаты в данном решении описано. До изменения набора вариантов доставки еще не добрался.
Здравствуйте. Спасибо за плагин! Единственное, при изменении набора методов платежей, в зависимости от формы плательщика создается дублирующий запрос.
Query Monitor пишет — Ошибки PHP были вызваны во время запроса Ajax.
Источники вызова:
WC_Data_Store_WP->read_meta — 2 вызова
Потенциальные проблемные места:
WooCommerce->initialize_cart — 1 вызов
WC_Checkout->get_value — 1 вызов
Это вроде не влияет на работу плагина, но как можно исправить? Если вообще это нужно? Спасибо.
Постараюсь разобраться и ответить, но боюсь в ближайшее время у меня это не получится.
Приветствую,
1) Спасибо за плагин и вообще за этот сайт с полезными разработками, от души — спасибо!
2) В «изменении набора методов платежей….», как добавить к Юр тоже оплату наличными, то есть при выборе ФИЗ — только наличными, ЮР — наличными и банковский перевод
P.S. Я просто новичок и только начинаю познавать этот мир))), подскажите пожалуйста.
В Вашем случае, нужно удалить функцию изменения набора методов платежей в зависимости от формы плательщика. Она прописана отдельным абзацем.
Тут еще вот какая проблема образовалась…. не отображает нигде реквизиты, точнее, пару раз показало и то, до момента чистки кэша, вторую ночь пытаюсь разобраться. Ни в админке, ни в бланке заказа (((, тема дочерняя
Я допер, те изменения что внес Иван не меняют проблемы, «Вывести реквизиты в адмике (в заказе):
Эта функция показывает реквизиты текущего пользователя т.е администратора, а не клиента. Т.е данные будут одинаковые на всех заказах.»
Все-равно такая же проблема….
Доработаю со временем.
Вообщем, реквизиты в админке отображаются только у зарегистрированных пользователей….
Как сделать так, что бы они отображались в любом случае у заказа?
Ну логика же правильная — отображать реквизиты только у зарегистрированных пользователей. И если пользователь не зарегистрирован, как он вообще может попасть в админку?
Тааакс…. возможно я чего недопонимаю, но разве не из под админки — заказы необходимо управлять этими заказами?, мне необходимо видеть реквизиты покупателей, работаю в основном с юриками….
Все правильно, заказами нужно управлять через админку. Если сейчас реквизиты клиентов выводятся неправильно — нужно исправлять функции. Сейчас заниматься этим времени нет, но как будет время — доработаю.
Как просматривать реквизиты от незарегистрированных пользователей ?
Если пользователь не зарегистрирован и не сделал ни одного заказа (автоматическая регистрация при заказе), то каким образом его реквизиты сохраняться (чтобы их просматривать)?
Здравствуйте. А не подскажите, как можно переработать, чтобы работало при заказе без регистрации? Как вы писали выше, «автоматическая регистрация при заказе», не планируется, регистрация не планируется вообще, а ваш метод решения вопроса очень понравился, только бы сделать его для гостей (стандартные данные типа «имя» «фамилия» «адрес» передаются и в заказе есть, можно также передать и эти дополнительные данные, но без регистрации?)
Подскажите все таки как сделать , чтобы некоторые поля физ.лица скрывались при выборе юр.лица ?
Скрытие стандартных полей «на лету» довольно муторная задача. Я использовал такой вариант (после подзаголовка «Отключение платежного адреса при Самовывозе»). Адаптируйте его под свои нужны, изменив триггер скрипта и необходимые для скрытия поля. Вариант конечно далеко не совершенный.
Для таких же горемык как я. Чтобы информация о реквизитах Юр. лица сохранялась у не зареганного пользователя можно доавить мета-инфомацию прямо в заказ.
Соответственно будем хранить реквизиты и у пользователя и в заказе, что выстрелит. Наверно, можно доделать функцию, чтобы проверять регистрируется ли пользователь и в зависимости от этого сохранять в нужную сущность
Я на php не пишу, но у меня заработал такой код:
add_action(‘woocommerce_checkout_update_order_meta’, ‘my_custom_checkout_field_update_order_meta’);
function my_custom_checkout_field_update_order_meta($order_id)
{
$current_user = wp_get_current_user();
$user_id = $current_user->ID;
$order = wc_get_order( $order_id );
$radioVal = $_POST[«organisation»];
if ($radioVal == «company») {
update_user_meta($user_id, ‘company’, ‘on’);
$order->update_meta_data( ‘company’, ‘on’ );
} else {
delete_user_meta($user_id, ‘company’);
delete_post_meta($order_id, ‘company’);
}
if (!empty($_POST[‘organisation_name’])) {
$organisation_name = sanitize_text_field($_POST[‘organisation_name’]);
update_user_meta($user_id, ‘organisation_name’, $organisation_name );
$order->update_meta_data( ‘organisation_name’, $organisation_name );
}
if (!empty($_POST[‘organisation_address’])) {
$organisation_address = sanitize_text_field($_POST[‘organisation_address’]);
update_user_meta($user_id, ‘organisation_address’, $organisation_address );
$order->update_meta_data( ‘organisation_address’, $organisation_address );
}
if (!empty($_POST[‘organisation_inn’])) {
$organisation_inn = sanitize_text_field($_POST[‘organisation_inn’]);
update_user_meta($user_id, ‘organisation_inn’, $organisation_inn );
$order->update_meta_data( ‘organisation_inn’, $organisation_inn );
}
if (!empty($_POST[‘organisation_kpp’])) {
$organisation_kpp = sanitize_text_field($_POST[‘organisation_kpp’]);
update_user_meta($user_id, ‘organisation_kpp’, $organisation_kpp );
$order->update_meta_data( ‘organisation_kpp’, $organisation_kpp );
}
if (!empty($_POST[‘organisation_checking_account’])) {
$organisation_checking_account = sanitize_text_field($_POST[‘organisation_checking_account’]);
update_user_meta($user_id, ‘organisation_checking_account’, $organisation_checking_account );
$order->update_meta_data( ‘organisation_checking_account’, $organisation_checking_account );
}
if (!empty($_POST[‘organisation_bank’])) {
$organisation_bank = sanitize_text_field($_POST[‘organisation_bank’])
update_user_meta($user_id, ‘organisation_bank’, $organisation_bank );
$order->update_meta_data( ‘organisation_bank’, $organisation_bank );
}
$order->save();
}
Спасибо за ценное дополнение.
Здравствуйте никак не могу разобраться. Как можно отключить проверку полей физ лица , если пользователь заполняет раздела юр лица ? Просто в случае с физ лицом происходит нормальное оформление заказа . А при выборе юр лица , обязательно всплывают так же ошибки физ лица.
Дело в том что у меня во вкладке юр лица как раз таки присутствует поле с номером и именем константного лица. Хотелось бы что бы эти разделы были независимые друг от друга.
Может кому поможет моё не совсем изящное решение. Но я решил это так. Поля которые стандартные нужно убрать проверку на заполненность, которую вешает вукомерц. Делается это так :
add_filter( ‘woocommerce_checkout_fields’ , ‘unset_checkout_fields’ );
function unset_checkout_fields( $fields ) {
unset($fields[‘billing’][‘billing_first_name’][‘required’]);
unset($fields[‘billing’][‘billing_last_name’][‘required’]);
unset($fields[‘billing’][‘billing_phone’][‘required’]);
unset($fields[‘billing’][‘billing_email’][‘required’]);
return $fields;
}
Затем немного дописать функцию там где мы выводили сообщение об ошибке при выборе радиобаттоном :
add_action(‘woocommerce_checkout_process’, ‘my_custom_checkout_field_process’);
function my_custom_checkout_field_process() {
$radioVal = $_POST[«organisation»];
if($radioVal == «company») {
if ( ! $_POST[‘organisation_nip’] ) wc_add_notice( __( ‘<strong>Наименование организации</strong> является обязательным полем.’ ), ‘error’ );
if ( ! $_POST[‘organisation_name’] ) wc_add_notice( __( ‘<strong>Адрес организации</strong> является обязательным полем.’ ), ‘error’ );
if ( ! $_POST[‘organisation_address’] ) wc_add_notice( __( ‘<strong>ИНН</strong> является обязательным полем.’ ), ‘error’ );
if ( ! $_POST[‘organisation_phone’] ) wc_add_notice( __( ‘<strong>КПП</strong> является обязательным полем.’ ), ‘error’ );
if ( ! $_POST[‘organisation_email’] ) wc_add_notice( __( ‘<strong>Расчетный счет</strong> является обязательным полем.’ ), ‘error’ );
} else if ($radioVal == «private_person») {
if ( ! $_POST[‘billling_first_name’] ) wc_add_notice( __( ‘<strong>Ваше имя</strong> является обязательным полем.’ ), ‘error’ );
if ( ! $_POST[‘billling_last_name’] ) wc_add_notice( __( ‘<strong>Ваша фамилия</strong> является обязательным полем.’ ), ‘error’ );
if ( ! $_POST[‘billling_phone’] ) wc_add_notice( __( ‘<strong>Контактный телефон</strong> является обязательным полем.’ ), ‘error’ );
if ( ! $_POST[‘billling_email’] ) wc_add_notice( __( ‘<strong>Ваш email</strong> является обязательным полем.’ ), ‘error’ );
}
}
Стоит так же заметить маленькую деталь , над которой я немного завис , следует обязательно указать второе условие нажатия на радиобаттон , так как если вставить наши изменения просто после первого условия. То наши нововведения будут применятс как и при выборе физ лица так и юр лица.
Возможно есть какое то более изящное решение ? Буду рад Вашим советам. Огромное спасибо за отличную информацию. Много чего нет в свободном доступе. А здесь я нашёл решения для своих проектов.
Спасибо за отзыв и полезные дополнения. В ближайшее время вернусь к этому решению и буду отвечать на комментарии и дорабатывать функционал.
Здравствуйте, подскажите, пожалуйста, как правильно подключить этот скрипт ( куда вставлять или что создать? ) Никак не могу разобраться …
// Включить радио кнопку изначально
jQuery(function() {
var $radios = jQuery('input:radio[name=organisation]');
if($radios.is(':checked') === false) {
$radios.filter('[value="private_person"]').prop('checked', true);
}
});
// Скрытие реквизитов
jQuery(document).ready(function($){
$('.woocommerce-organisation-fields__field-wrapper').hide();
$("input[name=organisation]:radio").click(function () {
if ($('input[name=organisation]:checked').val() == "private_person") {
$('.woocommerce-organisation-fields__field-wrapper').hide();
} else if ($('input[name=organisation]:checked').val() == "company") {
$('.woocommerce-organisation-fields__field-wrapper').show();
}
});
});
Спасибо автору за доработку плагина. Если честно мне было сложно понять куда и что вставлять, но поковырявшись я понял. Всё это достояние нужно вставлять в код для functions.php вашей текущей / дочерней темы. А файл скрипта прописать вот так вот, ответ для Дмитрия, и вставить туда же. У меня все заработало.
function wpschool_javascript_in_header() {
?>
<script>
// Включить радио кнопку изначально
jQuery(function() {
var $radios = jQuery(‘input:radio[name=organisation]’);
if($radios.is(‘:checked’) === false) {
$radios.filter(‘[value=»private_person»]’).prop(‘checked’, true);
}
});
// Скрытие реквизитов
jQuery(document).ready(function($){
$(‘.woocommerce-organisation-fields__field-wrapper’).hide();
$(«input[name=organisation]:radio»).click(function () {
if ($(‘input[name=organisation]:checked’).val() == «private_person») {
$(‘.woocommerce-organisation-fields__field-wrapper’).hide();
} else if ($(‘input[name=organisation]:checked’).val() == «company») {
$(‘.woocommerce-organisation-fields__field-wrapper’).show();
}
});
});
</script>
<?php
}
add_action( ‘wp_head’, ‘wpschool_javascript_in_header’ );
А как сделать эти поля в форме регистрации?
Всем привет.Не совсем корректно работает функция вывода реквизитов.
У разных пользователей должна быть разные реквизиты
Замените такие строки на такие
function woocommerce_email_after_order_table_func() {
$current_user = wp_get_current_user();
$user_id = $current_user->ID;
function woocommerce_email_after_order_table_func($post_id) {
$order = wc_get_order( $post_id );
$user_id = $order->get_customer_id();
Нужно правильно обращаеться к клиенту заказа. А на текущему пользователю.
Уверен что Вы правы. Данное решение прорабатывал довольно давно, и с тех пор мало где его применял.
Доработаю код данного функционала и обновлю статью. Спасибо за Ваш комментарий!
Спасибо большое, очень выручила Ваша статья!