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

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

Zaknafain

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

galiulinr

Опытный
Местный
#26
Я все сделал как написано, все работает но как и у автора есть проблема. Если в корзине удалить товар то это приводит к ошибке в Хроме: На этой странице обнаружена циклическая переадресация в Мозиле: Firefox определил, что сервер перенаправляет запрос на этот адрес таким образом, что он никогда не завершится. Я думаю это серьезный косяк, надо как то исправить. Ведь покупатель у нас может передумать и удалить некоторые товары которые он выбрал. Есть у кого мысли по этому поводу?
При оплате Робокассой в режиме тестирования такая же проблема при нажатии Отказ от платежа.

Решил проблему как писали в посте #8 с помощью плагина WooCommerce Direct Checkout переадресовал на страницу Оплата, а на странице Оплата добавил шорткод Корзины. Теперь все удаляется из корзины и Робокасса работает

Да кстати шорткод Оплаты нужно также на страницу Корзина, иначе при нажатии в меню корзина будет отсутствовать кнопка перейти к оплате). Получается что у нас и в корзине и в оплате везде одинаковая форма. Я протестировал все работает товар с корзины удаляется, платеж через Робокассу отменяется. Вариант рабочий можно пользоваться.
 
Последнее редактирование:
#27
В целом все утраивает - не планирую таких глобальных изменений, перечитала все комменты, но вот где поменять надпись на странице "Оплата" - "Детали оплаты" на "Оформить заказ" так и не поняла.
 

galiulinr

Опытный
Местный
#28
В целом все утраивает - не планирую таких глобальных изменений, перечитала все комменты, но вот где поменять надпись на странице "Оплата" - "Детали оплаты" на "Оформить заказ" так и не поняла.
Качаем Рoedit http://poedit.net/download.php#win32 в папке i18n/languages плагина woocommerce находим файл woocommerce-ru_RU.po открываем его с помощью Рoedit далее ctrl+f в поле поиска вбиваем Billing Address находим его и в низу в окне меняем "Детали оплаты" на "Контактные данные" далее сохранить и файл woocommerce-ru_RU.po и в месте с файлом woocommerce-ru_RU.mo поновой залить на сайт в тоже место откуда взяли.
 
Последнее редактирование:

Stork.71

Гуру
Местный
#29
Решил проблему как писали в посте #8 с помощью плагина WooCommerce Direct Checkout переадресовал на страницу Оплата, а на странице Оплата добавил шорткод Корзины. Теперь все удаляется из корзины и Робокасса работает
Если Вас устраивает, что вместо просто добавления в корзину у вас идет еще и переадресация на страницу корзины - то однозначно WooCommerce Direct Checkout это абсолютно правильное решение, а главное - 100% рабочее (вроде негативных отзывов не было) решение, и не надо ни с чем заморачиваться и сочинять велосипеды!
Правда все же интересно, почему с Direct Checkout все работает, а при способе как у меня - не очень. Мне немного не хватает понимания того, как работает движок, что куда он кидает и почему начинается циклическая переадресация. Надеюсь, позже разберусь.
 

Stork.71

Гуру
Местный
#30
Продолжаю свои копания :)

Пытаюсь справиться с багом циклической переадресации при попадании на \checkout с пустой корзиной. Работает это как: при переходе на чекаут проверяется корзина, если она пуста - идет редирект на страницу корзины, на которой уже выводится содержание корзины, но так как она пуста, то выводится сообщение "корзина пустая....." В моей же модификации код опять натыкается на чекаут и зацикливается. Логично предположить, что вылечить поможет убирание редиректа, правда найти его непросто :)

После долгих поисков нашел файлик \woocommerce\includes\wc-template-functions.php и в нем функцию wc_template_redirect(), которая в числе прочего содержит конструкцию, отвечающая за редирект в данном случае:
Код:
  // When on the checkout with an empty cart, redirect to cart page
   elseif ( is_page( wc_get_page_id( 'checkout' ) ) && sizeof( WC()->cart->get_cart() ) == 0 && empty( $wp->query_vars['order-pay'] ) && ! isset( $wp->query_vars['order-received'] ) ) {
     wp_redirect( get_permalink( wc_get_page_id( 'cart' ) ) );
     exit;
   }
Удалил этот кусок и - о чудо! - все заработало! Редирект не происходит, но поскольку у нас страница чекаут выглядит как [woocommerce_cart][hr][woocommerce_checkout] , то в итоге от первой части [woocommerce_cart] подтягивается сообщение о пустой корзине, а вторая остается пустой - то есть страничка получается красивенькая.
Можно было бы оставить это в качестве окончательного решения проблемы, и пока что я так и сделал, но не забываем, что мы редактируем файлы ядра, а значит потеряем это все при первом же обновлении.

Хочется сделать все через functions.php.

