• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Важно! Совмещение корзины и оплаты в "Оформление заказа"

Ruckus

Новичок
<?php
/**
* Checkout Form
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 2.0.0
*/
if ( !defined( 'ABSPATH' ) )
exit; // Exit if accessed directly

global $woocommerce;

wc_print_notices();

do_action( 'woocommerce_before_checkout_form', $checkout );

// If checkout registration is disabled and not logged in, the user cannot checkout
if ( !$checkout->enable_signup && !$checkout->enable_guest_checkout && !is_user_logged_in() ) {
echo apply_filters( 'woocommerce_checkout_must_be_logged_in_message', __( 'You must be logged in to checkout.', 'woocommerce' ) );
return;
}

// filter hook for include new pages inside the payment method
$get_checkout_url = apply_filters( 'woocommerce_get_checkout_url', WC()->cart->get_checkout_url() );
?>

<form name="checkout" method="post" class="checkout" action="<?php echo esc_url( $get_checkout_url ); ?>">

<?php if ( sizeof( $checkout->checkout_fields ) > 0 ) : ?>

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

<div class="row">

<div class="col2-set" id="customer_details">

<div class="col-lg-6 col-md-6 col-sm-6">


<?php do_action( 'woocommerce_checkout_billing' ); ?>
<?php do_action( 'woocommerce_checkout_shipping' ); ?>

</div>

<div class="col-lg-6 col-md-6 col-sm-6">
<div class="order-wrap">
<?php do_action( 'woocommerce_checkout_after_customer_details' ); ?>

<h3 id="order_review_heading"><?php _e( 'Your order', 'woocommerce' ); ?></h3>

<?php endif; ?>

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

</div>
</div>

</div>
</div><!--/row -->



</form>

<?php do_action( 'woocommerce_after_checkout_form', $checkout ); ?>
Код моего checkouta themes/captiva/woocommerce/checkout/form-checkout.php. Не погу понять где все двоится вид оплаты.<div id="order_review"> и <div id="payment">.Может из-за них двоится. Я честно скажу в php, я чайник, может смогли бы посказать где искать решение проблемы.

Вроде у стандартного Woocommerce не так много файлов.
 

Вложения

Последнее редактирование модератором:

Stork.71

Гуру
Местный
здесь вроде все чисто.
А что в файлике review-order.php?
вся задвоенность - в блоке <?php do_action( 'woocommerce_checkout_order_review' ); ?>
Его надо найти.
В functions.php ничего не вставляли? Хуков никаких?
 

searchingman

Гуру
Местный
<?php
/**
* Checkout Form
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 2.0.0
*/
if ( !defined( 'ABSPATH' ) )
exit; // Exit if accessed directly

global $woocommerce;

wc_print_notices();

do_action( 'woocommerce_before_checkout_form', $checkout );

// If checkout registration is disabled and not logged in, the user cannot checkout
if ( !$checkout->enable_signup && !$checkout->enable_guest_checkout && !is_user_logged_in() ) {
echo apply_filters( 'woocommerce_checkout_must_be_logged_in_message', __( 'You must be logged in to checkout.', 'woocommerce' ) );
return;
}

// filter hook for include new pages inside the payment method
$get_checkout_url = apply_filters( 'woocommerce_get_checkout_url', WC()->cart->get_checkout_url() );
?>

<form name="checkout" method="post" class="checkout" action="<?php echo esc_url( $get_checkout_url ); ?>">

<?php if ( sizeof( $checkout->checkout_fields ) > 0 ) : ?>

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

<div class="row">

<div class="col2-set" id="customer_details">

<div class="col-lg-6 col-md-6 col-sm-6">


<?php do_action( 'woocommerce_checkout_billing' ); ?>
<?php do_action( 'woocommerce_checkout_shipping' ); ?>

</div>

<div class="col-lg-6 col-md-6 col-sm-6">
<div class="order-wrap">
<?php do_action( 'woocommerce_checkout_after_customer_details' ); ?>

<h3 id="order_review_heading"><?php _e( 'Your order', 'woocommerce' ); ?></h3>

