Задать вопрос
  • Как в вукомерс сделать архив товаров по категориям?

    Чтобы в WooCommerce убрать исходную сортировку, нужно удалить хук woocommerce_catalog_ordering -

    remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 );


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

    add_action( 'wp', 'remove_default_sorting_storefront' );
    function remove_default_sorting_storefront() {
       remove_action( 'woocommerce_after_shop_loop', 'woocommerce_catalog_ordering', 10 );
       remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 10 );
    }


    Либо просто скрываете в css:

    .woocommerce-ordering {
      display: none;
    }
    Ответ написан
    Комментировать
  • Как сделать нестандартный заказ в Woocommerce?

    При заказе в 1 клик предполагается отсутствие корзины - заказ сразу создаётся без добавления в корзину.
    У вас, судя по вопросу, заказы должны по прежнему идти через корзину, то есть - клиент положил товар(ы) в корзину, после этого перешёл в корзину, где должен быть упрощённый механизм не в 2 шага, а в 1. Если я всё правильно понимаю?

    Если это так - то в админке сайта у вас в разделе "Страницы" находите страницы "Корзина" и "Оформление заказа". На каждой из них есть по одному шорткоду: woocommerce_cart и woocommerce_checkout. Вам нужно оба шорткода вывести не на разных страницах, а на одной. Т.е. шорткод woocommerce_checkout переносите на страницу "Корзина", где у вас будет теперь жить два шорткода.
    После этого в настройках магазина WooCommerce->Настройки->Дополнительно нужно будет указать для страницы оформления заказа страницу "Корзина", чтобы магазин "понимал", куда "переехал" checkout.

    После этого убираете лишние поля:

    add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
    function custom_override_checkout_fields( $fields ) {
    // billing
       unset($fields['billing']['billing_first_name']);
        unset($fields['billing']['billing_last_name']);
        unset($fields['billing']['billing_email']);
        unset($fields['billing']['billing_phone']);
        unset($fields['billing']['billing_company']);
        unset($fields['billing']['billing_city']);
        unset($fields['billing']['billing_address_1']);
        unset($fields['billing']['billing_address_2']);
        unset($fields['billing']['billing_country']);
        unset($fields['billing']['billing_state']);
        unset($fields['billing']['billing_postcode']);
    // shipping
        unset($fields['shipping']['shipping_first_name']);
        unset($fields['shipping']['shipping_last_name']);
        unset($fields['shipping']['shipping_email']);
        unset($fields['shipping']['shipping_phone']);
        unset($fields['shipping']['shipping_company']);
        unset($fields['shipping']['shipping_city']);
        unset($fields['shipping']['shipping_address_1']);
        unset($fields['shipping']['shipping_address_2']);
        unset($fields['shipping']['shipping_country']);
        unset($fields['shipping']['shipping_state']);
        unset($fields['shipping']['shipping_postcode']);
    return $fields;
    }


    Соответственно, смотрите какие из полей вам нужны, а какие нет.

    Ну а с вёрсткой, там уже нужно работать с соответствующими шаблонами из wp-content/plugins/woocommerce/templates
    Ответ написан
    Комментировать
  • Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

    Woocommerce Subscription работает с объектами класса WC_Subscription (не только с ним, но это базовый класс, глубже копать вам не нужно), который наследуется от WC_Order:

    class WC_Subscription extends WC_Order {...}

    соответственно, данные хранятся в таблицах woocommerce.

    Напрямую через запросы к таблицам вы работать с подписками конечно можете, но это как-бы не очень хорошая идея. Чтобы получить данные подписок пользователя вам достаточно вызвать функцию wcs_get_users_subscriptions($user_id) и передать в неё id пользователя. Перед этим, желательно проверить, а есть ли у пользователя вообще подписки - wcs_user_has_subscription($user_id).

    Пример:

    // каким-то образом получаете id пользователя
    $user_id = get_current_user_id();
    
    // далее проверяете, есть ли у пользователя подписки
    if (wcs_user_has_subscription($user_id)) {
            // получаете массив объектов WC_Subscription
            $users_subscriptions =  wcs_get_users_subscriptions($user_id);
    // далее, вытаскиваете из объектов всё, что вам нужно. Здесь я привёл лишь некоторые данные из возможных. На самом деле их там гораздо больше. Версия WC Subscription 5.6.0.
            $result = array_map(
                function($subscription) {
                    return [
                        'id'                    => $subscription->get_id(),
                        'version'               => $subscription->get_version(),
                        'customer_id'           => $subscription->get_customer_id(),
                        'status'                => $subscription->get_status(),
                        'currency'              => $subscription->get_currency(),
                        'date_created'          => $subscription->get_date( 'date_created' ),
                        'next_payment'          => $subscription->get_date( 'next_payment' ),
                        'date_end'              => $subscription->get_date( 'end' ),
                        'date_trial_end'        => $subscription->get_date( 'trial_end' ),
                        'payment_method'        => $subscription->get_payment_method_title(),
                        'total'                 => $subscription->get_total(),
                        'discount_total'        => $subscription->get_discount_total(),
                        'shipping_total'        => $subscription->get_shipping_total()
                    ];
                },
                $users_subscriptions
            );
            
            echo '<pre>';
            print_r($result);
            echo '</pre>';
        }


    Для получения данных профиля пользователя вам вполне достаточно функции get_user_by('ID', $user_id).
    Для получения ссылки на аватар - get_avatar_url($user_id)
    Ответ написан
  • Можно ли в wordpress сайте сделать перенаправление?

    В активной теме сайта найдите файл functions.php и в него добавьте код:

    add_action( 'template_redirect',  'redirect_logged_users' );
    function redirect_logged_users() {
    	if ( is_user_logged_in() ) {
    // здесь вместо 5 укажите ID страницы, на которую нужно перенаправить авторизованного пользователя
    		wp_redirect( get_permalink( 5 ) ); 
    	}
    }
    Ответ написан
    Комментировать
  • Как добавить кнопку удаления товара с корзины не на странице корзины в woocommerce?

    Прикрутить на "крестики" js.
    В ajax передать product_id.
    Удалить из корзины:
    $product_id = $_REQUEST['product_id'];
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
         if ( $cart_item['product_id'] == $product_id ) {
              WC()->cart->remove_cart_item( $cart_item_key );
         }
    }
    Ответ написан
  • Как передавать параметры товара из UNI CPO в плагин Art WooCommerce Order One Click?

    Эти два плагина скорее всего ничего "не знают" друг о друге. Что вполне нормально.
    Возможно, Art WooCommerce Order One Click можно "докрутить" через его хуки - нужно поизучать возможности плагина на его странице.
    Или попробуйте задать вопрос напрямую автору - Артёму, можете это сделать в комментариях на странице плагина.
    Ответ написан
    Комментировать
  • Как вывести описание (Description в the_post_thumbnail) картинки в wordpress?

    1. Получить каким-либо образом id картинки
    2. По id картинки получить её атрибуты:
    $alt  = get_post_meta( $image_id, '_wp_attachment_image_alt', true );
    $title = get_post_field( 'post_title', $image_id );
    $caption = get_post_field( 'post_excerpt', $image_id );
    $description = get_post_field( 'post_content', $image_id );
    Ответ написан
    Комментировать
  • Как обратиться к API после оформления подписки через WooCommerce Subscriptions?

    Плагин WooCommerce Subscriptions - по сути это расширение WooCommerce, поэтому вы можете использовать все те-же хуки WooCommerce. В вашем случае, думаю имеет смысл использовать хук, который срабатывает при смене статуса заказа -

    add_filter('woocommerce_order_status_changed', 'my_custom_function', 10, 4 );
    function my_custom_function(  $order_id, $old_status, $new_status, $order ) {
     // ... ваш PHP код
    }
    Ответ написан
    3 комментария
  • Цена за клик внешнего товара Woocommerce как реализовать?

    При переходе по внешней ссылке сайт партнёра должен каким-либо образом идентифицировать переход с вашего магазина. То есть, данный функционал - идентификация и учёт переходов, списание с баланса и т.д. - должен быть реализован на стороне сайта партнёра, а не у вас.
    Ответ написан
  • Для вывода главной в Wordpress используем home_url(), а что использовать для вывода страницы блога (записей)?

    в туже самую функцию home_url() передайте строковый параметр 'blog':
    home_url( 'blog' );
    или более универсальный вариант:
    home_url( get_page_uri( get_option('page_for_posts') ) );

    или так:
    get_post_type_archive_link( 'post' );
    Ответ написан
    1 комментарий
  • Какая переменная соответствует этой, если без подключения woocommerce?

    Если по простому, то это javascript-переменная, которая нужна для работы с ajax.
    В админке она есть по умолчанию.
    Woocommerce ее добавляет при установке плагина.
    То есть, без Woocommerce вам нужно ее добавить самостоятельно, так как по умолчанию в вашей теме ее нет.
    Выше Анатолий вам дал ссылку на документацию - там все подробно расписано по данной теме.
    Если еще упростить - вам нужно разобраться и добавить подобный код -

    // Подключаем локализацию в самом конце подключаемых к выводу скриптов, чтобы скрипт
    // 'twentyfifteen-script', к которому мы подключаемся, точно был добавлен в очередь на вывод.
    // Заметка: код можно вставить в любое место functions.php темы
    add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
     function myajax_data(){
    
    // Первый параметр 'twentyfifteen-script' означает, что код будет прикреплен к скрипту с ID 'twentyfifteen-script'
    // 'twentyfifteen-script' должен быть добавлен в очередь на вывод, иначе WP не поймет куда вставлять код локализации
    // Заметка: обычно этот код нужно добавлять в functions.php в том месте где подключаются скрипты, после указанного скрипта
    	wp_localize_script( 'twentyfifteen-script', 'myajax',
    		array(
    			'url' => admin_url('admin-ajax.php')
    		)
    	);
    
    }


    где нужно заменить название скрипта "twentyfifteen-script" на свой.

    В итоге, у вас появится переменная (в данном примере она будет называться url - у себя вы можете ее назвать как вам больше нравится), которая будет хранить url для ajax-запросов и к которой вы сможете обращаться из javascript.
    Ответ написан
    Комментировать
  • Как выводить только отзывы в табах woocommerce?

    С помощью хука woocommerce_product_tabs -

    добавляете в functions.php:

    add_filter( 'woocommerce_product_tabs', 'woo_remove_product_tabs', 98 );
    
            function woo_remove_product_tabs( $tabs ) {
    
                unset( $tabs['description'] ); 
                unset( $tabs['additional_information'] ); 
    
                return $tabs;
            }


    где в unset - табы, которые нужно удалить. В вашем случае, это: description и additional_information. Если нужно удалить только доп. информацию, оставьте только строку unset( $tabs['additional_information'] ).

    Более подробно смотрите документацию по данному хуку -
    https://docs.woocommerce.com/document/editing-prod...
    Ответ написан
    Комментировать
  • Как программно можно пересчитать стоимость товара и корзины?

    Вам нужно добавить ваши переменные в товар. То есть, в карточке товара у вас должны появиться новые поля, куда вы будете заносить и сохранять значения переменных.
    Для этого вам нужно реализовать три "хука" - первый на "display" полей, второй на "save" данных пеhременных, третий - перерасчет цены в корзине.
    Подробнее по "кастомным" полям в корзине Woo - https://woocommerce.github.io/code-reference/files...

    1) Пример, как добавить "кастомный" input в товар в "базовой комплектации":

    add_action('woocommerce_product_options_general_product_data', 'your_function_for_display_custom_meta_data');
    function your_function_for_display_custom_meta_data() {	
    	woocommerce_wp_text_input(
            array(
                'id' => 'rangeby1',
                'placeholder' => 'Текст плейсхолдера',
                'label' => 'Текст label'
            ));
    // подобным образом, добавляете все переменные, как инпуты...
    }


    2) Второй "хук" - для сохранения данных, которые вводятся в поля:

    add_action('woocommerce_process_product_meta', 'your_function_for_save_custom_meta_data');
    function your_function_for_save_custom_meta_data( $post_id ){
    	$rangeby1 = $_POST['rangeby1'];
    	update_post_meta($post_id, 'rangeby1', esc_html($rangeby1));
    // подобным образом, добавляете сохранение для всех полей...
    }


    3) Выводите переменные в корзине:

    add_action( 'woocommerce_before_calculate_totals', 'your_function_for_calculate_cart_totals', 10, 1 );
    function your_function_for_calculate_cart_totals( $cart ){
            // перебор в цикле всех товаров в корзине, примерно так:
    	foreach ( $cart->get_cart() as $cart_item ) {
                    // получаете значения переменных:
                    $rangeby1 = get_post_meta( $cart_item['data']->get_ID(), 'rangeby1', true );
    		// прописываете логику перерасчета цен... тут уже всё индивидуально...
    	}
    }
    Ответ написан
  • Как сделать API для Wordpress?

    В целом, если без деталей -

    1) В WP под структуру ваших таблиц нужно создать соответствующую структуру данных. Делается это "вручную" (custom types + metabox), либо с помощью плагинов (ACF, Pods и т.п.).

    2) В WP нужно реализовать загрузку данных с вашего сервера, где уже есть API.

    3) В WP реализовать импорт полученных данных (из JSON) в базу WP.

    Итого: создать структуру данных, реализовать получение данных по API, импорт полученных данных в БД сайта.

    Это в общих чертах. Детали реализации - тут уже от конкретики все зависит, каждый разработчик может по своему сделать.
    Ответ написан
    Комментировать
  • Wordoress wodocommerce не могу понять где подключить вывод атрибутов в шапке?

    Добрый день.

    Конкретно данный код "дернуть" в шапку не получится, так как это файл шаблона woocommerce из каталога /plugins/woocommerce/templates/single-product/, файл - product-attributes.php.

    То есть, этот файл выводится на странице продукта. Куда-либо в другое место его вывести не получится.

    Бренд в title можно выдернуть из глобальной переменной global $product. Например -
    global $product;
    $brand = $product->get_name();

    Как конкретно это делать - тут уже могут быть самые разные реализации. Из $product можно выдернуть любые данные о товаре. Вот ссылка, где можете подобрать методы -
    https://www.businessbloomer.com/woocommerce-easily...
    Ответ написан
    Комментировать
  • Как получить данные (Form Data) из POST-запроса WooCommerce, используя JS (jQuery)?

    А если получать данные о с помощью REST API ? Тем более, что доступа к коду у вас нет. Мне кажется, это более простой способ. Если конечно вам не нужно ловить заказ до записи в базу.

    P.S. не то написал видимо, сейчас понял. У вас ведь нет возможности делать запросы на сайт... Верно ?
    Ответ написан
    Комментировать
  • Как сделать пошаговый конструктор чего-либо (лучше без Woocommerce)?

    Для данных - ACF Pro, Pods и подобные плагины. С их помощью в админке вы создадите сущности (товары, если не хотите использовать woocommerce), поля, логику. Все это в дальнейшем можно также через админку поддерживать.

    Во фронтенде - верстаете как вам нужно, выводите данные в верстку. Добавляете браузерную динамику на JS/JQuery.
    Ответ написан
    Комментировать
  • Как сделать остаток товаров 0 в Woocommerce если они пропали в прайсе поставщика?

    В админке, у товара на вкладке "Запасы" можно включить опцию "Управлять запасами?" - "Включить управление запасами на уровне товаров".

    В этом случае, у товара, у которого в наличии 0 на сайте должна появиться отметка "Нет в наличии" и пропасть кнопка "Положить в корзину". А в каталоге, вместо кнопки "Положить в корзину" будет ссылка "Подробнее".

    В результате, товар на сайте есть, а заказать его нельзя.

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

    Насколько я понимаю, вам нужно просто показать-скрыть форму в зависимости от значения .
    Если так, может быть будет проще делать что-нибудь такое -
    { formState && <form className = "form" onChange={onChangeHandler} style={styles}><form>}

    и тогда не заморачиваться на передачу стилей вообще
    Ответ написан
    Комментировать
  • Подключение внешней БД sql к сайту, созданному на WordPress. Как реализовать?

    Плагины WP здесь ни причем. Выше Анатолий прав, это не типовой функционал.

    В вашем случае нужно смотреть на задачу немного по другому. По сути, у вас есть два сервера. На одном WP со всем своим "хозяйством". И есть где-то на другом сервере другая БД. Вам нужно каким-то образом настроить взаимодействие сайта с внешним сервером. Например, по REST API.

    То есть, ваш сайт на WP (хотя, это не важно), отправляет http запрос на внешний сервер, соответственно, внешний сервер должен "уметь" обработать данный запрос и "отдать" вашему сайту данные. Обычно в формате json. А на стороне вашего сайта нужно реализовать механизм сохранения полученных данных в базу WP. И тоже самое в обратную сторону - внешний сервер должен "уметь" получить данные с вашего сайта, также с помощью http запроса, и сохранить эти данные в свою БД.

    Могут быть другие варианты. Можно в принципе и выгрузками через файл сделать (excel, xml...). Но у вас вроде задача именно на взаимодействие.
    Ответ написан
    Комментировать