Задать вопрос
  • Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

    RINCODE,
    да, это я ошибся. Функцию register_rest_route переименуйте, которая вешается на экшн rest_api_init - любое своё название (я ниже её переименовал в my_register_rest_route_function). Поэтому Fatal Error redeclare получаете. Т.е. примерно так должно быть:

    add_action( 'rest_api_init', 'my_register_rest_route_function');
    function my_register_rest_route_function() {
        register_rest_route('get-user-info-from-server/v1', '/user/(?P<id>\d+)/subscriptions', array(
            'methods' => 'GET',
            'callback' => 'get_user_subscriptions',
            'permission_callback' => '__return_true',
        ));
    }
  • Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

    RINCODE, у вас эндпойнт зарегистрирован так:
    your_namespace/v1/user/1/subscriptions
    а вы отправляете так:
    get-user-info-from-server/v1/user/1/subscriptions

    т.е. namespace неверно указан.

    и вот тут скорее всего ошибка:

    'subscription_product' => $subscription->get_product()->get_name(),


    выше посмотрите, я по получению продукта описал, добавил в пример. Сначала получаете заказ, а из него массив продуктов. Т.е. там будет массив, даже если продукт один - всё равно массив.
  • Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

    RINCODE,
    потому, что неправильно зарегистрировали эндпойнт.
    Эндпойнт нужно добавлять не на произвольный эшн, а на rest_api_init. И анонимную функцию здесь лучше не использовать:

    add_action( 'rest_api_init', 'register_rest_route');
    function register_rest_route() {
        register_rest_route('your_namespace/v1', '/user/(?P<id>\d+)/subscriptions', array(
            'methods' => 'GET',
            'callback' => 'get_user_subscriptions',
            'permission_callback' => '__return_true',
        ));
    }
  • Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

    Да, можете. Тут только есть пару нюансов. Товар можно получить из заказа. Но, в подписке не хранится id заказа, а хранится order_key (строка вида wc_order_jnzYOUIBzrNMJ).
    Поэтому, нужно сначала получить id заказа по order_key, а потом уже товары из заказа. Тогда $result будет примерно такой:

    $result = array_map(
                function($subscription) {
    
                    // получить id заказа по order_key функцией wc_get_order_id_by_order_key($order_key)
                    $order_id = wc_get_order_id_by_order_key( $subscription->get_order_key() );
                    // получить заказ по id заказа
                    $order = wc_get_order($order_id);
                    // получить товары из заказа
                    $order_items = array_map(
                        function($item) {
                            return [
                                'product_id'    => $item->get_product_id(),
                                'variation_id'  => $item->get_variation_id(),
                                'product_name'  => $item->get_name()
                            ];
                        },
                        $order->get_items()
                    );
    
                    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(),
                        'order_key'             => $subscription->get_order_key(),
                        'order_items'           => $order_items
                    ];
                },
                $users_subscriptions
            );
  • Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

    Да, для себя и не хотите делать проверку по ключу, то можете без ключа.
    Только тогда при создании эндпойнта нужно будет задать значение для 'permission_callback' => '__return_true', примерно так:

    register_rest_route( 'your_namespace/v1/user/(?P<id>\d+)/subscriptions', [
            [
                'methods'             => WP_REST_Server::READABLE,
                'callback'            => 'your_callback_function',
                'permission_callback' => '__return_true',
            ],
        ]);
    
    function your_callback_function( WP_REST_Request $request ) {
        $user_id = (int) $request->get_param('id');
    // тут получаете всё что нужно по id пользователя...
        return $result;
    }
  • Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

    Добавлять REST API эндпойнт, что-то типа:

    GET https://your_wp_site.com/wp-json/your_namespace/v1...

    в запросе передавать id пользователя и формировать данные, как я описал выше в примере.

    Если внешнее приложение не будет знать id пользователя на стороне WP - вместо id передавать email. Соответственно, в коде примера получать внутренний id пользователя по email, остальное примерно также.
  • Как корректно сохранить значение дополнительного поля text-field?

    Проверьте, что у вас хранится в $product.
    В wc_get_product( $the_product ) должен быть передан id товара или объект.
    Но у вас ничего не передаётся, соответственно, когда вы вызываете product->update_meta_data(...) значение поля никуда не сохраняется.
  • Как добавить кнопку удаления товара с корзины не на странице корзины в woocommerce?

    Примерно так:

    в вёрстке нужно либо в блок с товаром, либо в блок с самим "крестиком" вывести id товара.
    Вашу вёрстку я не вижу, поэтому напишу примерно и добавлю к самому крестику в data-атрибут $_product->get_id() - у вас может быть по другому:

    <div class="btn-remove" data-product-id="<?php echo $_product->get_id() ?>">x</div>


    в js на крестики добавляем обработчик (jQuery):

    $('.btn-remove').each(function() {
    	$(this).on('click', function() {
                    // получили id товара из data-атрибута
    		let product_id = $(this).data('product-id');
                    // отправили ajax
    		$.ajax({
    			url: ajaxurl, // возможно у вас будет другой url
    			method: 'POST',
    			data: { 
    				action: 'remove_product_from_cart', // название PHP-функции, которая обработает ajax
    				product_id // передали id товара
    			},
    			success: function() {
    				// удалить html-блок с товаром:
                                    $('.product').remove();
    			}
    		});
    	});
    });


    В PHP (functions.php) добавьте функцию remove_product_from_cart с кодом как у меня выше или как у lil_koi:

    add_action("wp_ajax_remove_product_from_cart", "remove_product_from_cart");
    function remove_product_from_cart() {
    	$product_id = $_POST['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 );
    	     }
    	}
            wp_die();
    }


    Какие-то нюансы у вас могут отличаться.
  • Как вывести h1, название категории и нужные атрибуты товара в тексте описания на странице товара Woocommerce?

    otec46,
    в целом, изменение заголовка страницы товара делается с помощью хука the_title, примерно так:

    add_filter( 'the_title', 'my_custom_product_title' );
        function my_custom_product_title( $title, $post_id ) {
            if( is_product() ) {
                // получаем данные товара
                $product = wc_get_product( $post_id );
                // переписываем дефолтный title
                $title = sprintf(
                'В нашем интернет магазине вы можете приобрести %s толщиной %s и покрытием %s ...', // шаблон заголовка
                $product->get_name(), // название товара
                $product->get_weight(), // толщина
                $product->get_attribute( 'your_attr_name' ), // атрибут по названию
                // ... и т.д.
                );
            }
            return $title;
        }


    Но, если бы у вас был один общий шаблон для всех товаров - тогда всё просто.

    Но, насколько я понял, у вас будут для разных товаров разные шаблоны. Если это так, то надо будет ещё подумать как привязать к товару шаблон. Скорее всего, это будет дополнительное кастомное мета-поле для товара (возможны другие варианты). Далее, вытаскивать шаблон из мета-поля и подставлять в него атрибуты товара. Как это реализовать - тут надо придумывать.
  • Просит ftp сервер при удалении плагина WordPress хотя я установил его на локальном сервере?

    А видимо уже никак) Я сам "затупил" - в коммент написал, а не в "Ответ". Либо мне его нужно продублировать в ответ. В общем, мне без разницы, если помогло - отлично!
  • Просит ftp сервер при удалении плагина WordPress хотя я установил его на локальном сервере?

    В корневой директории проекта в файл wp-config.php в самый конец добавьте строку:

    define('FS_METHOD','direct');
  • Испортился слайдер после обновления Smart Slider 3 - как починить?

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

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

    Думаю, что этот вариант самый "рабочий". Другой как-то и на ум не приходит)

    То есть, приходит запрос с UTM-меткой, в общем виде такой -

    http://www.site.ru/?utm_source={source}&utm_medium=cpc&utm_campaign={campaign_id}&utm_content={position_type}.{position}&utm_term={keyword}


    Ну а дальше, достаточно будет разобрать запрос и вытащить из него один или более параметров URL -

    if (isset($_REQUEST['utm_source']) ) {
     // ... показываем баннер
    }
  • Как сделать остаток товаров 0 в Woocommerce если они пропали в прайсе поставщика?

    Не совсем так. Смотрите, в вашем случае ключевой момент - это то, что импорт у вас работает на плагине Wp All Imprort Pro. Именно это важно.

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

    Отсюда, конкретно в вашем случае я вижу два пути -

    1) Если вы PRO, то можно написать в поддержку разработчикам Wp All Imprort, сформулировать вашу проблему и посмотреть, что они ответят.

    2) Создать новый вопрос, в котором явно указать, что импорт у вас работает на Wp All Imprort, возможно, есть разработчики, которые с данным плагином работали и смогут подсказать решение. Я с этим плагином дело не имел, поэтому мне придется с ним разбираться, а это уже совсем другая история.
  • Как сделать остаток товаров 0 в Woocommerce если они пропали в прайсе поставщика?

    Прекрасно вас понимаю)

    На самом деле, тут проблема немного глубже. Опишу ее не как пользователь, а как разработчик.

    Дело вот в чем - часто есть не совсем правильное понимание woo или любого другого плагина. Под WordPress есть тысячи плагинов. С их помощью уже решены какие-то задачи - онлайн-торговля, импорт, экспорт и т.д. И казалось-бы, ну всё уже написано, все велосипеды уже изобретены. Но тут как раз и есть "ловушка".

    Плагины либо решают "маленькие" задачи, с которыми столкнулись конкретные разработчики в конкретном проекте. Либо это некие "комбайны", например тот-же Woo или ваш плагин Wp All Imprort. То есть, это некое решение, претендующее на "закрытие" целого пласта, например импорт-экспорт всего и во всё. И такое решение может стоить 100, 200 и более "бакинских".

    При этом, разработчики плагинов не такие уж и глупые люди, они прекрасно понимают, что на самом деле невозможно создать решение, которое будет удовлетворять всем и во всех случаях. Это нужно делать "бесконечно гибкое" решение. А такого в природе не бывает. Именно поэтому, к подобному "комбайну" прикручивают API - то есть, если дефолтных возможностей все-таки не хватает, вот вам пожалуйста набор функционала для ваших разработчиков и там уже "допиливайте" до совершенства.

    Поэтому, к подобному плагину и к его API, приходится "прикручивать" еще и wp-разработчика, который приходит, разбирается с API и там уже что-то дописывает.

    Или не дописывает) Потому, что здесь есть другая проблема - а есть ли в природе такие разработчики, которые имеют опыт работы с API любого плагина (а их тысячи)? Ответ очевиден - конечно нет.

    Более того, случается такое, что даже при наличии API не всегда возможно решить конкретную задачу. Приходится констатировать, что в рамках данного плагина данная задача не решается. Печально, но такое тоже бывает. Отсюда может быть даже так, что приходится менять бизнес-требования под функционал плагина. Ну потому, что деньги уже заплачены, не отказываться ведь. Либо создавать второе решение, которое будет работать поверх первого. То есть, делать "костыль", такое тоже бывает.

    Так-что тут действительно не всё всегда просто. На этом сайте или на других подобных ресурсах - если посмотрите, здесь каждый день подобные вопросы задаются. Именно потому, что когда задача "чуть вправо-влево" от стандартного функционала, то начинаем придумывать, а как же ее побороть.
  • Как сделать остаток товаров 0 в Woocommerce если они пропали в прайсе поставщика?

    Если в настройках плагина такого нет, то скорее всего, придется разбираться с API плагина - https://www.wpallimport.com/documentation/develope...
  • Как сделать остаток товаров 0 в Woocommerce если они пропали в прайсе поставщика?

    Очевидно, что нужно править импорт.

    Вы пишете - "При импорте проверяются товары только которые есть в новом прайсе, а старые не затрагиваются".

    Из этого пока можно сказать только одно - нужно в импорт дописывать проверку имеющихся товаров с новыми.

    Ну а дальше ничего не известно - какой у вас импорт, из чего импортируете (excel, xml...? что-то еще...), как он реализован. Сделать то можно, но задача полностью зависит от того, как реализован импорт.