sergius-lg
@sergius-lg

Вывод методов доставки на странице Оформления заказа для незарегистрированных пользователей?

После натяжки своей верстки, во время тестирования, столкнулся с проблемой. Дело в том, что регистрация у меня не предусмотрена. Да она и не нужна, небольшой интернет-магазин свадебного аксессуара, человек сделает покупку в лучшем случае один раз.

По дефолту страница Оформления заказа примерно выглядит как на схеме:

5e78c03987f97073181248.jpeg

Блок методов доставки находится под списком заказа (обозначен красным пунктиром).
По дизайну методы доставки находятся над формой адреса доставки. Т.е мне пришлось из файла review-order.php переместить функцию вывода методов доставки в файл form-checkout.php


<?php if ( WC()->cart->needs_shipping() && WC()->cart->show_shipping() ) : ?>
<?php do_action( 'woocommerce_review_order_before_shipping' ); ?>
<?php wc_cart_totals_shipping_html(); ?>
<?php do_action( 'woocommerce_review_order_after_shipping' ); ?>
<?php endif; ?>


Теперь в "кастоме" страница Оформления заказа примерно выглядит как на схеме:

5e78c22ba4bbc244778431.jpeg

Все прекрасно работало когда я заходил под админом. Если зайти без регистрации , то за место методов доставки появится сообщение: Введите свой адрес для просмотра параметров доставки.

5e78c36d2ee00476145635.jpeg

У меня доставка настроена по России, ограничение по диапазонам индексов. В настройках местоположение клиента, стоит адрес магазина. Три варианта доставки имеют нулевую стоимость, так как клиент будет переадресован на сайт Транспортной компании и сам будет выбирать, то что ему нравится + Бесплатная доставка.

Остается Почта России, у меня для всех индексов одна стоимость + 4% от стоимости заказа. Мне калькулятор не нужен, для классов и т.д. Начал мучать cart-shipping.php безрезультатно.

Курил зарубежные форумы, а также тех.поддержу Woocommerce, несколько человек задавало этот вопрос, но внятного ответа так и не получили. Хотя был один ответ, все методы доставки убрать За пределы Вашей зоны доставки и тогда будет ОК. Ну да будет, но на кой черт я диапазоны индексов вводил ??? Я конечно могу с помощью Javascript сравнивать введенный индекс, но это такое себе!!!

Друзья, кто сталкивался с такой дилеммой и как выходил из неё ?

У меня есть 2 варианта :

1) Изменить код файла или добавить хук, для того чтобы Woocommerce без проверок на наличие адреса, выводил блок методов доставки.

2) Смирится с этим, и пусть клиент вводить адрес доставки, его все равно надо вводить, но тут у меня косяк! Из-за того что я перенес блок вывода методов доставки, он не обновляется автоматически. Т.е после введения адреса, обновление AJAX приходит только на review-order.php, все цены выводятся, только для первого метода, а сообщение: Введите свой адрес для просмотра параметров доставки, так и остаётся. Если перезагрузить страницу через F5 все работает.

Я конечно знаю что такое AJAX запрос, но как применить его ко всей странице checkout.php или к фрагменту кода на странице form-checkout.php, после введения адреса доставки, пока теряюсь.
  • Вопрос задан
  • 2465 просмотров
Пригласить эксперта
Ответы на вопрос 2
@midas34
Зависит конечно от темплейтов темы, можно реализовать так:
1) Шаблоны \woocommerce\checkout\form-checkout.php и \woocommerce\checkout\review-order.php копируйте в вашу текущую тему WP
2) Открываем review-order.php и смотрим секцию tfoot, начинается с
<?php if ( WC()->cart->needs_shipping() && WC()->cart->show_shipping() ) : ?>

Вырезаем кусок до конца и вставляем в нужное место в шаблоне form-checkout.php
По другому ни как! т.к. именно в review-order.php идёт проверка на включение опций Доставки в Woo, если опция включена, идёт проверка и вывод методов доставки
Пример какой кусок вырезается, брал из стандартного шаблона Woo
<?php if ( WC()->cart->needs_shipping() && WC()->cart->show_shipping() ) : ?>

			<?php do_action( 'woocommerce_review_order_before_shipping' ); ?>

			<?php wc_cart_totals_shipping_html(); ?>

			<?php do_action( 'woocommerce_review_order_after_shipping' ); ?>

		<?php endif; ?>

		<?php foreach ( WC()->cart->get_fees() as $fee ) : ?>
			<tr class="fee">
				<th><?php echo esc_html( $fee->name ); ?></th>
				<td><?php wc_cart_totals_fee_html( $fee ); ?></td>
			</tr>
		<?php endforeach; ?>

		<?php if ( wc_tax_enabled() && ! WC()->cart->display_prices_including_tax() ) : ?>
			<?php if ( 'itemized' === get_option( 'woocommerce_tax_total_display' ) ) : ?>
				<?php foreach ( WC()->cart->get_tax_totals() as $code => $tax ) : // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited ?>
					<tr class="tax-rate tax-rate-<?php echo esc_attr( sanitize_title( $code ) ); ?>">
						<th><?php echo esc_html( $tax->label ); ?></th>
						<td><?php echo wp_kses_post( $tax->formatted_amount ); ?></td>
					</tr>
				<?php endforeach; ?>
			<?php else : ?>
				<tr class="tax-total">
					<th><?php echo esc_html( WC()->countries->tax_or_vat() ); ?></th>
					<td><?php wc_cart_totals_taxes_total_html(); ?></td>
				</tr>
			<?php endif; ?>
		<?php endif; ?>

3) Обрамите его в теги table и tfoot по аналогии как в шаблоне review-order.php иначе посыпется вёрстка
Метод полностью рабочий, работает на одном проекте
Ответ написан
@vladislavsandrozd
Такая же ситуация, подскажите, как решили данную проблему.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы