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

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

Stork.71

Гуру
Местный
ПРОЛОГ
Данная тема создана давно. С тех пор многое менялось, обновлялся 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 );
            }

В итоге

Вот и все. В результате всех манипуляций получилось вот так:
2014-01-09_104336.jpg
Все работает, насколько я мог потестировать.

Жду конструктивной критики, возможно подсказок, что можно было бы сделать по-другому.
 
Последнее редактирование:

neoff

Опытный
Здравствуйте, интересует как вы реализовали возможность: Безнал ("Предоплата на карту Приватбанка", причем реквизиты будут высылаться менеджером после согласования заказа)?
 

Stork.71

Гуру
Местный
Реквизиты будут высылаться вручную. Специфика товара (а соответственно и сайта) такова, что заказ лучше всегда уточнять, может что-то пересоветовать. Так что пообщались - отправили письмо.
В настройках безнала реквизиты не прописывал. Только заголовок "Предоплата на карту Приватбанка" и Сообщение клиенту "Оплата через систему Приват-24, либо через широкую сеть отделений или терминалов самообслуживания ПриватБанка. Платежные реквизиты Вы получите после оформления заказа. Обратите внимание, что мы не сможем оформить доставку или отгрузку заказа до появление платежа на нашем расчетном счете. После оплаты, пожалуйста, сообщите об этом посредством телефона или e-mail."
 

Stork.71

Гуру
Местный
"Мы в ответе за тех, кого приручили"​
Свершилось самое плохое, чего можно было ожидать: вышел новый WooCommerce 2.1 :) Как я и опасался, многие принципы и функции в нем работают совершенно не так, как в 2.0, поэтому все мои доработки перестали работать корректно. Вдруг кому интересно - ап темы с учетом новшеств 2.1. Да и чтоб никто случайно не пошел неверным путем. Все приведено почти к предыдущему состоянию.
Итак, отчет о проделанной работе. Если кому не очень интересно читать, но кто хочет мне помочь: в конце поста животрепещущий вопрос, буду очень благодарен за ответ!
1. Боремся с эндпоинтами.
Если раньше мы спокойно создавали одну страницу для оплаты и доставки, то теперь энпоинтты поменяли все в корне. Что ж, поборем.
1.1. Как и раньше, у нас должна быть одна страничка "Оформить заказ" с общим содержанием. Только теперь мы уберем из него весь описательный текст и оставим только шорткоды:
HTML:
[woocommerce_cart][hr][woocommerce_checkout]
1.2. Но рассказать-то пользователю, как пользоваться корзиной все равно надо! Придется лезть в код - спасибо Woo! Хотя в целом не страшно. Всего лишь редактируем functions.php
Код:
/**
* Добавим инструкции на странице корзины
**/
add_action( 'woocommerce_before_cart_table', 'add_instructions_before_cart' );
function add_instructions_before_cart() {
echo '<p style="text-align: justify;">Для того, чтобы оформить заказ, прежде всего проверьте, все ли товары, которые Вас интересуют, попали в корзину, а также проверьте количество. Введите свои контактные данные и реквизиты для доставки, выберите способ оплаты и доставки - и смело нажимайте "Разместить заказ". В ближайшее время наши сотрудники свяжутся с Вами. </p>';
}
2. Привязка к страницам в настройках WooCommerce
В настройках оплаты WC (wp-admin/admin.php?page=wc-settings&tab=checkout) не забываем прописать использование нашей страницы в качестве страницы корзины и страницы оплаты.
3. Убрать кнопку «перейти к оплате» из корзины и виджета корзины
Делаем все как и было описано выше.
4. Убрать кнопку «Оформить заказ» из меню
Здесь тоже в основном ничего не поменялось. НО...
4.2. Я решил пойти дальше немного. Захотелось скрывать не только "Оформить заказ", а и " 0 товаров – 0 грн. " (ссылка на корзину) но тогда, когда корзина пуста. То есть когда там что-то появится, то и кнопка эта появится. Для этого идем в www\wp-content\themes\wootique\includes\theme-woocommerce.php и находим там код
PHP:
function woocommerce_cart_link() {
    global $woocommerce;
    ?>
        <a href="<?php echo $woocommerce->cart->get_cart_url(); ?>" title="'<?php _e( 'View your shopping cart', 'woothemes' ); ?>'" class="cart-button">
            <span><?php echo sprintf(_n( '%d item &ndash; ', '%d items &ndash; ', $woocommerce->cart->get_cart_contents_count(), 'woothemes'), $woocommerce->cart->get_cart_contents_count()) . $woocommerce->cart->get_cart_total(); ?></span>
        </a>
    <?php
}
который меняем на другой, написанный по аналогии с кодом прячущегося "перейти к оплате"
Код:
function woocommerce_cart_link() {
    global $woocommerce;
    ?>
    <?php
    if (sizeof($woocommerce->cart->cart_contents)>0) :
        echo '<a href="'.$woocommerce->cart->get_cart_url().'" title="Просмотреть корзину" class="cart-button">    <span>' . sprintf(_n( '%d item &ndash; ', '%d items &ndash; ', $woocommerce->cart->get_cart_contents_count(), 'woothemes'), $woocommerce->cart->get_cart_contents_count()) . $woocommerce->cart->get_cart_total().'</span> </a>';
    endif;
    ?>
    <?php
}
5. Настройка полей данных о покупателе
Система WC 2.1 поменялась достаточно значительно (напремер, что особо важно, исчезла функция "сбора адреса доставки даже если не требуется") . Поначалу я пробовал их обмануть и привести к своему первоначальному виду, но потом решил делать все чуть-чуть по-другому, с меньшими вмешательствами но по итогу красиво.
5.1. Доставку отключаем полностью.
5.2. Редактируем отображаемые поля заказа
В настройках Saphali Woocommerce Lite идем в "Управление полями на странице заказа и на странице профиля". Я поля не удалял, просто поснимал флажок "опубликовать", оставив его только для следующих полей:
Реквизиты оплаты - Имя; Фамилия; Email-адрес; Телефон; Область, Район; Населенный пункт; а также shipping_adress_1, содержимое которого я поменял на такой текст:
HTML:
№ склада (при доставке до склада перевозчика); <br> Адрес доставки (при доставке до дверей)
5.4. Добавляем радио-кнопки для способов доставки
Код для радио-кнопок немного поменялся. Поменялось отображение в админке и в e-mail сообщении. Поменялось место, куда вставляется поле: вместо "после реквизитов оплаты" на "перед доп.полями", то есть во вторую колонку - для симметирии. Перед полем, опять же для красоты, добавился заголовок h3. Добавляем в 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_before_order_notes', 'shipping_type_field', 10 );
    function shipping_type_field( $checkout ) {
                    echo '<div id="shipping_type_field" >'  . '';
                    echo '<h3>Способ доставки</h3>';
                    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> ' . get_post_meta( $order->id, 'Shipping-type', true ) . '</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;
}
6. Настройка вариантов оплаты - ничего не поменялось
Ну тут все просто, у меня настроено 3 варианта для оплаты - Безнал ("Предоплата на карту Приватбанка", причем реквизиты будут высылаться менеджером после согласования заказа), Чек ("Оплата наличными при получении"), Наличными ("Наложенный платеж"). По сути, никакой оплаты через сайт нету, просто в заказе будет виден нужный вариант.
7. Скрипты
Правки не понадобились, в новой WC 2.1 скрипты подтянулись сами

