Php 如何编写GET请求以检索WooCommerce上的所有产品(不仅仅是前10个产品)

Php 如何编写GET请求以检索WooCommerce上的所有产品(不仅仅是前10个产品),php,wordpress,rest,woocommerce,Php,Wordpress,Rest,Woocommerce,所以我想将一个外部数据库连接到woocommerce数据库,以便从那里导出产品并将其导入woocommerce。当然,我首先要检查这些产品是否已经存在,如果存在,则更新它们,而不是创建副本。我相信下面的算法是可行的,但它需要最后的测试。不幸的是,如果我不能从woocommerce获得所有产品,我无法运行测试,目前只有10个 难道没有一种方法可以使用WooCommerce的Automatic来获得所有的产品而不是10个吗?如果可能的话,我不想在页面之间循环 对代码其他部分的任何输入也将非常感谢 我

所以我想将一个外部数据库连接到woocommerce数据库,以便从那里导出产品并将其导入woocommerce。当然,我首先要检查这些产品是否已经存在,如果存在,则更新它们,而不是创建副本。我相信下面的算法是可行的,但它需要最后的测试。不幸的是,如果我不能从woocommerce获得所有产品,我无法运行测试,目前只有10个

难道没有一种方法可以使用WooCommerce的Automatic来获得所有的产品而不是10个吗?如果可能的话,我不想在页面之间循环

对代码其他部分的任何输入也将非常感谢

我见过有人使用wc_get_产品,但我不知道如何将其集成到我的代码中

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个项目呢?如何获得所有现有产品,而不受特定数量的限制?