Массовое добавление товаров в 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);
    }
}

Ответы (0 шт):