<?php endif; ?>

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

</div>
</div>

</div>
</div><!--/row -->



</form>

<?php do_action( 'woocommerce_after_checkout_form', $checkout ); ?>
Код моего checkouta themes/captiva/woocommerce/checkout/form-checkout.php. Не погу понять где все двоится вид оплаты.<div id="order_review"> и <div id="payment">.Может из-за них двоится. Я честно скажу в php, я чайник, может смогли бы посказать где искать решение проблемы.

Вроде у стандартного Woocommerce не так много файлов.
Какая версию WooCommerce?
Версия темы адаптирована под версию WooCommerce?
 

Ruckus

Новичок
здесь вроде все чисто.
А что в файлике review-order.php?
вся задвоенность - в блоке <?php do_action( 'woocommerce_checkout_order_review' ); ?>
Его надо найти.
В functions.php ничего не вставляли? Хуков никаких?
Да нет, там все оставил как есть.
Вот код
review-order
<?php
/**
* Review order form
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 2.1.8
*/
if ( !defined( 'ABSPATH' ) )
exit; // Exit if accessed directly
?>

<?php if ( !is_ajax() ) : ?><div id="order_review"><?php endif; ?>

<table class="shop_table">
<thead>
<tr>
<th class="product-name"><?php _e( 'Product', 'woocommerce' ); ?></th>
<th class="product-total"><?php _e( 'Total', 'woocommerce' ); ?></th>
</tr>
</thead>
<tfoot>

<tr class="cart-subtotal">
<th><?php _e( 'Cart Subtotal', 'woocommerce' ); ?></th>
<td><?php wc_cart_totals_subtotal_html(); ?></td>
</tr>

<?php foreach ( WC()->cart->get_coupons( 'cart' ) as $code => $coupon ) : ?>
<tr class="cart-discount coupon-<?php echo esc_attr( $code ); ?>">
<th><?php wc_cart_totals_coupon_label( $coupon ); ?></th>
<td><?php wc_cart_totals_coupon_html( $coupon ); ?></td>
</tr>
<?php endforeach; ?>

<?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()->cart->tax_display_cart === 'excl' ) : ?>
<?php if ( get_option( 'woocommerce_tax_total_display' ) === 'itemized' ) : ?>
<?php foreach ( WC()->cart->get_tax_totals() as $code => $tax ) : ?>
<tr class="tax-rate tax-rate-<?php echo 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 echo wc_price( WC()->cart->get_taxes_total() ); ?></td>
</tr>
<?php endif; ?>
<?php endif; ?>

<?php foreach ( WC()->cart->get_coupons( 'order' ) as $code => $coupon ) : ?>
<tr class="order-discount coupon-<?php echo esc_attr( $code ); ?>">
<th><?php wc_cart_totals_coupon_label( $coupon ); ?></th>
<td><?php wc_cart_totals_coupon_html( $coupon ); ?></td>
</tr>
<?php endforeach; ?>

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

<tr class="order-total">
<th><?php _e( 'Order Total', 'woocommerce' ); ?></th>
<td><?php wc_cart_totals_order_total_html(); ?></td>
</tr>

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

</tfoot>
<tbody>
<?php
do_action( 'woocommerce_review_order_before_cart_contents' );

foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );

if ( $_product && $_product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'woocommerce_checkout_cart_item_visible', true, $cart_item, $cart_item_key ) ) {
?>
<tr class="<?php echo esc_attr( apply_filters( 'woocommerce_cart_item_class', 'cart_item', $cart_item, $cart_item_key ) ); ?>">
<td class="product-name">
<?php echo apply_filters( 'woocommerce_cart_item_name', $_product->get_title(), $cart_item, $cart_item_key ); ?>
<?php echo apply_filters( 'woocommerce_checkout_cart_item_quantity', ' <strong class="product-quantity">' . sprintf( '&times; %s', $cart_item['quantity'] ) . '</strong>', $cart_item, $cart_item_key ); ?>
<?php echo WC()->cart->get_item_data( $cart_item ); ?>
</td>
<td class="product-total">
<?php echo apply_filters( 'woocommerce_cart_item_subtotal', WC()->cart->get_product_subtotal( $_product, $cart_item['quantity'] ), $cart_item, $cart_item_key ); ?>
</td>
</tr>
<?php
}
}