Вот и все. Надеюсь кому понадобится.

А теперь внимание - ВОПРОС!

Возникла такая трабла: когда корзина пуста, попытки перейти в нее (/cart, /checkout) обращаются минутным туплением, после которого вылазит ошибка:
Firefox определил, что сервер перенаправляет запрос на этот адрес таким образом, что он никогда не завершится. Эта проблема может возникать при отключении или запрещении принятия кук.
После чистки куков поначалу работает, но до первого добавления-убирания товара из корзины, дальше все так же.
В чем может быть проблема?
В целом, это не сильно напрягает, поскольку пути попасть у юзера в пустую корзину ПОЧТИ нет (кроме прямого прописывания ссылки; или из полной корзины после уменшьшения товаров до 0 и обновления корзины), но все же...
 

rikitiki

Специалист
Местный
Спасибо за сообщение. Только всё равно непонятны эти енпойнды.
В редакторе меню через ссылки создаю http://mysite.ru/order-pay, обзываю "Оплатить", устанавливаю кнопкой в меню, добавляю товар в корзину, жму эту кнопку и пишет ничего не найдено.
Если жму дефолтную кнопку "Оплата" в странице которой шорт-код [woocommerce_checkout], то открывается нормально.
 

Stork.71

Гуру
Местный
Спасибо за сообщение. Только всё равно непонятны эти енпойнды.
В редакторе меню через ссылки создаю http://mysite.ru/order-pay, обзываю "Оплатить", устанавливаю кнопкой в меню, добавляю товар в корзину, жму эту кнопку и пишет ничего не найдено.
Если жму дефолтную кнопку "Оплата" в странице которой шорт-код [woocommerce_checkout], то открывается нормально.
Я так понял, должно endpoint'ы ДОБАВЛЯЮТСЯ к пути основной страницы. То есть по идее должно быть http://mysite.ru/checkout/order-pay. Попробуйте!
 

