Anonymous
Строка списка продуктов API в массив PHP
Сообщение
Anonymous » 12 дек 2024, 23:36
Я пытаюсь получить определенные продукты с одного сайта и передать их на другой веб-сайт с помощью WooCommerce Rest API. У меня работает Rest API, и он захватывает нужные продукты, однако я застреваю в ответе. Вот шаги, над которыми я работаю:
Создайте запрос cURL для получения продуктов с родительского сайта
Используйте ответ запроса cURL для прохода по каждому продукту
Внутри цикла обновляйте поля, возвращаемые из ответа.
Вот мой PHP-код:
Код: Выделить всё
function test_api() {
$url = "https://www.example.com/wp-json/wc/v3/products";
$consumer_key = 'XXX';
$consumer_secret = 'XXX';
$params = array(
'consumer_key' => $consumer_key,
'consumer_secret' => $consumer_secret,
'tag' => 5303,
'_fields' => 'id,name,regular_price,sku,permalink,short_description,categories,stock_status,images,type,variations,status',
);
$endpoint = $url.'?'.implode('&', array_map(
function($v, $k) {
return sprintf("%s=%s", $k, $v);
}, $params, array_keys($params)
));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_USERPWD, "$consumer_key:$consumer_secret");
$result = curl_exec ($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch);
//Continue the functions
parse_api_products(json_decode($result, true));
wp_send_json_success(json_decode($result, true)); //Using this as ajax for testing for now
}
function parse_api_products($response) {
$product_list = print_r($response, true);
$date_updated = date('m-d-Y g:ia');
//Log the response
$logger = wc_get_logger();
$context = array('source' => 'api-product-sync');
$logger->info('API Product Sync: ' . $product_list, $context);
$logger->warning($product_list, array('source' => 'test'));
foreach ($product_list as $item) {
$sku = $item->sku;
$product_id = wc_get_product_id_by_sku( $sku );
if($product_id) {
$product = wc_get_product($product_id);
wp_update_post([
'ID' => $product_id,
'post_title' => $item->name
]);
update_post_meta( $product_id, '_regular_price', $item->stock_status);
update_post_meta( $product_id, '_stock_status', $item->stock_status);
$product->set_short_description($item->short_description);
}
}
}
Код ошибки, который я получаю:
Код: Выделить всё
[proxy_fcgi:error [pid 1752176:tid 1752345 [client 69.92.178.86:0 AH01071: Got error 'PHP message: PHP Warning: foreach() argument must be of type array|object, string given in /home/13622.cloudwaysapps.com/wjzzcseneb/public_html/wp-content/themes/bricks-child/functions.php on line 602', referer: https://woocommerce-1362296-50153.cloudwaysapps.com/test-page/
Я также добавил эти данные в WC Logger и получил следующий результат:
Код: Выделить всё
2024-12-12T20:19:18+00:00 Warning Array
(
[0] => Array
(
[id] => 205881
[name] => AA Test Product
[regular_price] => 19
[sku] => skutestaa01
[permalink] => https://www.example.com/?post_type=product&p=205881
[short_description] =>
[categories] => Array
(
[0] => Array
(
[id] => 817
[name] => Phone Cases
[slug] => phone-cases
)
[1] => Array
(
[id] => 870
[name] => Necklaces
[slug] => necklaces
)
)
[images] => Array
(
[0] => Array
(
[id] => 206076
[date_created] => 2024-12-04T06:19:06
[date_created_gmt] => 2024-12-04T20:19:06
[date_modified] => 2024-12-04T07:09:43
[date_modified_gmt] => 2024-12-04T21:09:43
[src] => https://cdn.example.com/2024/12/Winter.jpg
[name] => Winter
[alt] =>
)
[1] => Array
(
[id] => 206075
[date_created] => 2024-12-04T06:19:00
[date_created_gmt] => 2024-12-04T20:19:00
[date_modified] => 2024-12-04T07:28:37
[date_modified_gmt] => 2024-12-04T21:28:37
[src] => https://cdn.example.com/2024/12/New-Brands.jpg
[name] => New Brands
[alt] =>
)
)
[type] => simple
[variations] => Array
(
)
[status] => draft
[stock_status] => instock
)
[1] => Array
(
[id] => 206510
[name] => AA Test Product #2
[regular_price] =>
[sku] => aa-sku-test-0
[permalink] => https://www.example.com/?post_type=product&p=206510
[short_description] =>
This is a test!
[categories] => Array
(
[0] => Array
(
[id] => 2038
[name] => Top Sellers
[slug] => top-sellers
)
)
[images] => Array
(
[0] => Array
(
[id] => 206488
[date_created] => 2024-12-12T01:06:46
[date_created_gmt] => 2024-12-12T15:06:46
[date_modified] => 2024-12-12T01:06:46
[date_modified_gmt] => 2024-12-12T15:06:46
[src] => https://cdn.example.com/2021/05/ST.jpg
[name] => ST
[alt] =>
)
)
[type] => variable
[variations] => Array
(
[0] => 206511
[1] => 206512
)
[status] => draft
[stock_status] => instock
)
)
Текущая переменная $product_list соответствует массиву PHP, но по какой-то причине возвращается в виде строки, вызывающей ошибку. Я пробовал использовать ответ JSON из исходного ответа cURL, но он также выдает различные ошибки, поскольку возвращается в виде строки (даже когда я пытаюсь его декодировать). Что я могу сделать, чтобы эта переменная читалась как массив, чтобы я мог обрабатывать обновления в цикле foreach?
Подробнее здесь:
https://stackoverflow.com/questions/792 ... -php-array
1734035763
Anonymous
Я пытаюсь получить определенные продукты с одного сайта и передать их на другой веб-сайт с помощью WooCommerce Rest API. У меня работает Rest API, и он захватывает нужные продукты, однако я застреваю в ответе. Вот шаги, над которыми я работаю: [list] [*]Создайте запрос cURL для получения продуктов с родительского сайта [*]Используйте ответ запроса cURL для прохода по каждому продукту [*]Внутри цикла обновляйте поля, возвращаемые из ответа. [/list] Вот мой PHP-код: [code] function test_api() { $url = "https://www.example.com/wp-json/wc/v3/products"; $consumer_key = 'XXX'; $consumer_secret = 'XXX'; $params = array( 'consumer_key' => $consumer_key, 'consumer_secret' => $consumer_secret, 'tag' => 5303, '_fields' => 'id,name,regular_price,sku,permalink,short_description,categories,stock_status,images,type,variations,status', ); $endpoint = $url.'?'.implode('&', array_map( function($v, $k) { return sprintf("%s=%s", $k, $v); }, $params, array_keys($params) )); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $endpoint); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_USERPWD, "$consumer_key:$consumer_secret"); $result = curl_exec ($ch); $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close ($ch); //Continue the functions parse_api_products(json_decode($result, true)); wp_send_json_success(json_decode($result, true)); //Using this as ajax for testing for now } function parse_api_products($response) { $product_list = print_r($response, true); $date_updated = date('m-d-Y g:ia'); //Log the response $logger = wc_get_logger(); $context = array('source' => 'api-product-sync'); $logger->info('API Product Sync: ' . $product_list, $context); $logger->warning($product_list, array('source' => 'test')); foreach ($product_list as $item) { $sku = $item->sku; $product_id = wc_get_product_id_by_sku( $sku ); if($product_id) { $product = wc_get_product($product_id); wp_update_post([ 'ID' => $product_id, 'post_title' => $item->name ]); update_post_meta( $product_id, '_regular_price', $item->stock_status); update_post_meta( $product_id, '_stock_status', $item->stock_status); $product->set_short_description($item->short_description); } } } [/code] Код ошибки, который я получаю: [code][proxy_fcgi:error [pid 1752176:tid 1752345 [client 69.92.178.86:0 AH01071: Got error 'PHP message: PHP Warning: foreach() argument must be of type array|object, string given in /home/13622.cloudwaysapps.com/wjzzcseneb/public_html/wp-content/themes/bricks-child/functions.php on line 602', referer: https://woocommerce-1362296-50153.cloudwaysapps.com/test-page/ [/code] Я также добавил эти данные в WC Logger и получил следующий результат: [code]2024-12-12T20:19:18+00:00 Warning Array ( [0] => Array ( [id] => 205881 [name] => AA Test Product [regular_price] => 19 [sku] => skutestaa01 [permalink] => https://www.example.com/?post_type=product&p=205881 [short_description] => [categories] => Array ( [0] => Array ( [id] => 817 [name] => Phone Cases [slug] => phone-cases ) [1] => Array ( [id] => 870 [name] => Necklaces [slug] => necklaces ) ) [images] => Array ( [0] => Array ( [id] => 206076 [date_created] => 2024-12-04T06:19:06 [date_created_gmt] => 2024-12-04T20:19:06 [date_modified] => 2024-12-04T07:09:43 [date_modified_gmt] => 2024-12-04T21:09:43 [src] => https://cdn.example.com/2024/12/Winter.jpg [name] => Winter [alt] => ) [1] => Array ( [id] => 206075 [date_created] => 2024-12-04T06:19:00 [date_created_gmt] => 2024-12-04T20:19:00 [date_modified] => 2024-12-04T07:28:37 [date_modified_gmt] => 2024-12-04T21:28:37 [src] => https://cdn.example.com/2024/12/New-Brands.jpg [name] => New Brands [alt] => ) ) [type] => simple [variations] => Array ( ) [status] => draft [stock_status] => instock ) [1] => Array ( [id] => 206510 [name] => AA Test Product #2 [regular_price] => [sku] => aa-sku-test-0 [permalink] => https://www.example.com/?post_type=product&p=206510 [short_description] => This is a test! [categories] => Array ( [0] => Array ( [id] => 2038 [name] => Top Sellers [slug] => top-sellers ) ) [images] => Array ( [0] => Array ( [id] => 206488 [date_created] => 2024-12-12T01:06:46 [date_created_gmt] => 2024-12-12T15:06:46 [date_modified] => 2024-12-12T01:06:46 [date_modified_gmt] => 2024-12-12T15:06:46 [src] => https://cdn.example.com/2021/05/ST.jpg [name] => ST [alt] => ) ) [type] => variable [variations] => Array ( [0] => 206511 [1] => 206512 ) [status] => draft [stock_status] => instock ) ) [/code] Текущая переменная $product_list соответствует массиву PHP, но по какой-то причине возвращается в виде строки, вызывающей ошибку. Я пробовал использовать ответ JSON из исходного ответа cURL, но он также выдает различные ошибки, поскольку возвращается в виде строки (даже когда я пытаюсь его декодировать). Что я могу сделать, чтобы эта переменная читалась как массив, чтобы я мог обрабатывать обновления в цикле foreach? Подробнее здесь: [url]https://stackoverflow.com/questions/79276527/api-product-list-string-to-php-array[/url]