do_action( 'woocommerce_review_order_after_cart_contents' );
?>
</tbody>
</table>

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

<div id="payment">
<?php if ( WC()->cart->needs_payment() ) : ?>
<ul class="payment_methods methods">
<?php
$available_gateways = WC()->payment_gateways->get_available_payment_gateways();
if ( !empty( $available_gateways ) ) {

// Chosen Method
if ( isset( WC()->session->chosen_payment_method ) && isset( $available_gateways[WC()->session->chosen_payment_method] ) ) {
$available_gateways[WC()->session->chosen_payment_method]->set_current();
} elseif ( isset( $available_gateways[get_option( 'woocommerce_default_gateway' )] ) ) {
$available_gateways[get_option( 'woocommerce_default_gateway' )]->set_current();
} else {
current( $available_gateways )->set_current();
}

foreach ( $available_gateways as $gateway ) {
?>
<li class="payment_method_<?php echo $gateway->id; ?>">
<input id="payment_method_<?php echo $gateway->id; ?>" type="radio" class="input-radio" name="payment_method" value="<?php echo esc_attr( $gateway->id ); ?>" <?php checked( $gateway->chosen, true ); ?> data-order_button_text="<?php echo esc_attr( $gateway->order_button_text ); ?>" />
<label for="payment_method_<?php echo $gateway->id; ?>"><?php echo $gateway->get_title(); ?> <?php echo $gateway->get_icon(); ?></label>
<?php
if ( $gateway->has_fields() || $gateway->get_description() ) :
echo '<div class="payment_box payment_method_' . $gateway->id . '" ' . ( $gateway->chosen ? '' : 'style="display:none;"' ) . '>';
$gateway->payment_fields();
echo '</div>';
endif;
?>
</li>
<?php
}
} else {

if ( !WC()->customer->get_country() )
$no_gateways_message = __( 'Please fill in your details above to see available payment methods.', 'woocommerce' );
else
$no_gateways_message = __( 'Sorry, it seems that there are no available payment methods for your state. Please contact us if you require assistance or wish to make alternate arrangements.', 'woocommerce' );

echo '<p>' . apply_filters( 'woocommerce_no_available_payment_methods_message', $no_gateways_message ) . '</p>';
}
?>
</ul>
<?php endif; ?>

<div class="form-row place-order">

<noscript><?php _e( 'Since your browser does not support JavaScript, or it is disabled, please ensure you click the <em>Update Totals</em> button before placing your order. You may be charged more than the amount stated above if you fail to do so.', 'woocommerce' ); ?><br/><input type="submit" class="button alt" name="woocommerce_checkout_update_totals" value="<?php _e( 'Update totals', 'woocommerce' ); ?>" /></noscript>

<?php wp_nonce_field( 'woocommerce-process_checkout' ); ?>

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

<?php
$order_button_text = apply_filters( 'woocommerce_order_button_text', __( 'Place order', 'woocommerce' ) );

echo apply_filters( 'woocommerce_order_button_html', '<input type="submit" class="button alt" name="woocommerce_checkout_place_order" id="place_order" value="' . esc_attr( $order_button_text ) . '" data-value="' . esc_attr( $order_button_text ) . '" />' );
?>

<?php
if ( wc_get_page_id( 'terms' ) > 0 && apply_filters( 'woocommerce_checkout_show_terms', true ) ) {
$terms_is_checked = apply_filters( 'woocommerce_terms_is_checked_default', isset( $_POST['terms'] ) );
?>
<p class="form-row terms">
<label for="terms" class="checkbox"><?php printf( __( 'I&rsquo;ve read and accept the <a href="%s" target="_blank">terms &amp; conditions</a>', 'woocommerce' ), esc_url( get_permalink( wc_get_page_id( 'terms' ) ) ) ); ?></label>
<input type="checkbox" class="input-checkbox" name="terms" <?php checked( $terms_is_checked, true ); ?> id="terms" />
</p>
<?php } ?>

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

