[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f50AMwx7_MMMbh4toPIqjWjHW9tJbg-UyglHeU8u58qY":3},{"slug":4,"display_name":4,"profile_url":5,"plugin_count":6,"total_installs":7,"avg_security_score":8,"avg_patch_time_days":9,"trust_score":10,"computed_at":11,"plugins":12},"bauhaustech","https:\u002F\u002Fprofiles.wordpress.org\u002Fbauhaustech\u002F",1,0,100,30,94,"2026-08-29T19:25:42.447Z",[13],{"slug":14,"name":15,"version":16,"author":4,"author_profile":5,"description":17,"short_description":18,"active_installs":7,"downloaded":19,"rating":7,"num_ratings":7,"last_updated":20,"tested_up_to":21,"requires_at_least":22,"requires_php":23,"tags":24,"homepage":30,"download_link":31,"security_score":8,"vuln_count":7,"unpatched_count":7,"last_vuln_date":32,"fetched_at":33},"csv-resumable-importer-for-tainacan","CSV Resumable Importer for Tainacan","1.0.0","\u003Cp>This add-on registers an extra CSV importer in \u003Ca href=\"https:\u002F\u002Ftainacan.org\u002F\" rel=\"nofollow ugc\">Tainacan\u003C\u002Fa> whose attachment processing is \u003Cstrong>resumable\u003C\u002Fstrong>: the files listed in the \u003Ccode>special_attachments\u003C\u002Fcode> column are imported \u003Cstrong>one per background iteration\u003C\u002Fstrong>, instead of all at once.\u003C\u002Fp>\n\u003Cp>It does \u003Cstrong>not\u003C\u002Fstrong> modify Tainacan core — it registers an additional importer through the \u003Ccode>tainacan-register-importers\u003C\u002Fcode> hook, so it keeps working across Tainacan updates.\u003C\u002Fp>\n\u003Cp>This is an independent add-on developed by Bauhaus Tech. It is \u003Cstrong>not affiliated with, endorsed by, or part of\u003C\u002Fstrong> the Tainacan project.\u003C\u002Fp>\n\u003Ch4>The problem it solves\u003C\u002Fh4>\n\u003Cp>A CSV import in which a single item has many attachments (e.g. 150 images in \u003Ccode>special_attachments\u003C\u002Fcode>) fails with:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>PHP Fatal error: Maximum execution time of 360 seconds exceeded in ...\u002Fclass-wp-image-editor-imagick.php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>…and then \u003Cstrong>restarts from the beginning, duplicating items\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>The stock Tainacan CSV importer imports \u003Cstrong>all\u003C\u002Fstrong> of an item’s attachments inside a single \u003Ccode>after_inserted_item()\u003C\u002Fcode> call. Each file triggers \u003Ccode>wp_generate_attachment_metadata()\u003C\u002Fcode>, which generates thumbnails through Imagick — an expensive operation. The background process only checks its soft time limit (~20s) \u003Cstrong>between\u003C\u002Fstrong> \u003Ccode>task()\u003C\u002Fcode> iterations; since the 150 attachments run inside a single iteration, that limit is never checked mid-loop. The item alone exceeds PHP’s hard \u003Ccode>max_execution_time\u003C\u002Fcode>, the process dies mid-task \u003Cstrong>without persisting progress\u003C\u002Fstrong>, and the cron healthcheck \u003Cstrong>re-dispatches the batch from the last checkpoint\u003C\u002Fstrong> — recreating already-imported items.\u003C\u002Fp>\n\u003Ch4>How it works\u003C\u002Fh4>\n\u003Cp>Instead of importing attachments inline, this importer:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Queues\u003C\u002Fstrong> the item’s attachment paths\u002FURLs (stored in a transient serialized together with the process state).\u003C\u002Fli>\n\u003Cli>Processes \u003Cstrong>one attachment per iteration\u003C\u002Fstrong>, staying on the current item until the queue is empty.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Because each attachment becomes its own iteration, the soft 20s limit applies \u003Cstrong>between files\u003C\u002Fstrong>: the batch checkpoints regularly and the import becomes resumable. Idempotency is reinforced by persisting the already-created item id, so a resume continues the attachments instead of recreating the item.\u003C\u002Fp>\n\u003Ch4>Known limitations\u003C\u002Fh4>\n\u003Cp>Because this plugin \u003Cstrong>cannot modify Tainacan core\u003C\u002Fstrong>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>A single file whose processing alone exceeds \u003Ccode>max_execution_time\u003C\u002Fcode> still fails (pathological case).\u003C\u002Fli>\n\u003Cli>Progress is still persisted at the core’s ~20s \u003Ccode>handle()\u003C\u002Fcode> checkpoint, not per iteration (forcing a per-iteration checkpoint would require changing \u003Ccode>Background_Importer::task()\u003C\u002Fcode> in core). A fatal \u003Cstrong>within the same 20s window\u003C\u002Fstrong> may reprocess what was done since the last checkpoint. The definitive fix is the equivalent change upstream in Tainacan.\u003C\u002Fli>\n\u003C\u002Ful>\n","Resumable CSV importer for Tainacan: imports attachments one at a time to avoid execution timeouts and duplicate items on large imports.",96,"2026-06-23T23:52:00.000Z","7.0.2","5.9","7.4",[25,26,27,28,29],"attachments","background-process","csv","importer","tainacan","","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fcsv-resumable-importer-for-tainacan.1.0.0.zip",null,"2026-07-22T17:31:50.256Z"]