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

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

Image CMS

bodiaka

Новичок
Ну тогда для Вас подниму и разовью тему :)

Совмещение корзины и оплаты - WP 4.0, WC 2.2
После последнего апа Wordpress 4.0 и Woocommerce 2.2 боялся что все слетит, и готовился к наихудшему. Тем не менее, все осталось работать, проблемы возникли только с потерей переводов, но они решаются достаточно легко.
Тем не менее, на работу я был настроен, поэтому кое-чего решил поменять. А именно - решил все-таки вернуться к родной доставке. Во-первых, не везде удобно отображались сведения о доставке, с заказами работать не очень удобно. Во-вторых, были лишние правки в ядре. В-третьих, в новых версиях стало попроще в плане совместимости: стало работать то, что раньше не хотело.

В общем, вернулся я к родной доставке. Включил ее, настроил интересующие меня варианты. По факту, у меня включен самовывоз, а также "Единая ставка", в которую я закинул кучу нужных вариантов.
Цену в зависимости от доставки я не меняю: стоимость доставки покупатель оплачивает перевозчику, сколько она выйдет - я не знаю. Но глаза мозолили ярлыки "Бесплатно!", их убил небольшим кодом (добавляем в functions.php)
PHP:
/**
* Переписываем функцию формирования полной лейбы для методов доставки с ценой чтобы не выводилась надпись (Бесплатно!)
**/
add_filter ('woocommerce_cart_shipping_method_full_label', 'wc_cart_totals_shipping_method_label_nofree', 10, 2);
function wc_cart_totals_shipping_method_label_nofree( $label, $method ) {
    $label = $method->label;

    if ( $method->cost > 0 ) {
        if ( WC()->cart->tax_display_cart == 'excl' ) {
            $label .= ': ' . wc_price( $method->cost );
            if ( $method->get_shipping_tax() > 0 && WC()->cart->prices_include_tax ) {
                $label .= ' <small>' . WC()->countries->ex_tax_or_vat() . '</small>';
            }
        } else {
            $label .= ': ' . wc_price( $method->cost + $method->get_shipping_tax() );
            if ( $method->get_shipping_tax() > 0 && ! WC()->cart->prices_include_tax ) {
                $label .= ' <small>' . WC()->countries->inc_tax_or_vat() . '</small>';
            }
        }
    } elseif ( $method->id !== 'free_shipping' ) {
        $label .= ' ';
    }
     return $label;
}
Мой хитрый код для добавления своего поля "доставка" пока больше не нужен (но может еще когда пригодится? :) ), поэтому мы его смело убиваем.

Захотелось мне глобально "уплотнить" оформление заказа, поэтому начнем с того, что всунем родные радиобатоны доставки рядышком с полями, которые пользователь заполняет при оформлении заказа.

Берем файлик \wp-content\plugins\woocommerce\templates\checkout\review-order.php , копируем его в wp-content\themes\wootique-child\woocommerce\checkout\ (папка с темой)
удаляем оттуда код <?php wc_cart_totals_shipping_html(); ?> (после <?php do_action( 'woocommerce_review_order_before_shipping' ); ?>)


Берем файлик \wp-content\plugins\woocommerce\templates\checkout\form-shipping.php , копируем в wp-content\themes\wootique-child\woocommerce\checkout\
вставляем туда код <h3>Способ доставки</h3> <?php wc_cart_totals_shipping_html(); ?> (после <?php do_action( 'woocommerce_before_order_notes', $checkout ); ?>)

Теперь выбор доставки переехал, но остались кругленькие маркеры. Уберем их с помощью стилевых свойств (custom.css):
#shipping_method {list-style: none; margin: 0 0 0.9em 0; }

Внизу остались только варианты оплаты, поэтому надо переименовать заголовок.
wp-content\themes\wootique-child\woocommerce\checkout\form-checkout.php (скопировал)
Находим строку
<h3 id="order_review_heading"><?php _e( 'Your order', 'woocommerce' ); ?></h3>
И меняем на
<h3 id="order_review_heading">Способ оплаты:</h3>
Можно было бы сделать и через локализацию, но тогда потянутся другие места, где используется данная фраза.

Дальше, немного уплотним кусок старой "корзины", убрав оттуда табличку с расчетом суммы заказа.
Идем в \wp-content\themes\wootique-child\woocommerce\cart\cart.php (скопированный), и убираем внизу <?php woocommerce_cart_totals(); ?> (после <?php do_action( 'woocommerce_cart_collaterals' ); ?>).
Таблицу убрали, но общую сумму заказа надо ведь где-нибудь видеть! Поэтому внизу, после таблички с товарами добавим еще одну строчку, вставив перед do_action( 'woocommerce_cart_contents' ); следующий код:
HTML:
  ?><tr>
  <td>&nbsp;</td>
  <td>&nbsp;</td>
  <td>&nbsp;</td>
  <td>&nbsp;</td>
  <td><b>Общая сумма:</b></td>
  <td><?php wc_cart_totals_subtotal_html(); ?></td>
  </tr><?php