</div>

<div class="clear"></div>

</div>

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

<?php if ( !is_ajax() ) : ?></div><?php endif; ?>
 

searchingman

Гуру
Местный
Извиняюсь неправильно понял. Версия Captiva 1.3 Вроде была последняя, когда скачивал её.
Версия 1.3 темы Captiva - Responsive WordPress WooCommerce Theme была выпущена 14.08.2014г.
За целый год сменилась не одна версия самого плагина WooCommerce.
На данный момент актуальной версией темы является версия 1.8.1 от 08.10.2015г.
 
Ребята, а подскажите как осуществить такую штуку?

Хочу поменять текст в эндпойнте при оплате через Робокассу. Суть такая, что хочу внести туда текст, что мол необходимо дождаться подтверждения менеджера по наличию и уже после этого оплатить. Не могу понять где это вообще редактируется. Сейчас у меня так, как на скриншоте.:
 

Вложения

У меня еще следующие вопросы имеются. WC 2.4.7


1. Как убрать из стандартного виджета Корзина кнопку "Перейти в корзину"?
2. Как на странице Оплаты/Chekout убрать "Сумма в корзине" т.к общая сумма и выбор доставки будет ниже?
3. Убрать со страницы (читай из шорткода chekout) ссылку про купон (он уже есть в корзине) ?
4. И еще когда нажимаешь подтвердить заказ выводится сообщение с номером и соответственно снова с шорткодом корзины над этим всем. Как сделать чтобы в одном случае корзина была, а потом ее не стало?)
 

Вложения

Последнее редактирование:
Добрый день. Воспользовался Вашим кодом, с помощью, которого добавляются способы доставки. Получилочь вот так (см. рисунок). Подскажите, пожалуйста, как изменить код, чтобы "Способы доставки" расположились под блоками "Email-адрес" и "Телефон". А уже после доставки шли "Область" , "Населенный пункт" и т.д?
 

Вложения

Stork.71

Гуру
Местный
Добрый день. Воспользовался Вашим кодом, с помощью, которого добавляются способы доставки. Получилочь вот так (см. рисунок). Подскажите, пожалуйста, как изменить код, чтобы "Способы доставки" расположились под блоками "Email-адрес" и "Телефон". А уже после доставки шли "Область" , "Населенный пункт" и т.д?
Вряд ли получится. Блок доставки (если вы его вставляли как я писал в посте #1) цепляется на стандартный хук woocommerce_after_checkout_billing_form , а разорвать стандартные billing-поля вряд ли получится. Можно попробовать в качестве альтернативы подцепить его на woocommerce_before_checkout_billing_form - тогда выбор способа доставки будет еще раньше, перед ФИО. Может так логичнее будет немного.
Можно пойти другим путем. Добавить поля с использованием различных плагинов, для этого предназначеных. Например, я изначально изменял их с помощью Saphali WC Lite, но для Вашего случая он не подходит так как не работает с полями типа 'select' (в бесплатной версии). А вот WooCommerce Poor Guys Swiss Knife работает. Можете попробовать его.
Тот код, которым я добавлял изначально поля был написан 100500 лет назад, тогда не было бесплатных плагинов, позволяющих это делать. Сейчас ситуация поменялась. Да и вообще я использовал стандартные методы добавления способов доставки, через стандартный функционал woocommerce, просто двигал их куда надо (подробнее тут).
 

Stork.71

Гуру
Местный
1. Как убрать из стандартного виджета Корзина кнопку "Перейти в корзину"?
п. 3 первого сообщения.
2. Как на странице Оплаты/Chekout убрать "Сумма в корзине" т.к общая сумма и выбор доставки будет ниже?
Редактировать файл /wp-content/plugins/woocommerce/templates/checkout/review-order.php Жалательно использовать дочернюю тему.
3. Убрать со страницы (читай из шорткода chekout) ссылку про купон (он уже есть в корзине) ?
Там же.
4. И еще когда нажимаешь подтвердить заказ выводится сообщение с номером и соответственно снова с шорткодом корзины над этим всем. Как сделать чтобы в одном случае корзина была, а потом ее не стало?)
Сходу не придумаю. Ссылку на сайт дайте. Скорее всего как-то редактировать используя endpoint'ы
 
