WooCommerceImportCleanupService.php
2 months ago
WooCommerceImportJob.php
2 months ago
WooCommerceImportService.php
2 weeks ago
WooCommerceImportTask.php
2 months ago
WooCommerceProductMapper.php
2 months ago
WooCommerceImportJob.php
112 lines
| 1 | <?php |
| 2 | |
| 3 | namespace SureCart\Sync\WooCommerce; |
| 4 | |
| 5 | use SureCart\Background\Job; |
| 6 | |
| 7 | /** |
| 8 | * Background job that imports WooCommerce products into SureCart. |
| 9 | * |
| 10 | * Paginates through WC products and dispatches batches of IDs to |
| 11 | * WooCommerceImportTask for mapping and API import. |
| 12 | * |
| 13 | * @package SureCart |
| 14 | */ |
| 15 | class WooCommerceImportJob extends Job { |
| 16 | |
| 17 | /** |
| 18 | * The prefix for the action. |
| 19 | * |
| 20 | * @var string |
| 21 | */ |
| 22 | protected $prefix = 'surecart'; |
| 23 | |
| 24 | /** |
| 25 | * The action. |
| 26 | * |
| 27 | * @var string |
| 28 | */ |
| 29 | protected $action = 'woo_import_products'; |
| 30 | |
| 31 | /** |
| 32 | * Process one page of WooCommerce products. |
| 33 | * |
| 34 | * Fetches product IDs for the current page and dispatches them |
| 35 | * to the task for mapping and API import. |
| 36 | * |
| 37 | * @param mixed $args Queue item with 'page' and 'batch_size' keys. |
| 38 | * |
| 39 | * @return mixed Modified args for next page, or false when done. |
| 40 | */ |
| 41 | protected function task( $args ) { |
| 42 | $page = $args['page'] ?? 1; |
| 43 | $batch_size = max( 1, min( 500, (int) ( $args['batch_size'] ?? 100 ) ) ); |
| 44 | |
| 45 | if ( ! class_exists( 'WooCommerce' ) ) { |
| 46 | return false; |
| 47 | } |
| 48 | |
| 49 | // Cache imported IDs for the duration of this job run to avoid |
| 50 | // repeated unbounded get_posts() queries on every page. |
| 51 | $cache_key = 'sc_woo_import_excluded_ids'; |
| 52 | $imported_ids = get_transient( $cache_key ); |
| 53 | |
| 54 | if ( false === $imported_ids ) { |
| 55 | $imported_ids = get_posts( |
| 56 | [ |
| 57 | 'post_type' => 'product', |
| 58 | 'meta_key' => '_surecart_imported', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key |
| 59 | 'fields' => 'ids', |
| 60 | 'numberposts' => -1, |
| 61 | ] |
| 62 | ); |
| 63 | // Cache for 1 hour — job will complete well within this window. |
| 64 | set_transient( $cache_key, $imported_ids, HOUR_IN_SECONDS ); |
| 65 | } |
| 66 | |
| 67 | $query_args = [ |
| 68 | 'limit' => $batch_size, |
| 69 | 'page' => $page, |
| 70 | 'return' => 'ids', |
| 71 | 'paginate' => true, |
| 72 | ]; |
| 73 | |
| 74 | if ( ! empty( $imported_ids ) ) { |
| 75 | $query_args['exclude'] = $imported_ids; |
| 76 | } |
| 77 | |
| 78 | $products = wc_get_products( $query_args ); |
| 79 | |
| 80 | // Validate result in case WooCommerce was deactivated mid-sync. |
| 81 | if ( ! is_object( $products ) || ! isset( $products->products, $products->max_num_pages ) ) { |
| 82 | return false; |
| 83 | } |
| 84 | |
| 85 | // Dispatch product IDs to the task for processing. |
| 86 | if ( ! empty( $products->products ) ) { |
| 87 | $this->task->queue( $products->products ); |
| 88 | } |
| 89 | |
| 90 | // More pages to process. |
| 91 | if ( $products->max_num_pages > $page ) { |
| 92 | return [ |
| 93 | 'page' => $page + 1, |
| 94 | 'batch_size' => $batch_size, |
| 95 | ]; |
| 96 | } |
| 97 | |
| 98 | return false; |
| 99 | } |
| 100 | |
| 101 | /** |
| 102 | * Complete processing. |
| 103 | * |
| 104 | * Kicks off the queue immediately to start processing tasks. |
| 105 | */ |
| 106 | protected function complete() { |
| 107 | delete_transient( 'sc_woo_import_excluded_ids' ); |
| 108 | \SureCart::queue()->run(); |
| 109 | parent::complete(); |
| 110 | } |
| 111 | } |
| 112 |