Как написать GET-запрос для получения ВСЕХ продуктов (не только первых 10) на WooCommerce - PullRequest
0 голосов
/ 19 сентября 2019

Итак, я хочу подключить внешнюю базу данных к базе данных woocommerce, чтобы экспортировать продукты оттуда и импортировать их в woocommerce.Конечно, сначала я хотел бы проверить, не существует ли продуктов, и обновлять их, а не создавать дубликаты.Я полагаю, что приведенный ниже алгоритм работает, но он требует окончательного тестирования.К сожалению, я не могу запустить тесты, не имея возможности получить все продукты из woocommerce (в настоящее время только 10).

Нет ли способа использовать Automattic от WooCommerce и получить все продукты вместо 10?(Я бы предпочел не делать циклический просмотр страниц, если это возможно).

Любой вклад в другие части кода также будет очень полезен.

Я видел людей, использующих wc_get_products, но японятия не имею, как интегрировать его в мой код.

use GuzzleHttp;
use Automattic\WooCommerce;
//Connect to DB1 (external database), get all products and save them in $articles (done)
....
$articles = json_decode($res->getBody());
//-----------Connect to DB2(WooCommerce), get all products and save them in $wooExistingProducts
...
$wooExistingProducts = $wooCommerceClient->get('products'); 
//GETS ME ONLY 10. Baseurl is "http://localhost:8000"


//HERE I WANT TO INITIALIZE AN "UPDATE OR CREATE" METHOD BETWEEN THE 2 Databases
//loop through each product on the external DB and initialize the template
foreach ($articles as &$article){
    $wooTemplate = [
        'meta_data' => [
            ["key" => 'DbOneID',
            "value" => $article->product
            ]
        ],
        'name' => $article->name,
        'description' => $article->description,
        'categories_name' => $article->category,
        'weight' => $article->size,
        'regular_price' =>  $article->price,
        'search' => $article->search,
        'shipping_class_id' => $article->shippingid,
        'stock_quantity' => $article->itemsonstock,
        'date_modified' => $article->modified,
    ];
//check if there are existing products on WooCommerce and if yes
    if(!$wooExistingProducts!=1){
    //Loop through all existing products on woocommerce
    for($x=0; $x<sizeof($wooExistingProducts); $x++){
        //loop through all products on the external DB
        for($y=0; $y<sizeof($articles); $y++){
    //if the product id from the external DB matches the DbOneID from an existing product on woocommerce
    if($wooExistingProducts[$x]->meta_data[0]->value==$articles[$y]->id){
        //update that product
        $wooCommerceClient->put('products/'.urlencode($articles[$y]->id), $wooTemplate);
    }
    //if the products don't match, take the product from the external DB, using the wooTemplate, and push it to the array productsForWoo. 
    else{
        array_push($productsForWoo, $wooTemplate);
        if(sizeof($productsForWoo) == 20){
            $data = [
                'create' => $productsForWoo,
            ];
/Push the productsForWoo array to wooCommerce as a batch, limiting each process to maximum 20 products (to avoid the 15s timeout)
            $wooCommerceClient->post('products/batch', $data);
/reset the array so we can get all products, without duplicates
            $productsForWoo = [];
        }
    }
        }
    }

}
//if there are no products on woocommerce, simply push them all in batches of 20 to the WC database
    else{
        array_push($productsForWoo, $wooTemplate);
        if(sizeof($productsForWoo) == 20){
            $data = [
                'create' => $productsForWoo,
            ];
            $wooCommerceClient->post('products/batch', $data);
            $productsForWoo = [];
        }
    }
}
//As there is a big chance that the last batch will have less than 20 products, push them as well to wooCommerce as a last batch
$data = [
    'create' => $productsForWoo,
];
$wooCommerceClient->post('products/batch', $data);

Я ожидаю, что $ wooExistingProducts предоставит мне массив всех существующих записей в базе данных продуктов, чтобы я мог использовать его для циклического просмотра

1 Ответ

1 голос
/ 19 сентября 2019
$wooExistingProducts = $wooCommerceClient->get('products',['per_page'=>100]); 

должно работать на вас.Согласно его источнику на https://github.com/woocommerce/wc-api-php/blob/master/src/WooCommerce/Client.php#L80

И перечисленных здесь параметрах API WooCommerce: https://woocommerce.github.io/woocommerce-rest-api-docs/#list-all-products

РЕДАКТИРОВАТЬ: Если использование большего лимита не работает для вас, вы можете использовать пейджинг, как описано вдругая нить: https://stackoverflow.com/a/51555088/2129097

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...