Добрый день. Спасибо за данную тему. Очень помогла. У меня WordPress 4.3.1 с темой оформления The7.2. Большинство проблема я решил с помощью плагина WooCommerce Checkout Manager. Но у меня была проблема. Ужасно хотел удалить кнопку "Перейти к оформлению". Но нужного кода не нашел в файле cart.php. Нашел в proceed-to-checkout-button.php. Надеюсь кому-то поможет это.

Вопрос на засыпку. Может кто знает, как убрать выпадающее меню о выборе доставки и суммы? А то, на одной странице с оплатой 2 раза не камильфо.
 

Вложения

Stork.71

Гуру
Местный
шаблон \templates\checkout\review-order.php, убираем кусок
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; ?>
должно работать.
 

Olesya

Новичок
Ну тогда для Вас подниму и разовью тему :)
В общем, вернулся я к родной доставке. Включил ее, настроил интересующие меня варианты. По факту, у меня включен самовывоз, а также "Единая ставка", в которую я закинул кучу нужных вариантов.
Очень нужную информацию вы пишите, спасибо вам большое. Скажите, пожалуйста, как вы сделали в единой ставке несколько вариантов доставки? чтоб выводилось доставка по всем вариантам в заказе, как у вас на сайте .
 
ПРОЛОГ
Данная тема создана давно. С тех пор многое менялось, обновлялся woocommerce, отлавливались баги, что-то обсуждалось, были и просто доработки. Тема значительно разрослась, а самая первая версия, описанная в первом посте, практически утратила свою актуальность. Вот несколько ссылок на ключевые посты темы, которые также рекомендованы к обязательному прочтению.
Обнова с WC 2.1 до 2.2
Лечение циклической переадресации
Обнова до WC 2.4



Хочу поделиться своим опытом по совмещению в одно страницы корзины (\cart) и оплаты (\checkout). Во-первых, кому-то может пригодиться, во-вторых, очень хочется услышать мнение более продвинутых сайторазработчиков по этому поводу, так как некоторые мои решения наверняка некорректны и неизящны и можно сделать правильнее и оптимальнее. Хотя вроде немного погонял туба-сюда, проблем не заметил. В общем, жду конструктивной критики.
Зачем?
Прежде всего объясню, зачем я решил лезть в святая святых - функционал и принцип работы интернет-магазина WooCommerce. Функционал конечно классный, отлично заточен под электронную торговлю, особенно - под международную торговлю с кучей вариантов оплаты, доставки товара. Поэтому многое для нашего региона, и в частности для меня неактуально. В частности, я пока вообще не подключаю платежные системы, а сайт должен работать в полуавтоматическом режиме - то есть после заказа в любом случае связь с менеджером и согласование заказа. В итоге имеем кучу похожих малоинформативных страниц, усложняющих процесс заказа, от которых хочется избавиться.
Задача
Сделать одну страничку, на которой будет все необходимое - и корзина, и реквизиты для доставки, и выбор варианта оплаты, причем страничка максимально простая, с минимумом заполняемых полей, которые не напрягают покупателя.
1. Изменение содержания страниц корзины и оплаты
Идея была в том, чтобы запихнуть все содержимое страниц \cart и \checkout в одну. Поскольку изначально весь функционал прописан так, что все менюшки, виджеты, всплывающие сообщения ссылаются на корзину, то основной у нас будет \cart, a \checkout будет висеть скорее на всякий случай, но по идее пользователь не должен на нее попадать, а если вдруг случайно попадет - не отличить от страницы \cart.
Я сделал содержимое обеих страниц идентичным. Заголовок: "Оформление заказа", содержимое:
Код:
Для того, чтобы оформить заказ, прежде всего проверьте, все ли товары, которые Вас интересуют, попали в корзину, а также проверьте количество. Введите свои контактные данные и реквизиты для доставки, выберите способ оплаты и доставки - и смело нажимайте "Разместить заказ". В ближайшее время наши сотрудники свяжутся с Вами. [woocommerce_cart][hr][woocommerce_checkout]
После такой манипуляции видим страницу, где сначала идет корзина (список выбранных товаров, стоимость, кросс-селл), а потом страница оплаты (реквизиты покупателя, выбор варианта оплаты).
2. Привязка к страницам в настройках WooCommerce
В привязках страниц магазина (WooCommerce - Настройки - Страницы) привязал в качестве страницы оплаты страницу "Оформление заказа" которая "\cart", хотя вроде и без этого работало.
3. Убрать кнопку «перейти к оплате» из корзины и виджета корзины
Чтобы ничто нас не редиректило на \checkout, надо убрать кнопки "перейти к оплате".
Идем в wp-content\plugins\woocommerce\templates\cart\cart.php. Здесь надо начиная со строчки 134 (только не с самого ее начала!!!) удалить следующий код:
PHP:
<input type="submit" class="checkout-button button alt" name="proceed" value="<?php _e( 'Proceed to Checkout &rarr;', 'woocommerce' ); ?>" />
                <?php do_action('woocommerce_proceed_to_checkout'); ?>
