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

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

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, я чайник, может смогли бы посказать где искать решение проблемы.
checkout-png.1594

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

Вложения

  • Checkout.png
    Checkout.png
    6.2 KB · Просмотры: 279
Последнее редактирование модератором:

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, я чайник, может смогли бы посказать где искать решение проблемы.
checkout-png.1594

Вроде у стандартного 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г.
 

dobryidesign

Новичок
Ребята, а подскажите как осуществить такую штуку?

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

Вложения

  • Без имени-3.jpg
    Без имени-3.jpg
    35.3 KB · Просмотры: 55

Mario

Новичок
Этот текст находится внутри плагина робокасы. Там один файл, найдете.
 

dobryidesign

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


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

Вложения

  • Checkout.jpg
    Checkout.jpg
    60.7 KB · Просмотры: 46
Последнее редактирование:

valerdos2109

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

Вложения

  • Корзина.png
    Корзина.png
    113.6 KB · Просмотры: 44

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

frabaaa

Новичок
Добрый день. Спасибо за данную тему. Очень помогла. У меня WordPress 4.3.1 с темой оформления The7.2. Большинство проблема я решил с помощью плагина WooCommerce Checkout Manager. Но у меня была проблема. Ужасно хотел удалить кнопку "Перейти к оформлению". Но нужного кода не нашел в файле cart.php. Нашел в proceed-to-checkout-button.php. Надеюсь кому-то поможет это.

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

Вложения

  • 2015-11-14_0-26-22.png
    2015-11-14_0-26-22.png
    24 KB · Просмотры: 43
  • 2015-11-14_0-25-05.png
    2015-11-14_0-25-05.png
    26.3 KB · Просмотры: 43
  • 2015-11-14_1-45-39.png
    2015-11-14_1-45-39.png
    78.4 KB · Просмотры: 43

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; ?>
должно работать.
 
  • Like
Реакции: D&B

Olesya

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

valerdos2109

Новичок
ПРОЛОГ
Данная тема создана давно. С тех пор многое менялось, обновлялся 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
Все работает, насколько я мог потестировать.

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

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