Полностью наш кусок кода, задающий всякие-разные редиректы в wc-template-functions.php, выглядит так:
PHP:
/**
* Handle redirects before content is output - hooked into template_redirect so is_page works.
*
* @return void
*/
function wc_template_redirect() {
    global $wp_query, $wp;

    // When default permalinks are enabled, redirect shop page to post type archive url
    if ( ! empty( $_GET['page_id'] ) && get_option( 'permalink_structure' ) == "" && $_GET['page_id'] == wc_get_page_id( 'shop' ) ) {
        wp_safe_redirect( get_post_type_archive_link('product') );
        exit;
    }

    // When on the checkout with an empty cart, redirect to cart page
    elseif ( is_page( wc_get_page_id( 'checkout' ) ) && sizeof( WC()->cart->get_cart() ) == 0 && empty( $wp->query_vars['order-pay'] ) && ! isset( $wp->query_vars['order-received'] ) ) {
        wp_redirect( get_permalink( wc_get_page_id( 'cart' ) ) );
        exit;
    }

    // Logout
    elseif ( isset( $wp->query_vars['customer-logout'] ) ) {
        wp_redirect( str_replace( '&', '&', wp_logout_url( get_permalink( wc_get_page_id( 'myaccount' ) ) ) ) );
        exit;
    }

    // Redirect to the product page if we have a single product
    elseif ( is_search() && is_post_type_archive( 'product' ) && apply_filters( 'woocommerce_redirect_single_search_result', true ) && $wp_query->post_count == 1 ) {
        $product = get_product( $wp_query->post );

        if ( $product->is_visible() ) {
            wp_safe_redirect( get_permalink( $product->id ), 302 );
            exit;
        }
    }

    // Ensure payment gateways are loaded early
    elseif ( is_add_payment_method_page() ) {

        WC()->payment_gateways();

    }

    // Checkout pages handling
    elseif ( is_checkout() ) {
        // Buffer the checkout page
        ob_start();

        // Ensure gateways and shipping methods are loaded early
        WC()->payment_gateways();
        WC()->shipping();
    }
}
add_action( 'template_redirect', 'wc_template_redirect' );
Конструкция add_action( 'template_redirect', 'wc_template_redirect' ) как бы намекает, что это все можно легко поменять через functions.php.
Попробовал добавить в functions.php следующий код:
PHP:
/* Переопределим функцию, отвечающую за редиректы, чтобы убрать из нее редирект из чекаута при пустой корзины (убираем зацикливание) */
/* оригинал функции - wc-template-functions.php */

/**
* Handle redirects before content is output - hooked into template_redirect so is_page works.
*
* @return void
*/
function my_wc_template_redirect() {
    global $wp_query, $wp;

    // When default permalinks are enabled, redirect shop page to post type archive url
    if ( ! empty( $_GET['page_id'] ) && get_option( 'permalink_structure' ) == "" && $_GET['page_id'] == wc_get_page_id( 'shop' ) ) {
        wp_safe_redirect( get_post_type_archive_link('product') );
        exit;
    }

    // Logout
    elseif ( isset( $wp->query_vars['customer-logout'] ) ) {
        wp_redirect( str_replace( '&', '&', wp_logout_url( get_permalink( wc_get_page_id( 'myaccount' ) ) ) ) );
        exit;
    }

    // Redirect to the product page if we have a single product
    elseif ( is_search() && is_post_type_archive( 'product' ) && apply_filters( 'woocommerce_redirect_single_search_result', true ) && $wp_query->post_count == 1 ) {
        $product = get_product( $wp_query->post );

        if ( $product->is_visible() ) {
            wp_safe_redirect( get_permalink( $product->id ), 302 );
            exit;
        }
    }

    // Ensure payment gateways are loaded early
    elseif ( is_add_payment_method_page() ) {

        WC()->payment_gateways();

    }

    // Checkout pages handling
    elseif ( is_checkout() ) {
        // Buffer the checkout page
        ob_start();

        // Ensure gateways and shipping methods are loaded early
        WC()->payment_gateways();
        WC()->shipping();
    }
}
remove_action('template_redirect', 'wc_template_redirect');
add_action('template_redirect', 'my_wc_template_redirect');
Но, к сожалению, такой код не работает. Казалось бы (как мне кажется), он должен сначала убирать родную функцию wc_template_redirect, а потом добавлять мою новую my_wc_template_redirect. Но почему-то, старая функция остается, зацикливание не исчезает.
Никто не знает, в чем может быть ошибка?
 

Stork.71