То же самое надо сделать и для виджета корзины. Я использую плагин плавающей корзинки
WooCommerce Cart Tab, а он работает на основе виждета. В общем, идем в wp-content\plugins\woocommerce\templates\cart\mini-cart.php, находим 69 строчку и удаляем следующий код:
PHP:
<a href="<?php echo $woocommerce->cart->get_checkout_url(); ?>" class="button checkout"><?php _e( 'Checkout &rarr;', 'woocommerce' ); ?></a>
4. Убрать кнопку «Оформить заказ» из меню
Продолжаем чистить следы. У меня тема Wootique, и в ней в верхнее меню встроены пункты корзины и оплаты, последний нам не нужен.
Открываем wp-content\themes\wootique\custom.css (файл изменения стиля темы) и прописываем туда
HTML:
a.checkout-link, a.checkout-link:hover   {display: none}
Вкладка становится скрытой, хотя из кода не исчезает, просто пользователь ее не увидит.
5. Настройка полей данных о покупателе
На нашей новой страничке оформлния заказа должно быть минимум полей, которые мы расположим в две колонки - первая получится из "Реквизитов для оплаты", вторая из "Адреса доставки".
5.1. Ковыряемся в переводе
Название колонки "реквизиты для оплаты" нам не подходит, открываем poedit и редактируем файл локализации от saphali woocommerce lite. Находим строку 'Billing Address' и меняем ее с "Реквизиты для оплаты" на "Контактные данные".
5.2. Настраиваем доставку.
От системы доставки, которую предлагает Woocommerce пришлось отказаться: во-первых, не очень корректно отображается ajax-расчет в корзине (он не нужен, дублируется), во-вторых, мы не включаем стоимость доставки в стоимость заказа, ее покупатель отдельно оплачивает в зависимости от тарифа почтового курьера (Украина, Новая почта или Гюнсел). В общем, выбор доставки будем позже делать самостоятельно. Пока что на странице настройки доставки в админке убираем все галочки, оставив только "Сбор адреса доставки, даже если не требуется".
5.3. Прячем чекбокс «отправка по реквизитам оплаты»
Открываем wp-content\themes\wootique\custom.css (файл изменения стиля темы) и прописываем туда
HTML:
#shiptobilling {display:none;}
5.4. Редактируем отображаемые поля заказа
В настройках Saphali Woocommerce Lite идем в "Управление полями на странице заказа и на странице профиля". Я поля не удалял, просто поснимал флажок "опубликовать", оставив его только для следующих полей:
Реквизиты оплаты - Имя; Фамилия; Email-адрес; Телефон.

