Итак, я хочу подключить внешнюю базу данных к базе данных 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 предоставит мне массив всех существующих записей в базе данных продуктов, чтобы я мог использовать его для циклического просмотра