/ Плагины / Юр. или физ. лицо при оформлении

Юр. или физ. лицо при оформлении

HIT

09.03.2019

140914

48

Расширим функционал 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' ) );
}

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Специфический раздел товаров

Специфический раздел товаров

Создадим специфический раздел товаров, который отличается от основного и версткой и частично функционал. Предположим что компания занимается продажей товаров, но при это проводит платные семинары по работе с товарами компании. Читать далее »

Подкатегория за подкатегорией

Подкатегория за подкатегорией

В одной из ранних статей мы отдельно от основного вывода WC выводили подкатегории. В этой статье мы усложним код вывода категорий и сделаем у категорий и вывод товаров. Это даст Читать далее »

Настройка полей заказчика

Настройка полей заказчика

При заказе товара необходимо заполнить данные покупателя (имя, телефон, адрес доставки и т.д.). В стандартном варианте поля эти несколько «раздуты», много лишнего, требуется некоторое оформление. Можно использовать плагин Saphali Woocommerce Читать далее »

/

Добавить комментарий

48 комментариев

  1. Павел

    Благодарю за материал, аналогов в сети не нашел!
    Единственное — введенные данные не отображаются в админке в разделе «Пользователи». Почему?

    1. Alexandr

      Сделал вывод этих данных только в заказе, но в шаблоне пользователя не делал, достаточно было и так на тот момент. Думаю, что попозже (как будет больше свободного времени) это доработаю, нужно создать еще одну функцию вывода.

  2. Инна

    Здравствуйте,  заранее прошу прощения, если мой вопрос покажется Вам глупым, я только вчера (буквально) начала знакомитьтся с 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>
     

  3. Инна

    Вопрос снят)))

    1. Alexandr

      Я рад. Не всегда получается отвечать оперативно. А в чем была проблема вкратце? Может кому то еще будет полезно.

  4. Иван

    Добрый день! Спасибо за такую полезную статью! 
    Вопрос: Вывел в Личном кабинете во вкладке Адреса реквизиты. А как изменять реквизиты так же как адреса плательщика и доставки?
    Спасибо!

    1. Alexandr

      Хороший вопрос. Еще не доработал этот аспект данного функционала. Не уверен что в ближайшее время дойдут до этого руки, но как только сделаю это — результат опубликую.

  5. Иван

     У Вас ошибка в функции:
    Вывести реквизиты в адмике (в заказе):
    Эта функция показывает реквизиты текущего пользователя т.е администратора, а не клиента. Т.е данные будут одинаковые на всех заказах.

  6. Иван

    Исправленный вариант:
    Вывести реквизиты в адмике (в заказе):
    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 );
    }
    }

    1. Alexandr

      Спасибо за исправление! Вы правы, лучше брать ID юзера из заказа, а не текущего.

  7. Иван

    // Добавляем поля в кабинет пользователя в форму «детали учетной записи»

    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'] ); }
    //…. перечисляем все остальные поля по тому же принципу

    }

  8. Иван

    <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>

  9. Алексей

    Здравствуйте,  заранее прошу прощения, если мой вопрос покажется Вам глупым, я только вчера (буквально) начала знакомитьтся с 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>
     

    Что он сделал????

    1. Alexandr

      Скрипты нужно вставлять в файл со скриптами. У Вас в начале кода лишние символы php: ?>.

  10. Владислав

    Спасибо! статья отличная! Но, наверно, нужна доработка в том виде, что при выборе юр лица, поля для физ. лица не должны быть обязательными к заполнению. 

    1. Alexandr

      Я оставил стандартные поля пользователя как контактного лица. Реквизиты компании это одно но оператор же будет связываться с конкретным человеком.

  11. Владислав

    Долго не мог понять, почему в письме не показываются поля адреса и расч счета. Дело в том, что в get_user_meta указан $order_id, а не user_id

    1. Alexandr

      Спасибо за важное уточнение.

  12. Алеша

    А как связать выбор юр или физ с доставкой и оплатой?, что бы при выборе нужного типа плательщика автоматом выбирались необходимые способы доставки и оплаты…

    1. Alexandr

      Как раз изменение набора методов оплаты в данном решении описано. До изменения набора вариантов доставки еще не добрался.

  13. Егор

    Здравствуйте. Спасибо за плагин! Единственное, при изменении набора методов платежей, в зависимости от формы плательщика создается дублирующий запрос.
    Query Monitor пишет — Ошибки PHP были вызваны во время запроса Ajax.
    Источники вызова:
    WC_Data_Store_WP->read_meta — 2 вызова
    Потенциальные проблемные места:
    WooCommerce->initialize_cart — 1 вызов
    WC_Checkout->get_value — 1 вызов
    Это вроде не влияет на работу плагина, но как можно исправить? Если вообще это нужно?  Спасибо.

    1. Alexandr

      Постараюсь разобраться и ответить, но боюсь в ближайшее время у меня это не получится.

  14. hippy

    Приветствую, 
    1) Спасибо за плагин и вообще за этот сайт с полезными разработками, от души — спасибо!
    2) В «изменении набора методов платежей….», как добавить к Юр тоже оплату наличными, то есть при выборе ФИЗ — только наличными, ЮР — наличными и банковский перевод
    P.S. Я просто новичок и только начинаю познавать этот мир))), подскажите пожалуйста. 

    1. Alexandr

      В Вашем случае, нужно удалить функцию изменения набора методов платежей в зависимости от формы плательщика. Она прописана отдельным абзацем.

  15. hippy

    Тут еще вот какая проблема образовалась…. не отображает нигде реквизиты, точнее, пару раз показало и то, до момента чистки кэша, вторую ночь пытаюсь разобраться. Ни в админке, ни в бланке заказа (((, тема дочерняя

  16. hippy

    Я допер, те изменения что внес Иван не меняют проблемы, «Вывести реквизиты в адмике (в заказе):
    Эта функция показывает реквизиты текущего пользователя т.е администратора, а не клиента. Т.е данные будут одинаковые на всех заказах.»
     Все-равно такая же проблема…. 

    1. Alexandr

      Доработаю со временем.

  17. hippy

    Вообщем, реквизиты в админке отображаются только у зарегистрированных пользователей….
    Как сделать так, что бы они отображались в любом случае у заказа?

    1. Alexandr

      Ну логика же правильная — отображать реквизиты только у зарегистрированных пользователей. И если пользователь не зарегистрирован, как он вообще может попасть в админку?

  18. hippy

    Тааакс…. возможно я чего недопонимаю, но разве не из под админки — заказы необходимо управлять этими заказами?, мне необходимо видеть реквизиты покупателей, работаю в основном с юриками…. 

    1. Alexandr

      Все правильно, заказами нужно управлять через админку. Если сейчас реквизиты клиентов выводятся неправильно — нужно исправлять функции. Сейчас заниматься этим времени нет, но как будет время — доработаю.

  19. Алеша

    Как просматривать реквизиты от незарегистрированных пользователей ?

    1. Alexandr

      Если пользователь не зарегистрирован и не сделал ни одного заказа (автоматическая регистрация при заказе), то каким образом его реквизиты сохраняться (чтобы их просматривать)?

  20. Александр

    Здравствуйте. А не подскажите, как можно переработать, чтобы работало при заказе без регистрации? Как вы писали выше, «автоматическая регистрация при заказе», не планируется, регистрация не планируется вообще, а ваш метод решения вопроса очень понравился, только бы сделать его для гостей (стандартные данные типа «имя» «фамилия» «адрес» передаются и в заказе есть, можно также передать и эти дополнительные данные, но без регистрации?)

  21. Maxim

    Подскажите все таки как сделать , чтобы некоторые поля физ.лица скрывались при выборе юр.лица ?

    1. Alexandr

      Скрытие стандартных полей «на лету» довольно муторная задача. Я использовал такой вариант (после подзаголовка «Отключение платежного адреса при Самовывозе»). Адаптируйте его под свои нужны, изменив триггер скрипта и необходимые для скрытия поля. Вариант конечно далеко не совершенный.

  22. Иван

    Для таких же горемык как я. Чтобы информация о реквизитах Юр. лица сохранялась у не зареганного пользователя можно доавить мета-инфомацию прямо в заказ.
    Соответственно будем хранить реквизиты и у пользователя и в заказе, что выстрелит. Наверно, можно доделать функцию, чтобы проверять регистрируется ли пользователь и в зависимости от этого сохранять в нужную сущность
    Я на 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();
    }

    1. Alexandr

      Спасибо за ценное дополнение.

  23. Владислав

    Здравствуйте никак не могу разобраться.  Как можно отключить проверку полей физ лица , если пользователь заполняет раздела юр лица ? Просто в случае с физ лицом происходит нормальное оформление заказа . А при выборе юр лица , обязательно всплывают так же ошибки физ лица.
     

  24. Владислав

    Дело в том что у меня во вкладке юр лица как раз таки присутствует поле с номером и именем константного лица. Хотелось бы что бы эти разделы были независимые друг от друга.

  25. Владислав

    Может кому поможет моё не совсем изящное решение. Но я решил это так. Поля которые стандартные нужно убрать проверку на заполненность, которую вешает вукомерц. Делается это так :

    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’ );
        } 
    }

    Стоит так же заметить маленькую деталь , над которой я немного завис , следует обязательно указать второе условие нажатия на радиобаттон ,  так как если вставить наши изменения просто после первого условия. То наши нововведения будут применятс как и при выборе физ лица так и юр лица.
    Возможно есть какое то более изящное решение ? Буду рад Вашим советам. Огромное спасибо за отличную информацию. Много чего нет в свободном доступе. А здесь я нашёл решения для своих проектов. 
     
     
     

    1. Alexandr

      Спасибо за отзыв и полезные дополнения. В ближайшее время вернусь к этому решению и буду отвечать на комментарии и дорабатывать функционал.

  26. Дмитрий

    Здравствуйте, подскажите, пожалуйста, как правильно подключить этот скрипт ( куда вставлять или что создать? ) Никак не могу разобраться …
    // Включить радио кнопку изначально
    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();
    }
    });
    });

  27. Владимир

    Спасибо автору за доработку плагина. Если честно мне было сложно понять куда и что вставлять, но поковырявшись я понял. Всё это достояние нужно вставлять в код для 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’ );

  28. Denis

    А как сделать эти поля в форме регистрации?

  29. Жангирхан Нургалиев.

    Всем привет.Не совсем корректно работает функция вывода реквизитов.
    У разных пользователей должна быть разные реквизиты
    Замените такие строки на такие
    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();

    Нужно правильно обращаеться к клиенту заказа. А на текущему пользователю. 

    1. Alexandr

      Уверен что Вы правы. Данное решение прорабатывал довольно давно, и с тех пор мало где его применял.
      Доработаю код данного функционала и обновлю статью. Спасибо за Ваш комментарий!

  30. Михаил

    Спасибо большое, очень выручила Ваша статья!

Юр. или физ. лицо при оформлении
Фильтр записей на главной странице
Рекомендации для васФильтр записей на главной страницеOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.