Реквизиты доставки - Область, Район; Населенный пункт; а также shipping_adress_1, содержимое которого я поменял на такой текст:
HTML:
№ склада (при доставке до склада перевозчика); <br> Адрес доставки (при доставке до дверей)
Дополнительные поля - Заметки к заказу оставляем.
5.4. Добавляем радио-кнопки для способов доставки
В последнем обновлении Saphali Woocommerce Lite добавили возможность добавлять поля разного типа - Select, Checkbox, Text, Textarea. Молодцы конечно, но мне хотелось именно радио-кнопки, да и выход из этого положения я нашел еще до обновления, иначе вряд ли бы заморачивался. Порывшись на форумах (англоязычных), в техдокументации woocommerce, был сочинен (точнее переработан) и прописан в functions.php следующий код:
PHP:
/**
     * Outputs a radio button form field - Вывод формы с радио-кнопками
     */
    function woocommerce_form_field_radio( $key, $args, $value = '' ) {
                global $woocommerce;
                    $defaults = array(
                                    'type' => 'radio',
                                    'label' => '',
                                    'placeholder' => '',
                                    'required' => false,
                                    'class' => array( ),
                                    'label_class' => array( ),
                                    'return' => false,
                                    'options' => array( )
                    );
                    $args     = wp_parse_args( $args, $defaults );
                    if ( ( isset( $args[ 'clear' ] ) && $args[ 'clear' ] ) )
                                    $after = '<div class="clear"></div>';
                    else
                                    $after = '';
                    $required = ( $args[ 'required' ] ) ? ' <abbr class="required" title="' . esc_attr__( 'required', 'woocommerce' ) . '">*</abbr>' : '';
                    switch ( $args[ 'type' ] ) {
                                    case "select":
                                                    $options = '';
                                                    if ( !empty( $args[ 'options' ] ) )
                                                                    foreach ( $args[ 'options' ] as $option_key => $option_text )
                                                                                    $options .= '<input type="radio" name="' . $key . '" id="' . $key . '" value="' . $option_key . '" ' . selected( $value, $option_key, false ) . 'class="select">' . $option_text . '' . "\r\n";
                                                    $field = '<p class="form-row ' . implode( ' ', $args[ 'class' ] ) . '" id="' . $key . '_field">
    <label for="' . $key . '" class="' . implode( ' ', $args[ 'label_class' ] ) . '">' . $args[ 'label' ] . $required . '</label>
    ' . $options . '
    </p>' . $after;
                                                    break;
                    } //$args[ 'type' ]
                    if ( $args[ 'return' ] )
                                    return $field;
                    else
                                    echo $field;
    }
    /**
     * Add the field to the checkout - Добавляем поле в оплату
     **/
    add_action( 'woocommerce_after_checkout_billing_form', 'shipping_type_field', 10 );
    function shipping_type_field( $checkout ) {
                    echo '<div id="shipping_type_field" >'  . '';
                    woocommerce_form_field_radio( 'shipping_type', array(
                                     'type' => 'select',
                                    'class' => array(
                                                     'shipping_type form-row-wide'
                                    ),
                                    'label' => __( 'Способ доставки' ),
                                    'placeholder' => __( '' ),
                                    'required' => true,
                                    'options' => array(
                                                    'Самовывоз' => 'Самовывоз<br/>',
                                                    'Новая почта склад' => 'Новая Почта, доставка до склада<br/>',
                                                    'Новая почта двери' => 'Новая Почта, доставка до адреса<br/>',
                                                    'Гюнсел' => 'Гюнсел'
                                                  )
                    ), $checkout->get_value( 'shipping_type' ) );
                    echo '</div>';
    }
    /**
     * Process the checkout - проверка на обязательность поля
     **/
    add_action( 'woocommerce_checkout_process', 'my_custom_checkout_field_process' );
    function my_custom_checkout_field_process( ) {
                    global $woocommerce;
                    // Check if set, if its not set add an error.
                    if ( !$_POST[ 'shipping_type' ] )
                                    $woocommerce->add_error( __( 'Пожалуйста, выберите способ доставки' ) );
    }
    /**
     * Update the order meta with field value - обновление данных заказа с учетом нового поля
     **/
    add_action( 'woocommerce_checkout_update_order_meta', 'shipping_type_field_update_order_meta' );
    function shipping_type_field_update_order_meta( $order_id ) {
                    if ( $_POST[ 'shipping_type' ] )
                                    update_post_meta( $order_id, 'Shipping type', esc_attr( $_POST[ 'shipping_type' ] ) );
    }