К чему все это? У меня нет купонов, нет суммы доставки, налогов и других составляющих суммы заказа, поэтому длинные таблицы с расчетами всего этого мне не нужны. Просто избавимся от них, сделав страницу лаконичне и проще.

Ну и да, как обычно правим локализацию:

Локализация woocommerce: (\wp-content\languages\plugins\woocommerce-ru_RU.po)
Shipping and Handling вместо «Доставка и обработка» сделал «Выберите способ доставки:»
Billingaddress
вместо «Адрес оплаты» сделал «Адрес доставки» (заголовок в e-mailсообщении)

Локализация saphali_wc_lite : (\wp-content\plugins\saphali-woocommerce-lite\languages\woocommerce-ru_RU.po)
BillingAddress вместо «Реквизиты для оплаты» сделал «Адрес доставки
Billing &amp; Shipping вместо «Платежные данные и доставка» сделал «Реквизиты покупателя» (надпись в корзине)

В результате имеем вот что:
Посмотреть вложение 952

http://akip.com.ua/checkout/

такой вопрос...а если тема другая..у меня стандартная Twenty Twelve и там в папке темы нету woocommerce\checkout\ (папка с темой)....куда тогда забрасывать review-order.php...?...хелп!
 

Stork.71

Гуру
Местный
Ну, так включите ХОТЯ БЫ ОДИН способ оплаты!!!
З,Ы.: Вы издеваетесь? В первом посте - 3 одинаковых полноразмерных скриншота одной страницы. Во втором - вложенный pdf в перевернутом виде. Нормально заскринить и выложить сложно?
 

Stork.71

Гуру
Местный
такой вопрос...а если тема другая..у меня стандартная Twenty Twelve и там в папке темы нету woocommerce\checkout\ (папка с темой)....куда тогда забрасывать review-order.php...?...хелп!
Вам надо СОЗДАТЬ эту папку. По умолчанию эти файлы лежать просто в файлах плагина woocommerce. Но если Вы стоздаете папку woocommerce в теме, то сайт начинает подтягивать шаблоны из этой папки.
 

bodiaka

Новичок
Вам надо СОЗДАТЬ эту папку. По умолчанию эти файлы лежать просто в файлах плагина woocommerce. Но если Вы стоздаете папку woocommerce в теме, то сайт начинает подтягивать шаблоны из этой папки.
Спасибо!..все практически получилось..единственное непонятно на каком этапе пропало вот это...и как от него избавится
 

Вложения

Stork.71

Гуру
Местный
Спасибо!..все практически получилось..единственное непонятно на каком этапе пропало вот это...и как от него избавится
Ваши слова можно трактовать по-разному, поэтому распишите более подробно и точно - у кого что куда пропало? Как у Вас было, как стало, как должно быть?
 

bodiaka

Новичок
Ваши слова можно трактовать по-разному, поэтому распишите более подробно и точно - у кого что куда пропало? Как у Вас было, как стало, как должно быть?
точно блин..извините))....у вас пропало...у меня осталось как на скриншоте....хотя делал все по мануалу....хочу что бы пропало
 
неа..вернее как...делал все как в инструкциях по вашей ссылке..но остаточным явлением после способа оплаты осталась табличка с товаром и сумой покупки....как бы ее убрать и привести к виду как у вас на скриншоте...тоисть..заголовок "Способ оплаты"..и сразу радиобутоны с выбором?
 

Stork.71

Гуру
Местный
Ага, понял, я почему-то забыл описать часть своих действий. Исправился уже. :)

Берем файлик \wp-content\plugins\woocommerce\templates\checkout\review-order.php , копируем его в wp-content\themes\wootique-child\woocommerce\checkout\ (папка с темой)
вырезаем оттуда код <?php wc_cart_totals_shipping_html(); ?> (после <?php do_action( 'woocommerce_review_order_before_shipping' ); ?>) он нам пригодится в другом месте
После этого можно удалить большой кусок кода - итоговую таблицу <table class="shop_table"> (заканчивая закрывающим тегом </table> ). Она нам не понадобится, так как мы все это видим выше.
 
Ага, понял, я почему-то забыл описать часть своих действий. Исправился уже. :)

Берем файлик \wp-content\plugins\woocommerce\templates\checkout\review-order.php , копируем его в wp-content\themes\wootique-child\woocommerce\checkout\ (папка с темой)
вырезаем оттуда код <?php wc_cart_totals_shipping_html(); ?> (после <?php do_action( 'woocommerce_review_order_before_shipping' ); ?>) он нам пригодится в другом месте
После этого можно удалить большой кусок кода - итоговую таблицу <table class="shop_table"> (заканчивая закрывающим тегом </table> ). Она нам не понадобится, так как мы все это видим выше.
СПАСИБО!...теперь то что доктор прописал)...хотя стремно было эту таблицу удалять....весь код что был в файлике фактически)))
 