rikitiki

Специалист
Местный
Отредактировал адрес, всё равно не работает, можете убедиться:
http://santa.besaba.com/
"Оплата" с шорт-кодом работает, а "Оплатить", с endpoint в адресе, нет.
Вообще ни один endpoint не работает. Может они действуют только на woo темы?
У них кстати шорткоды делятся.
Есть общие, которые работают в любых темах, а есть работающие только в woo темах.
Для последних в редакторах woo тем даже кнопка дополнительная шорткодная есть.
И вообще непонятен их замысел endpoint-ами. Если к примеру страницу с шорткодом я могу редактировать-добавлять контент до и после шорткода, то страницу с endpoint как редактировать? Добавлять контент в functions.php? Ерунда какая-то.
 
Последнее редактирование:

tutsnew

Форумчанин
А не проще перепрыгнуть через корзину плагином http://wordpress.org/plugins/woocommerce-direct-checkout/ , а на страницу Checkout добавить шорткод [woocommerce_cart], ну и саму страничку checkout настроить под себя плагином http://wordpress.org/plugins/woocommerce-checkout-manager/screenshots/ или https://wordpress.org/plugins/saphali-woocommerce-lite/
Получается очень даже ничего примерно похожее на ваши изменения.
 

Stork.71

Гуру
Местный
А не проще перепрыгнуть через корзину плагином http://wordpress.org/plugins/woocommerce-direct-checkout/ , а на страницу Checkout добавить шорткод [woocommerce_cart], ну и саму страничку checkout настроить под себя плагином http://wordpress.org/plugins/woocommerce-checkout-manager/screenshots/ или https://wordpress.org/plugins/saphali-woocommerce-lite/
Получается очень даже ничего примерно похожее на ваши изменения.
1. директ чекаут переписывает поведение по кнопке "в корзину" (к скрипту обновления корзины добавляет редирект), а меня оно вполне устраивает. Директ чекаут - это не то совсем. Все равно куча ссылок остается (виджет, cart-tab, кнопка в меню).

2. Чекаут под себя как раз и настраивал при помощи "sapрali wc lite" (п. 5.2). Но он не дает возможности добавлять поля типа "radio". Их я добавлял вручную. woocommerce-checkout-manager добавляет radio только в ПРО версии.
на самом деле, если бы я делал все это сейчас, то вряд ли стал бы заморачиваться с радио-кнопками, удовлетворился бы выпадающем полем. Но эту функцию saphali добавили только недавно (после того, ка я у них об этом спросил :) ) А раз код уже есть, на его наладку потрачено время, и radio более приятны чем select - то зачем что-то менять?
 

Stork.71

Гуру
Местный
Отредактировал адрес, всё равно не работает, можете убедиться:
http://santa.besaba.com/
"Оплата" с шорт-кодом работает, а "Оплатить", с endpoint в адресе, нет.
Вообще ни один endpoint не работает. Может они действуют только на woo темы?
У них кстати шорткоды делятся.
Есть общие, которые работают в любых темах, а есть работающие только в woo темах.
Для последних в редакторах woo тем даже кнопка дополнительная шорткодная есть.
И вообще непонятен их замысел endpoint-ами. Если к примеру страницу с шорткодом я могу редактировать-добавлять контент до и после шорткода, то страницу с endpoint как редактировать? Добавлять контент в functions.php? Ерунда какая-то.
Насколько я понял, order-pay работает при подключении платежных шлюзов (сам не пробовал). У вас только чеки и безнал, то есть оплата проходит не через сайт, а просто высылаются реквизиты, а оплачивает юзер сам через банк. То есть order-pay'у нечего показывать!
ссылка в меню прописана неправильно: не http://santa.besaba.com/order-pay а http://santa.besaba.com/oformit/order-pay/ По правильной ссылке вылазит просто чекаут, скорее всего так и должно быть - ну а что еще ему показывать??? Эндпоинт ДОБАВЛЯЕТСЯ к своей основной странице, а не главной для сайта (для order-pay основная страница - это чекаут, в Вашем случае - /oformit) Исключением является эндпоинт профиля "выход", он вообще очень классно работает: ссылка не отображается, если пользователь не залогинен!
 

Zaknafain