/**
* Display field value on the order edition page - отображение нового поля в админке
**/
add_action( 'woocommerce_admin_order_data_after_billing_address', 'shipping_type_field_display_admin_order_meta', 10, 1 );
function shipping_type_field_display_admin_order_meta($order){
echo '<p><strong>'.__('Способ доставки').':</strong> ' . $order->order_custom_fields['Shipping type'][0] . '</p>';
}
/**
* Add the field to order emails - добавить новое поле в e-mail-сообщение
**/
add_filter('woocommerce_email_order_meta_keys', 'my_woocommerce_email_order_meta_keys');
function my_woocommerce_email_order_meta_keys( $keys ) {
$keys['Способ доставки'] = 'shipping_type';
return $keys;
}
Код добавляет поле (радио-кнопки) и на страницу оформления заказа, и в заказ при просмотре его через админку, и в e-mail, который отправляется юзеру.
6. Настройка вариантов оплаты
Ну тут все просто, у меня настроено 3 варианта для оплаты - Безнал ("Предоплата на карту Приватбанка", причем реквизиты будут высылаться менеджером после согласования заказа), Чек ("Оплата наличными при получении"), Наличными ("Наложенный платеж"). По сути, никакой оплаты через сайт нету, просто в заказе будет виден нужный вариант.
7. Подключение скриптов и стилей
Сравнив страницы \cart и \checkout увидел, что в первой некорректно работает выбор вариантов оплаты посредством радио-кнопок (не отображаются выпадающие описания). Поковырявшись в html - коде этих двух страниц, можно увидеть, что в checkout подключено больше скриптов и стилей. Что ж, значит надо подключить их и для \cart.
Идем в wp-content\plugins\woocommerce\woocommerce.php, находим строчку 1177, где подключаются скрипты для \cart, начинается она с "if ( is_cart() )". Ниже видим такую же для чекаута "if ( is_checkout()" , вытягиваем из нее все недостающее и копипастим в "if ( is_cart() )". В итоге строки 1177-1185 имеют следующее содержание:
PHP:
        if ( is_cart() ) {
            wp_enqueue_script( 'wc-cart', $frontend_script_path . 'cart' . $suffix . '.js', array( 'jquery' ), $this->version, true );
            if ( $chosen_en ) {
                wp_enqueue_script( 'wc-chosen', $frontend_script_path . 'chosen-frontend' . $suffix . '.js', array( 'chosen' ), $this->version, true );
                wp_enqueue_style( 'woocommerce_chosen_styles', $this->plugin_url() . '/assets/css/chosen.css' );
            }
            wp_enqueue_script( 'wc-checkout', $frontend_script_path . 'checkout' . $suffix . '.js', array( 'jquery', 'woocommerce' ), $this->version, true );
            }

В итоге

Вот и все. В результате всех манипуляций получилось вот так:
Посмотреть вложение 371
Все работает, насколько я мог потестировать.

Жду конструктивной критики, возможно подсказок, что можно было бы сделать по-другому.
Добрый день. Совместил корзину по вашей методике. На данный момент все работает. Но сегодня столкнулся с такой ситуацией. Мою корзину не видит Вебвизор. Выдает

Невозможно воспроизвести посещение на данной странице. Возможные причины:
  • Не установлен код счётчика
  • Установлен запрет на отображение страницы во фрейме
Скажу сразу - код счетчика установлен. Я так понимаю причина в запрете на отображение страницы во фрейме. Как ее можно решить?
 
Сверху Снизу