Массовое добавление товаров в Woocommerce на php
Пишу расширение для woocommerce, это моя первая задача на WP. Мне нужно массово загружать товары с помощью php из МоегоСклада. Но проблема в том, что мне нужно выгружать не весь каталог моего склада, а только определенную часть. При активации плагина у меня выгружается только 2 товара от силы, и потом выдает 504. Как я могу оптимизировать работу своего плагина? В данный момент я выгружаю товары при активации плагина, а в последующем я хочу поставить это действие на крон раз в 4 часа.
function addProduct($data, $objProduct) {
try {
$objProduct->set_name($data['name']);
$objProduct->set_status("publish");
$objProduct->set_catalog_visibility($data['visibility']);
$objProduct->set_description($data['description']);
$objProduct->set_short_description($data['short_description']);
$objProduct->set_sku($data['sku']);
$objProduct->set_price($data['price']);
$objProduct->set_regular_price($data['price']);
$objProduct->set_manage_stock(true);
$objProduct->set_stock_quantity($data['stock_quantity']);
$objProduct->set_stock_status($data['stock_status']);
$objProduct->set_reviews_allowed(true);
$objProduct->set_sold_individually(false);
$objProduct->set_category_ids($data['category']);
$id = $objProduct->save();
return $id;
} catch (Exception $e) {
file_put_contents(__DIR__.'/../logs/productExceptions.log', $e->getMessage(),FILE_APPEND);
}
}
- Информация для загрузки подготавливается здесь
function addItems2Wordpress($items, $fullStock, $modifications, $images, $shortDescriptions, $categories, $simple, $variable) {
$catalog = new Catalog();
foreach ($items as $item) {
$description = null;
$variations = null;
$imageUrls = null;
$variability = $catalog->isProductVariable($item->name, $modifications);
$rawCategory = $catalog->getProductCategory($item->pathName);
$category = $catalog->getWordPressProductCategory($rawCategory, $categories);
$check = $catalog->isProductExists($item->code);
$stock = $catalog->getProductStock($item->code, $fullStock);
$stockStatus = $catalog->getStockStatus($stock, $item->name);
$visibility = $catalog->getProductVisibility($item->name);
if (isset($shortDescriptions[$item->code])) {
$description = $catalog->getShortDescription($shortDescriptions[($item->code)]);
}
if ($check === true) continue;
if (is_array($variability)) {
$variations[$item->code] = $variability;
$variability = 'variable';
}
$data = createUploadProductData($item, $variability, $category, $stock, $stockStatus, $description, $visibility);
if ($variability == 'simple' && $variations == null) {
$product = addProduct($data, $simple);
}
if ($variability == 'variable' && $variations !== null) {
$product = addProduct($data, $variable);
if (isset($variations)) {
$data = createProductVariationsData($variations[$item->code], $modifications, $fullStock, $catalog);
$res = createProductVariations($data, $product);
}
}
}
}
- В интернете нашла решение что при 504 нужно сделать изменения в php.ini поставила так
max_execution_time = 500
- в apache
Timeout 1000
думаю, что проблема возможно из-за цикла, потому что перед этим у меня еще и данные по api из МоегоСклада собираются и только потом отдаются в метод addItems2Wordpress. или может это потому что не знаю как подружить apache и fpm SOS :(
- сам плагин будет выглядеть так, и время конечно будет не 5 минут
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
require_once plugin_dir_path(__FILE__) . 'includes/wc-kit-functions.php';
require plugin_dir_path( __FILE__ ) . 'vendor/autoload.php';
use Src\MoiSklad;
/**
* Check if WooCommerce is active
*/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
register_activation_hook( __FILE__, 'activate_cron');
add_action('sync', 'sync_catalog', 10);
function activate_cron() {
wp_schedule_event(time(), '4hours', 'sync');
}
function my_cron_schedules($schedules){
if(!isset($schedules['4hours'])){
$schedules['4hours'] = array(
'interval' => 5*60,
'display' => __('Once every 4 hours'));
}
return $schedules;
}
add_filter('cron_schedules','my_cron_schedules');
function sync_catalog() {
$link = new MoiSklad();
$rawItems = getItemsFromMS($link);
$itemsMS = $rawItems[0];
$description = $rawItems[1];
$rawStock = getStockFromMS($link, $itemsMS);
$stockMS = $rawStock[0];
$variant = $rawStock[1];
$categories = $rawStock[2];
$images = getImagesFromMS($link, $stockMS);
$simple = new WC_Product();
$variable = new WC_Product_Variable();
$itemsWP = addItems2WordPress($itemsMS, $stockMS, $variant, $images, $description, $categories, $simple, $variable);
}
}