Опытный
Местный
Насколько я понял, order-pay работает при подключении платежных шлюзов (сам не пробовал). У вас только чеки и безнал, то есть оплата проходит не через сайт, а просто высылаются реквизиты, а оплачивает юзер сам через банк. То есть order-pay'у нечего показывать!
ссылка в меню прописана неправильно: не http://santa.besaba.com/order-pay а http://santa.besaba.com/oformit/order-pay/ По правильной ссылке вылазит просто чекаут, скорее всего так и должно быть - ну а что еще ему показывать??? Эндпоинт ДОБАВЛЯЕТСЯ к своей основной странице, а не главной для сайта (для order-pay основная страница - это чекаут, в Вашем случае - /oformit) Исключением является эндпоинт профиля "выход", он вообще очень классно работает: ссылка не отображается, если пользователь не залогинен!
а вот у меня тут 2 вопроса: первый "5.3. Прячем чекбокс «отправка по реквизитам оплаты»" я так понял это убрать где адрес доставки галочку и что бы автоматом этот адрес шел в заказ? так вот у меня не получается через custom.css такое сделать...
и второе : после того как убрал кнопку в корзине оформить заказ (удаляя часть кода) пропала кнопочка и обновить корзину :(
чего я не так делаю? :cry:
 

Stork.71

Гуру
Местный
первый "5.3. Прячем чекбокс «отправка по реквизитам оплаты»" я так понял это убрать где адрес доставки галочку и что бы автоматом этот адрес шел в заказ? так вот у меня не получается через custom.css такое сделать...
В новой версии (под WC 2.1) этого делать не надо, там чекбокс вообще не всплывает когда отключаешь доставку. Ради спортивного интереса: правой кнопкой по чекбоксу, исследовать элемент. Далее находим как он называется (вроде
ship-to-different-address-checkbox) и прописываем другой код:
Код:
#ship-to-different-address-checkbox {display:none;}
и второе : после того как убрал кнопку в корзине оформить заказ (удаляя часть кода) пропала кнопочка и обновить корзину
Видимо удалили лишнего! Должно было остаться
PHP:
 <input type="submit" class="button" name="update_cart" value="<?php _e( 'Update Cart', 'woocommerce' ); ?>" />
 

Zaknafain

Опытный
Местный
В новой версии (под WC 2.1) этого делать не надо, там чекбокс вообще не всплывает когда отключаешь доставку. Ради спортивного интереса: правой кнопкой по чекбоксу, исследовать элемент. Далее находим как он называется (вроде
ship-to-different-address-checkbox) и прописываем другой код:
Код:
#ship-to-different-address-checkbox {display:none;}

Видимо удалили лишнего! Должно было остаться
PHP:
 <input type="submit" class="button" name="update_cart" value="<?php _e( 'Update Cart', 'woocommerce' ); ?>" />
по поводу чекбокса уже разобрался (я делал по инструкции на старую версию, не заметил в коментах новую инструкцию:rolleyes:) сейчас все делаю по новой ) а можете скриншот прислать, как сейчас у Вас все выглядит в корзине?:)
 

Zaknafain

Опытный
Местный
В новой версии (под WC 2.1) этого делать не надо, там чекбокс вообще не всплывает когда отключаешь доставку. Ради спортивного интереса: правой кнопкой по чекбоксу, исследовать элемент. Далее находим как он называется (вроде
ship-to-different-address-checkbox) и прописываем другой код:
Код:
#ship-to-different-address-checkbox {display:none;}

Видимо удалили лишнего! Должно было остаться
PHP:
 <input type="submit" class="button" name="update_cart" value="<?php _e( 'Update Cart', 'woocommerce' ); ?>" />
После того как корзина спрятана, добавляя в нее товар, что бы она появилась, приходится перезагружать страницу... а есть ли вариант сделать так, что бы как только добавлялся товар корзина появлялась в том месте где она скрыта?
 

Stork.71

Гуру
Местный
После того как корзина спрятана, добавляя в нее товар, что бы она появилась, приходится перезагружать страницу... а есть ли вариант сделать так, что бы как только добавлялся товар корзина появлялась в том месте где она скрыта?
у меня работает нормально. У Вас тема Вутик?
 

Zaknafain

Опытный
Местный
у меня работает нормально. У Вас тема Вутик?
да тема вутикю...вот что вышло http://sunfrozen.ru/ корзина появляется только если товар добавляется из описания, то есть со страницы самого товара, а если с главной страницы добавлять то корзина появляется только после перезагрузки :(
 

Stork.71

Гуру
Местный
А, понял в чем дело. При добавлении из карточки товара страница обновляется, соответственно идет заново проверка условий на показывание/непоказывание кнопки. При добавлении со страницы каталога запускается скрипт и страница не обновляется, соответственно и вкладка не появляется. Как с этим правильно бороться - не знаю, мне в голову не приходит, то есть скорее всего не очень просто :)
Просто у меня добавление в корзину из каталога скрыто, поэтому такой проблемы не возникает.
 
Сверху Снизу