Клиентская библиотека PHP WooCommerce Rest API Создание нескольких купонов

Я пытаюсь создать несколько купонов на своем сайте WordPress извне с моего сайта PHP, и я использую клиентскую библиотеку woocommerce-api. Я готовлю массив кодов купонов для передачи в метод Create Coupon, чтобы я мог создать несколько купонов одновременно. но на самом деле он не работает, так как возвращает мне следующее сообщение об ошибке «Ошибка: отсутствует код параметра [woocommerce_api_missing_coupon_code]». Вот мой код

      foreach ($tags->result() as $row) {
            $coupons[$i]['code'] = $row->id_tag;
            $coupons[$i]['type'] = 'fixed_cart';
            $coupons[$i]['amount'] = 5;
            $i++;
        }

        print_r($coupons);
        print_r($coupons[0]);
        require_once '/application/lib/woocommerce-api.php';
        $consumer_key = 'ck_consumerKey'; // Add your own Consumer Key here
        $consumer_secret = 'cs_ConsumeSecret'; // Add your own Consumer Secret here
        $store_url = 'http://mySiteUrl'; // Add the home URL to the store you want to connect to here             
        try
        {
           $client = new WC_API_Client( $store_url, $consumer_key, $consumer_secret );

           $client->coupons->create( $coupons[0]);
           $client->coupons->create( $coupons);
        }
        catch ( WC_API_Client_Exception $e ) 
        {
            echo $e->getMessage() . PHP_EOL;
            echo $e->getCode() . PHP_EOL;
            if ( $e instanceof WC_API_Client_HTTP_Exception ) 
            {
                print_r( $e->get_request() );
                print_r( $e->get_response() );
            }

        }  

Этот $client->coupons->create($coupons[0]), где я передаю только первый индекс массива, успешно создает один купон, но вторая строка, в которой я передаю весь массив методу создания, не создает никаких купон и возвращает мне следующую ошибку Ошибка: отсутствует код параметра [woocommerce_api_missing_coupon_code]

Я напечатал массив купонов [] и содержит следующие данные

 Array ( [0] => Array ( [code] => AA12B001 [type] => fixed_cart [amount] => 5 ) [1] => Array ( [code] => AA12B002 [type] => fixed_cart [amount] => 5 )) 

где, как если бы я печатал купоны [0], он содержит следующие данные

 Array ( [code] => AA12B001 [type] => fixed_cart [amount] => 5 )  

Любая помощь, пожалуйста?


person umer    schedule 07.10.2015    source источник


Ответы (2)


Причина, по которой передача всего массива купонов не работает, заключается в том, что клиентская библиотека REST не определяет конечную точку coupons/bulk.

Более простой подход - изменить код, который вы используете, настроить код следующим образом.

require_once '/application/lib/woocommerce-api.php';
$consumer_key = 'ck_consumerKey'; // Add your own Consumer Key here
$consumer_secret = 'cs_ConsumeSecret'; // Add your own Consumer Secret here
$store_url = 'http://mySiteUrl'; // Add the home URL to the store you want to connect to here             

try
{
   $client = new WC_API_Client( $store_url, $consumer_key, $consumer_secret );

   foreach ($tags->result() as $row) {
        $coupons = array();
        $coupons['code'] = $row->id_tag;
        $coupons['type'] = 'fixed_cart';
        $coupons['amount'] = 5;
        $client->coupons->create( $coupons);
    }

     .... //continue with the rest of the code    

Другим подходом может быть изменение клиентской библиотеки REST, но это займет много времени. Технически, независимо от того, зацикливаете ли вы клиентский код и создаете купон за раз, или передаете WooCommerce весь массив купонов и позволяете WooCommerce создавать купоны в цикле, эффект будет одинаков.

Единственная разница заключается в эффективности, первый подход создания купона за раз менее эффективен, однако, если у вас нет тысяч купонов для создания, это не имеет значения.

ИЗМЕНИТЬ

Вот решение

1. Отредактируйте lib/woocommerce-api/resources/class-wc-api-client-coupons.php и добавьте в него следующий код

public function create_bulk( $data ) {

    $this->object_namespace = 'coupons';

    $this->set_request_args( array(
        'method' => 'POST',
        'body'   => $data,
        'path'   => 'bulk',
    ) );

    return $this->do_request();
}

2.Теперь позвоните $client->coupons->create_bulk( $coupons );

Я проверил это локально, и это работает.

person Anand Shah    schedule 07.10.2015
comment
Да, как я уже упоминал, WooCommerce REST API определяет конечную точку bulk, это клиентская библиотека Kloon, которая не использует эту конечную точку. - person Anand Shah; 07.10.2015
comment
Спасибо за вашу помощь, я уже пробовал этот подход, но моя проблема в том, что мне нужно создать более 20000 купонов одновременно, не могли бы вы предложить мне лучший способ решить эту проблему? В документах WooCommerce Rest API Docs они упомянули о создании нескольких купонов одновременно, отправив команды cURL, но, как вы говорите, клиентская библиотека REST не определяет конечную точку купонов/массовой загрузки. Есть ли способ отправить команду cURL из моего php, чтобы решить эту проблему? - person umer; 07.10.2015
comment
Другой подход заключается в создании CSV-файла, содержащего 20 000 купонов, а затем импорте его с помощью кода на сервере. - person Anand Shah; 07.10.2015
comment
как вы упомянули, что если мне не нужно создавать тысячи купонов, это не должно иметь значения, но в моем случае это занимает много времени, даже создание 100 купонов, например, более 80 секунд или около того, а создание 200 купонов одновременно приводит к сбою в середина. - person umer; 07.10.2015
comment
есть ли способ, которым я могу напрямую использовать WC Rest API и отправить ему команду из моего PHP-кода для создания купонов? - person umer; 07.10.2015
comment
Я обновил свой ответ решением. Я проверил это локально, и это работает. - person Anand Shah; 07.10.2015
comment
Большое спасибо, но на моей стороне возникает следующая ошибка Ошибка: не найден маршрут, соответствующий URL-адресу и методу запроса [woocommerce_api_no_route] - person umer; 07.10.2015
comment
Давайте продолжим обсуждение в чате. - person Anand Shah; 07.10.2015
comment
Когда я переключаю MAMP на живой Linux-сервер, это не работает - person er.irfankhan11; 08.03.2016

Я решил свою проблему, выполнив следующие действия.

1: Моя версия Woo Commerce обновлена ​​с 2.3.10 до 2.4.7, поскольку REST API в следующих версиях не поддерживает режим массовых операций.

2: После обновления мне нужно внести небольшие изменения в «class-wc-api-coupons.php». Это обновленный класс API REST WC, который предлагает массовый метод для создания нескольких купонов, но внутри есть ограничение на массовую операцию MAX 100. метод, я увеличил лимит до 2000. (Я мог найти этот класс API в установленных плагинах/woocommerce/includes/api).

3: Наконец, я последовал инструкции @Anand, например, клиентский API WC не поддерживает массовую конечную точку, поэтому нам нужно изменить/расширить клиентский API, поэтому я добавил следующую функцию в свой «класс-wc-api-client-resource». -купоны" класс

public function create_bulk( $data ) {

$this->object_namespace = 'coupons';

$this->set_request_args( array(
    'method' => 'POST',
    'body'   => $data,
    'path'   => 'bulk',
) );

return $this->do_request();
}

Теперь я могу вызвать эту функцию в любом месте моего клиентского кода и передать массив кодов купонов для создания сотен купонов оптом.

Спасибо @Anand за помощь.

person umer    schedule 08.10.2015