Оформление заказа - ограничение стран в биллинге и доставке на основе геолокации - PullRequest
0 голосов
/ 14 февраля 2019

Версия WordPress: 5.0.3 Версия WooCommerce: 3.5.4

У меня есть многострановой магазин, и во время оформления заказа я хочу ограничить биллинг и доставку Странами местоположением IP-адреса пользователя с помощью геолокации.

Мне удалось сделать это с помощью удивительного кода из: Местонахождение доставки на основе IP (геолокация) & удаление (необязательно) текста с использованием кода из Удалить «(необязательно)) »Из полей оформления заказа в Woocommerce 3.4 +

Мой окончательный код:

        function wpse_287199_woo_checkout_country( $fields ) {
            $geoData = WC_Geolocation::geolocate_ip();
            $countries = WC()->countries->get_countries();

            $fields['billing']['billing_country'] = array(
                'type' => 'select',
                'label'     => __('Country', 'woocommerce'),
                'options' => array(
                    $geoData['country'] => $countries[$geoData['country']]
                ),
                'class' => array(
                    'form-row-wide',
                    'address-field',
                    'update_totals_on_change'
                )
            );

            $fields['shipping']['shipping_country'] = array(
                'type' => 'select',
                'label'     => __('Country', 'woocommerce'),
                'options' => array(
                    $geoData['country'] => $countries[$geoData['country']]
                ),
                'class' => array(
                    'form-row-wide',
                    'address-field',
                    'update_totals_on_change'
                )
            );

            return $fields;
        }
        add_filter( 'woocommerce_checkout_fields' , 'wpse_287199_woo_checkout_country' );
        add_filter( 'wp_footer' , 'remove_checkout_optional_fields_label_script' );
        function remove_checkout_optional_fields_label_script() {
            // Only on checkout page
            if( ! ( is_checkout() && ! is_wc_endpoint_url() ) ) return;

            $optional = '&nbsp;<span class="optional">(' . esc_html__( 'optional', 'woocommerce' ) . ')</span>';
            ?>
            <script>
            jQuery(function($){
                // On "update" checkout form event
                $(document.body).on('update_checkout', function(){
                    $('#billing_country_field label > .optional').remove();
                    $('#shipping_country_field label > .optional').remove();
                });
            });
            </script>
            <?php
        }

Однако, с этим кодом клиент видит поле с полем выбора, котороене выбираетсяЭто будет раздражать клиента.Пожалуйста, смотрите скриншот ниже: What the customer sees now

Может кто-нибудь подсказать мне, какие изменения нужно внести в код, чтобы убрать опцию выбора.Клиент должен увидеть поле страны, как показано на скриншоте ниже:

What I expect to be seen

Большое спасибо

1 Ответ

0 голосов
/ 15 мая 2019

ОК, я не мог получить точно того, чего я надеялся достичь, но получил что-то близкое

Мой окончательный код:

/** Restrict Change in Checkout Country based on Geo IP (geolocation)*/
function wpse_287199_woo_checkout_country( $fields ) {
    $geoData = WC_Geolocation::geolocate_ip();
    $countries = WC()->countries->get_countries();
$fields['billing']['billing_country'] = array(
        'type' => 'select',
        'label'     => __('Country', 'woocommerce'),
        'options' => array(
            $geoData['country'] => $countries[$geoData['country']]
        ),
        'class' => array(
            'form-row-wide',
            'address-field',
            'update_totals_on_change'
        )
    );
$fields['shipping']['shipping_country'] = array(
        'type' => 'select',
        'label'     => __('Country', 'woocommerce'),
        'options' => array(
            $geoData['country'] => $countries[$geoData['country']]
        ),
        'class' => array(
            'form-row-wide',
            'address-field',
            'update_totals_on_change'
        )
    );
return $fields;
}
add_filter( 'woocommerce_checkout_fields' , 'wpse_287199_woo_checkout_country' );
/** Remove (optional) from country fields and make it non selectable*/
function remove_checkout_optional_fields_label_script() {
    // Only on checkout page
    if( ! ( is_checkout() && ! is_wc_endpoint_url() ) ) return;

    $optional = '&nbsp;<span class="optional">(' . esc_html__( 'optional', 'woocommerce' ) . ')</span>';
    ?>
    <script>
    jQuery(function($){
        // On "update" checkout form event
        $(document.body).on('update_checkout', function(){
            $('#billing_country_field label > .optional').remove();
    $('.woocommerce-checkout #billing_country_field').css('pointer-events', 'none');
            $('#shipping_country_field label > .optional').remove();
    $('.woocommerce-checkout #shipping_country_field').css('pointer-events', 'none');
        });
    });
    </script>
    <?php
}
add_filter( 'wp_footer' , 'remove_checkout_optional_fields_label_script' );
// End of above code

Это сделало бы странуАвтоматическое заполнение поля данными геолокации и делает его недоступным для выбора is there such a word? ;)

final result

Любые предложения по улучшению приветствуются.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...