Гуру
Местный
#31
Ап. Сам же и нашел решение.
Проблема была в том, что у меня дочерняя тема, поэтому мой functions.php грузится раньше, чем все остальное, и вешать нужные переопределения функций нужно на другие хуки, исполняемые после того, как уже подгрузились редиректы. в общем, вместо последних двух строчек (remove_action; add_action...) вставил такую конструкцию:
PHP:
add_action('init','removeOldRedirectFunction');
function removeOldRedirectFunction(){
    remove_action( 'template_redirect', 'wc_template_redirect' );
    add_action('template_redirect', 'my_wc_template_redirect');
}
Если у кого есть возможность, проверьте работоспособность кода - того, что постом выше если у Вас правки в основной теме, и того, что в этом посте, если у Вас правки в дочерней теме. Для пробы попытаться открыть страницу чекаута при пустой корзине (должна быть пустой по идее), а также попробовать вбить в поиск товар с его точным названием (должен произойти редирект сразу на страницу товаров, без страницы результатов поиска). Таким образом, можно проверить и отключение родной функции редиректа, и подключиение измененной.
 
Последнее редактирование:

tutsnew

Форумчанин
#32
У меня вопрос. Если в настройках доставки указать "Доставка по адресу платежа по умолчанию" и "Доставка только по платежным адресам пользователей", то на странице оплаты вместо чекбокса "Доставка по другому адресу?" вылазит поле
"Дополнительная информация". Каким инструментом можно убрать этот блок без правки кода и таблицы стилей? Спасибо.
Ссылка на страницу
 

galiulinr

Опытный
Местный
#33
Каким инструментом можно убрать этот блок без правки кода и таблицы стилей?
Я только правкой в стиле убираю такие блоки, быстрее получается чем искать) div.woocommerce-shipping-fields {display: none;}
 

Stork.71

Гуру
Местный
#34
У меня вопрос. Если в настройках доставки указать "Доставка по адресу платежа по умолчанию" и "Доставка только по платежным адресам пользователей", то на странице оплаты вместо чекбокса "Доставка по другому адресу?" вылазит поле
"Дополнительная информация". Каким инструментом можно убрать этот блок без правки кода и таблицы стилей? Спасибо.
Ссылка на страницу
насколько я помню, в последней версии WC если настройки доставки выставлены как Вы написали, то галочки этой быть вообще не должно, и надписи меняются (вместо "реквизитов оплаты" что-то типа "сведения о покупателе" или "контактная информация", как-то так.)
 

tutsnew

Форумчанин
#35
Нет, и в последней версии WC, если включить чеки, описанные выше, отображается просто заголовок <H3> "Дополнительная информация", а под ней ничего - ни чеков, ни полей. Совет galiulinr помог.
 

tutsnew

Форумчанин
#37
Точно уже не скажу, т.к. делал косметику в полях с помощью сафали лайт. Да уже и не важно, спасибо
 

ADv

Гуру
Местный
#38
Ув. Stork.71
Подскажите, можно ли Ваш код с радиокнопками для способов доставки адаптировать и использовать не через функции?
Пытаюсь реализовать пошаговое оформление заказа. Все как бы получилось, за исключением того, что использовал для вывода списка способов следующий код
Код:
                <?php do_action( 'woocommerce_review_order_before_shipping' ); ?>

                <?php wc_cart_totals_shipping_html(); ?>

                <?php do_action( 'woocommerce_review_order_after_shipping' ); ?>
При выборе одного варианта радиокнопка становится активной, а потом снимается выделение. Значение, если успеть перейти на следующую форму, сохраняется, да и в Резюме заказа все ОК, однако такое поведение может дезориентировать покупателя.

Каким образом можно воспользоваться Вашим кодом, чтобы вывести его в определенном div моего form-checkout.php
Код:
    <div class="multistep_step span" id="multistep_step3" data-step="3">
        <div class="box_style">



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

                <?php wc_cart_totals_shipping_html(); ?>

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



            <input type="submit" class="button prev" name="login" value="<?php _e('&larr; Ваши реквизиты', 'yit'); ?>" data-next="2" />
            <input type="submit" class="button next" name="login" value="<?php _e('Способ оплаты &rarr;', 'yit'); ?>" data-next="4" />


        </div>
    </div>
Спасибо за ответ.

Сам пациент http://busashop.com.ua/
 
Последнее редактирование:

hazzart

Новичок
#39
Добрый день! Подскажите, возникает проблема при изменении кода страницы Cart с [woocommerce_cart] на
Код:
[woocommerce_cart][hr][woocommerce_checkout]
При просмотре корзины отображается только woocommerce_checkout, шорткод woocommerce_cart вообще игнорируется, как и тег hr.
Вообщем-то занялся перепиливанием страницы оформления заказа из-за какого-то бага. Оформляя заказ вбиваешь все необходимые поля реквизитов оплаты, жамкаешь continue и ничего дальше не происходит, хотя по логике должен переходить на адрес доставки.
Адрес больного lw-shop.ru. Правда совмещение корзины и оплаты тестил на локалке.
 

tutsnew

Форумчанин
#40
Сверху Снизу