Php 如何编写GET请求以检索WooCommerce上的所有产品(不仅仅是前10个产品)
所以我想将一个外部数据库连接到woocommerce数据库,以便从那里导出产品并将其导入woocommerce。当然,我首先要检查这些产品是否已经存在,如果存在,则更新它们,而不是创建副本。我相信下面的算法是可行的,但它需要最后的测试。不幸的是,如果我不能从woocommerce获得所有产品,我无法运行测试,目前只有10个 难道没有一种方法可以使用WooCommerce的Automatic来获得所有的产品而不是10个吗?如果可能的话,我不想在页面之间循环 对代码其他部分的任何输入也将非常感谢 我见过有人使用wc_get_产品,但我不知道如何将其集成到我的代码中Php 如何编写GET请求以检索WooCommerce上的所有产品(不仅仅是前10个产品),php,wordpress,rest,woocommerce,Php,Wordpress,Rest,Woocommerce,所以我想将一个外部数据库连接到woocommerce数据库,以便从那里导出产品并将其导入woocommerce。当然,我首先要检查这些产品是否已经存在,如果存在,则更新它们,而不是创建副本。我相信下面的算法是可行的,但它需要最后的测试。不幸的是,如果我不能从woocommerce获得所有产品,我无法运行测试,目前只有10个 难道没有一种方法可以使用WooCommerce的Automatic来获得所有的产品而不是10个吗?如果可能的话,我不想在页面之间循环 对代码其他部分的任何输入也将非常感谢 我
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能给我一个产品数据库中所有现有条目的数组,这样我就可以用它来循环
$wooExistingProducts = $wooCommerceClient->get('products',['per_page'=>100]);
应该对你有用。
据其消息来源
和以下列出的API参数:
编辑:
如果使用更大的限制对您不起作用,您可以使用分页,如其他线程中所述:
我也有这个问题。所以我为它创建了代码 首先,在wp目录中创建一个PHP文件并添加此代码
define('WP_USE_THEMES', false);
require_once('wp-load.php');
$params = array(
'posts_per_page' => 1000,
'post_type' => 'product'
);
$wc_query = new WP_Query($params);
$posts = $wc_query->posts;
$size = sizeOf($posts);
echo json_encode($size);
这将得到产品的数量。您可以增加post\u pre\u页面的值
对于API请求,请使用此代码
$count = file_get_contents('WWW.YOURSITE.COM/ajax.php');
$pages = ceil($count / 100);
$i = 1;
for($i;$i <= $pages;$i++){
$pr = [
'per_page' => '100',
'page' => $i
];
$products = $woocommerce->get('products',$pr);
var_dump($products);
}
API只允许100个产品预查询。所以你必须循环它。非常感谢你的回答。在这种情况下,我会得到100个结果。但是如果我的数据库中有超过5000个项目呢?如何获得所有现有产品,而不受特定数量的限制?