Добрый день!

Stork.71, большое Вам спасибо за всю эту ветку!

После обновления WC с 2.1 до 2.3.5, как и следовало ожидать, на странице опять вылезла кнопка "Перейти к оплате".

Искомый код в cart.php исчез. Я использую тему Weaver II, поэтому правка css, приведённая в ветке, скорее всего не для меня. Пришлось искать по всему каталогу плагина с использованием ключевого текста "Proceed to Checkout".

Была найдена строка № 1132 (если использовать Notepad++) в файле wp-content/plugins/woocommerce/includes/wc-template-functions.php

Код следующий:
PHP:
<a href="<?php echo $checkout_url; ?>" class="checkout-button button alt wc-forward"><?php _e( 'Proceed to Checkout', 'woocommerce' ); ?></a>
Строчку удалил, кнопка снова исчезла.

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

А в файле с говорящим названием wp-content/plugins/woocommerce/includes/wc-template-hooks.php, возможно со временем удастся найти нужный хук.

Осталось найти время со всем этим поэкспериментировать....
 
Последнее редактирование:

bessel

Новичок
Осталось найти время со всем этим поэкспериментировать....
Далек от темы работы с плагинами, но решил проблему следующим образом.
В озвученном выше файле есть функция woocommerce_proceed_to_checkout.
Где-то в недрах добавляется хук : add_action.
Добавил в functions.php темы сниппет:
remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 10 );
Кнопка исчезла.
 

ryder

Новичок
Stork.71, большое спасибо за столь подробный гайд, все работает как часы.
Но возникла небольшая проблема с купонами, которую вы не затронули, потому что в вашем магазине купоны не используются.
Суть в следующем.
Совмещенная страница корзины и оформления заказа у меня выглядит следующим образом. Левый блок - [woocommerce_cart], правый - [woocommerce_checkout].
cart.jpg

Если ввести код купона и нажать "применить", страница перезагружается и выглядит так. Пока все ок.
coupon-enabled.jpg

Дальше начинается суть проблемы. Если попытаться купон убрать (нажать соответствующую ссылку), то процесс удаления происходит без перезагрузки страницы, и после удаления все выглядит так:
coupon-removed.jpg

На деле купон удален, но в левой части страницы он все еще висит как примененный, также небольшой косяк в том, что сообщение об удалении купона появляется в правой части страницы (она же [woocommerce_checkout]), а не в левой, что было бы предпочтительнее.
Проблема вывода сообщения не в том месте остро не стоит. В принципе, можно просто отключить вывод этих сообщений, и без них ок.

Корень проблемы не удаляющейся строчки купона я вижу в том, что страница при удалении купона не перезагружается, а обновляется в фоновом режиме, причем обновляется исключительно правая часть [woocommerce_checkout], из-за чего в [woocommerce_cart] изменения не отражаются.
Пробовал отключить ajax при удалении купона правкой файла woocommerce/includes/class-wc-ajax.php. Правил строку 'remove_coupon' => true на 'remove_coupon' => false , но безрезультатно, все равно в фоновом режиме обновляется.

Есть идеи, как решить эту проблему? Буду благодарен за помощь.
 
Последнее редактирование:

Stork.71

Гуру
Местный
А если нажать кнопку "обновить корзину"?
Как вообще это работает при несовмещенной корзине?
Чтобы пофиксить надо скорее всего глубже копаться. Сейчас на это нет времени и желания :) Если найдете решение - отпишитесь пожалуйста.
 

ryder

Новичок
А если нажать кнопку "обновить корзину"?
Как вообще это работает при несовмещенной корзине?
Чтобы пофиксить надо скорее всего глубже копаться. Сейчас на это нет времени и желания :) Если найдете решение - отпишитесь пожалуйста.
Если после удаления купона нажать "обновить корзину", то после обновления становится как и должно быть, купона нет.

Решение нашел, но частичное. Если добавить вот эту конструкцию в functions.php,
PHP:
function disable_checkout_script(){
    wp_dequeue_script( 'wc-checkout' );
}
add_action( 'wp_enqueue_scripts', 'disable_checkout_script' );
то купон удаляется нормально, как должен.
Эта функция отключает аякс на странице чекаута. Раньше страница при удалении купона не перезагружалась, а сейчас перезагружается. Как я и предполагал, проблема этим решается.
Но дело в том, что эта функция отключает вообще весь аякс на странице, в частности, проверку введенных в форму заказа данных. А эту функцию я хочу сохранить. Поэтому буду копать дальше, хочу найти способ отключить аякс только при добавлении/удалении купона.

Будет результат - обязательно напишу решение ;)
 
Сверху Снизу