{"id":321283,"date":"2026-06-04T11:43:49","date_gmt":"2026-06-04T11:43:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/shopee2woo-import-shopee-products-for-woocommerce\/"},"modified":"2026-06-04T11:43:23","modified_gmt":"2026-06-04T11:43:23","slug":"lestari","status":"publish","type":"plugin","link":"https:\/\/cn.wordpress.org\/plugins\/lestari\/","author":23497456,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.8","stable_tag":"1.5.8","tested":"7.0","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Lestari Importer for Woo with Shopee","header_author":"Markas Studio","header_description":"Import Shopee catalog data into your Woo store with secure browser pairing, staging review, image handling, duplicate control, and reliable publishing tools.","assets_banners_color":"f2ecf2","last_updated":"2026-06-04 11:43:23","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/studio.markashosting.com\/plugins\/lestari\/","header_author_uri":"https:\/\/studio.markashosting.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":34,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.8":{"tag":"1.5.8","author":"studiomarkas","date":"2026-06-04 11:43:23"}},"upgrade_notice":{"1.5.8":"<p>WordPress.org review hardening: enqueue compliance, escape-on-output for inline SVGs, removal of two unnecessary core-file requires, and a clearer Free-vs-Pro readme. No database migration required.<\/p>","1.5.0":"<p>Plugin renamed to &quot;Lestari Importer for Woo with Shopee&quot; with a corresponding slug, text-domain, and REST-namespace change. The activator runs an idempotent migration so existing data is preserved on upgrade.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3560985,"resolution":"256x256","location":"assets","locale":"","width":768,"height":768}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3560985,"resolution":"1544x500","location":"assets","locale":"","width":2000,"height":648},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3560985,"resolution":"772x250","location":"assets","locale":"","width":1500,"height":486}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.8"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[265817,21735,250630,19979,286],"plugin_category":[45],"plugin_contributors":[265273],"plugin_business_model":[],"class_list":["post-321283","plugin","type-plugin","status-publish","hentry","plugin_tags-catalog-import","plugin_tags-product-import","plugin_tags-shopee","plugin_tags-staging","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-studiomarkas","plugin_committers-studiomarkas"],"banners":{"banner":"https:\/\/ps.w.org\/lestari\/assets\/banner-772x250.png?rev=3560985","banner_2x":"https:\/\/ps.w.org\/lestari\/assets\/banner-1544x500.png?rev=3560985","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/lestari\/assets\/icon-256x256.png?rev=3560985","icon_2x":"https:\/\/ps.w.org\/lestari\/assets\/icon-256x256.png?rev=3560985","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Lestari Importer turns Shopee listings into reviewable WooCommerce drafts. The companion browser extension reads the Shopee product page the merchant is already looking at and sends the data, over a signed REST request, to a staging area inside the WordPress admin. Nothing is published automatically \u2014 every title, price, stock count, description, and image lands in staging first, ready for the merchant to edit, approve, or discard.<\/p>\n\n<p>One paired site. One pairing code. One staging queue. No accounts to create, no third-party SaaS sitting in the middle of the data flow.<\/p>\n\n<h4>What Lestari Importer does<\/h4>\n\n<ul>\n<li><strong>Paired browser-extension intake<\/strong> \u2014 the extension you install in your browser is the only thing that sends product data to your site; the WordPress plugin never reaches out to Shopee servers itself.<\/li>\n<li><strong>HMAC-SHA256 signed REST endpoint<\/strong> \u2014 every receive call is authenticated with a per-site token established at pairing time and bound to the originating extension identifier.<\/li>\n<li><strong>Review-first staging area<\/strong> \u2014 incoming products are queued for human review with editable title, price, stock, description, categories, tags, gallery, and per-row variation matrix.<\/li>\n<li><strong>Image sideloading with deduplication<\/strong> \u2014 product images are downloaded into the WordPress media library, deduplicated by source URL and SHA-256 hash so re-imports do not flood your library.<\/li>\n<li><strong>Duplicate handling<\/strong> \u2014 choose to skip, update, or create a new copy when the importer sees a product it has imported before; detection works on a stable source-id postmeta key.<\/li>\n<li><strong>HPOS-compatible<\/strong> \u2014 the plugin reads and writes only its own staging tables plus WooCommerce's standard <code>WC_Product<\/code> CRUD; it never touches WooCommerce orders, so it declares full High-Performance Order Storage compatibility.<\/li>\n<li><strong>Report-a-Bug from the admin<\/strong> \u2014 an optional, opt-in modal lets you send a focused bug report to the plugin author (only when you click Send; never in the background). See <em>Privacy &amp; External Services<\/em> below for the exact data sent.<\/li>\n<\/ul>\n\n<h4>Free vs Pro<\/h4>\n\n<p>The free plugin you are installing is the complete day-to-day importer. Lestari Importer Pro is an optional paid add-on, sold separately at the link below; it is <strong>not<\/strong> bundled here and the free plugin does not depend on it.<\/p>\n\n<p><strong>Free \u2014 the everyday import workflow<\/strong><\/p>\n\n<ul>\n<li>Receive products from the paired browser extension via the signed REST endpoint<\/li>\n<li>Staging-area review with editable title, price, stock, description, categories, tags, and gallery<\/li>\n<li>Image sideloading with URL and SHA-256 deduplication<\/li>\n<li>Duplicate handling: skip, update, or create a new copy<\/li>\n<li>HPOS-compatible WooCommerce product creation<\/li>\n<li>Report-a-Bug modal with opt-out diagnostics and a local 50-row bounded log<\/li>\n<li>Clean uninstall, with an explicit \"Keep my data\" opt-in<\/li>\n<\/ul>\n\n<p><strong>Pro \u2014 everything in Free, plus:<\/strong><\/p>\n\n<ul>\n<li><strong>Variable Products<\/strong> \u2014 explicit Variable import intent always creates a <code>WC_Product_Variable<\/code> parent and rebuilds the attribute\/variation matrix, even when the scraper returned an empty variant list<\/li>\n<li><strong>Per-product markup<\/strong> \u2014 apply a percentage or flat-amount markup to the imported regular price, with live final-price preview in the staging editor and per-variant override<\/li>\n<li><strong>Bulk-select import from a shop page<\/strong> \u2014 pick multiple products at once from a Shopee shop URL via the extension's selection mode<\/li>\n<li><strong>Priority email support<\/strong> \u2014 direct support channel for Pro licence holders<\/li>\n<\/ul>\n\n<p>\ud83d\udc49 <strong><a href=\"https:\/\/studio.markashosting.com\/plugins\/lestari\/lestari-pro\/\">Learn more about Lestari Importer Pro<\/a><\/strong><\/p>\n\n<h4>About Shopee<\/h4>\n\n<p>Lestari Importer is <strong>not<\/strong> affiliated with, endorsed by, or connected to Shopee, Sea Group, or any of their subsidiaries. \"Shopee\" is a trademark of its respective owner and is used here only to describe the type of source data the companion browser extension reads from the page the merchant is currently viewing.<\/p>\n\n<h3>Privacy &amp; External Services<\/h3>\n\n<p>Lestari Importer is built around an <strong>inbound<\/strong> data flow: the companion browser extension, running in the merchant's own browser, posts product data to a REST endpoint on your WordPress site. Your site is the receiver. The plugin does <strong>not<\/strong> initiate outbound HTTP requests during normal import operation \u2014 no telemetry, no analytics, no automatic check-ins.<\/p>\n\n<p>The only outbound HTTP request the plugin ever makes is the optional <strong>Report a Bug<\/strong> submission, and only when an administrator types into the modal and clicks Send.<\/p>\n\n<h4>Data sent only when a bug report is submitted<\/h4>\n\n<ul>\n<li>The Subject and Message you type, verbatim.<\/li>\n<li>An optional reply-to email address \u2014 only if you fill it in; left blank, the submission is anonymous.<\/li>\n<li>Up to three image attachments (drag-drop, file picker, or paste-from-clipboard). Images are auto-resized client-side to a 1920px longest edge with progressive JPEG quality steps so screenshots fit within the wire budget.<\/li>\n<li>Optional diagnostics \u2014 opt-out, shown to you before sending: plugin version, WordPress version, PHP version, MySQL version, WooCommerce version (if active), active theme name and version, locale, multisite flag, and PHP <code>memory_limit<\/code>.<\/li>\n<li><strong>Never auto-collected<\/strong>: site URL, administrator email, license keys, pairing tokens, user lists, active-plugin lists, or any WooCommerce order \/ customer \/ product data.<\/li>\n<\/ul>\n\n<p>A local copy of every submission is written to a bounded log (the <code>lestari_importer_feedback_log<\/code> option, capped at the 50 most recent entries, FIFO-rotated). The local log stores per-attachment metadata only (filename, MIME, byte size) \u2014 never the image binary.<\/p>\n\n<h4>External service used<\/h4>\n\n<ul>\n<li><strong>Service:<\/strong> <a href=\"https:\/\/projects.markas.cloud\/wp-json\/markas\/v1\/plugin-bug\">Markas Studio bug-report receiver<\/a><\/li>\n<li><strong>Purpose:<\/strong> Deliver administrator-submitted bug reports to the plugin author's private triage dashboard for support investigation. Data is sent only after you click Send \u2014 never automatically and never on any other admin screen.<\/li>\n<li><strong>What is sent:<\/strong> Exactly the payload described in the section above and shown to you under \"See what will be sent\" before the Send button enables.<\/li>\n<li><strong><a href=\"https:\/\/studio.markashosting.com\/plugins\/lestari\/terms\/\">Terms of Use<\/a><\/strong> \u00b7 <strong><a href=\"https:\/\/studio.markashosting.com\/plugins\/lestari\/privacy-policy\/\">Privacy Policy<\/a><\/strong><\/li>\n<\/ul>\n\n<h4>Companion browser extension<\/h4>\n\n<p>The companion extension reads the Shopee product page that the merchant is viewing in their browser and sends the extracted product data to <em>your<\/em> WordPress site's own <code>\/wp-json\/lestari\/v1\/receive<\/code> endpoint, signed with the pairing token. This is an inbound request to your site; the WordPress plugin does not contact Shopee servers itself. The extension is documented and downloaded from the plugin author's site: <a href=\"https:\/\/studio.markashosting.com\/plugins\/lestari\/extension\/\">https:\/\/studio.markashosting.com\/plugins\/lestari\/extension\/<\/a>.<\/p>\n\n<h4>Data the plugin stores on your site<\/h4>\n\n<ul>\n<li>The staging area's product rows (<code>wp_lestari_importer_staging<\/code>, <code>wp_lestari_importer_staging_items<\/code>).<\/li>\n<li>Plugin settings (<code>lestari_importer_settings<\/code>, <code>lestari_importer_secret<\/code>, <code>lestari_importer_site_tokens<\/code>, <code>lestari_importer_pairing_pending<\/code>, <code>lestari_importer_keep_data_on_uninstall<\/code>).<\/li>\n<li>Postmeta on each imported WooCommerce product, keyed by <code>_lestari_importer_source_id<\/code> (so duplicate detection works on re-import).<\/li>\n<li>The Report-a-Bug bounded local log (<code>lestari_importer_feedback_log<\/code>, capped at 50 rows). Attachment binaries are not included.<\/li>\n<\/ul>\n\n<h4>Data on uninstall<\/h4>\n\n<p>When you delete the plugin, all of the items above are removed unless you have enabled <em>Keep data on uninstall<\/em> in the Settings tab before uninstalling.<\/p>\n\n<h3>Developer reference<\/h3>\n\n<p>The plugin exposes filters and actions so add-ons can extend its behaviour without modifying core files:<\/p>\n\n<ul>\n<li><code>lestari\/default_settings<\/code> (filter) \u2014 extend the default settings array on first install.<\/li>\n<li><code>lestari\/admin\/tabs<\/code> (filter) \u2014 register additional admin tabs.<\/li>\n<li><code>lestari\/admin\/render_tab<\/code> (filter) \u2014 render the body of a custom tab.<\/li>\n<li><code>lestari\/admin\/settings_tab_extra<\/code> (action) \u2014 append rows to the Settings tab.<\/li>\n<li><code>lestari\/license\/is_pro<\/code> (filter) \u2014 report Pro status from a separately-installed add-on.<\/li>\n<li><code>lestari\/booted<\/code> (action) \u2014 fires after the plugin has finished booting.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin ZIP through <em>Plugins \u2192 Add New \u2192 Upload Plugin<\/em>, or unzip the <code>lestari<\/code> folder into <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin via the <em>Plugins<\/em> screen.<\/li>\n<li>Make sure WooCommerce 8.0 or newer is installed and active.<\/li>\n<li>Open <strong>Lestari Importer<\/strong> in the admin sidebar, generate a 6-digit pairing code, and enter that code in the companion browser extension.<\/li>\n<li>Open a Shopee product page in your browser, click the extension's import action, and the product will appear in <em>Lestari Importer \u2192 Staging Area<\/em> for review.<\/li>\n<\/ol>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.4 or newer.<\/li>\n<li>WooCommerce 8.0 or newer, active.<\/li>\n<li>PHP 7.4 or newer.<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20the%20companion%20browser%20extension%3F\"><h3>Do I need the companion browser extension?<\/h3><\/dt>\n<dd><p>Yes. The extension is the only component that reads data from a Shopee page; the WordPress plugin only receives that data over its own REST endpoint. Without the extension, there is no source of products.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20call%20the%20official%20shopee%20api%3F\"><h3>Does this plugin call the official Shopee API?<\/h3><\/dt>\n<dd><p>No. The plugin does not call the Shopee Open Platform API and does not contact Shopee servers from your WordPress site. All product data originates from the page the merchant is viewing in their own browser, via the companion extension.<\/p><\/dd>\n<dt id=\"how%20secure%20is%20the%20pairing%3F\"><h3>How secure is the pairing?<\/h3><\/dt>\n<dd><p>Pairing uses a 6-digit code with a short expiry. After pairing, every receive request from the extension is signed with HMAC-SHA256 using a per-site token established at pairing time; the extension's installation identifier is bound to that token and checked on every receive call.<\/p><\/dd>\n<dt id=\"will%20i%20lose%20my%20settings%20if%20i%20deactivate%20the%20plugin%3F\"><h3>Will I lose my settings if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>No. Deactivation leaves settings, the staging area, and the pairing token intact. Data is removed only when you delete the plugin \u2014 and even then you can opt in to keep it via the <em>Keep data on uninstall<\/em> checkbox in <em>Settings<\/em>.<\/p><\/dd>\n<dt id=\"how%20are%20existing%20settings%20preserved%20on%20upgrade%3F\"><h3>How are existing settings preserved on upgrade?<\/h3><\/dt>\n<dd><p>The activator runs an idempotent migration from earlier internal identifier namespaces into the current <code>lestari_importer_*<\/code> \/ <code>_lestari_importer_*<\/code> \/ <code>lestari\/*<\/code> identifiers. The migration is a no-op on fresh installs and on installs that are already on the current namespace.<\/p><\/dd>\n<dt id=\"where%20do%20i%20get%20support%3F\"><h3>Where do I get support?<\/h3><\/dt>\n<dd><p>Free support is available through the WordPress.org support forum for this plugin. Priority support is available with <a href=\"https:\/\/studio.markashosting.com\/plugins\/lestari\/lestari-pro\/\">Lestari Importer Pro<\/a>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.8<\/h4>\n\n<ul>\n<li>Fixed WordPress.org plugin review blockers from the manual round-two review:\n\n<ul>\n<li>All admin CSS and JavaScript are now enqueued via <code>wp_enqueue_style<\/code> \/ <code>wp_enqueue_script<\/code> \u2014 no inline <code>&lt;style&gt;<\/code> or <code>&lt;script&gt;<\/code> blocks remain. The legacy-notice suppressor and the plugin-row \"Go Pro\" link styling are real on-disk assets loaded only where they apply.<\/li>\n<li>The two <code>require_once ABSPATH . 'wp-admin\/includes\/\u2026'<\/code> calls flagged by the reviewer (<code>image.php<\/code> in the media sideloader and <code>plugin.php<\/code> in the active-plugin probe) have been removed; the helpers they were guarding have lived in core since well before our WP 6.4 floor.<\/li>\n<li>Two unescaped echoes in <code>tab-pro.php<\/code> and <code>tab-pairing.php<\/code> (inline SVG icons and the Shopee wordmark) now pass through <code>wp_kses()<\/code> with strict per-element allowlists \u2014 no <code>phpcs:ignore<\/code> suppression remains.<\/li>\n<li>The External Services section of this readme links the Terms of Use and Privacy Policy as proper Markdown links so the WordPress.org link-validation step picks them up.<\/li>\n<\/ul><\/li>\n<li>Refreshed the readme to clarify Free vs Pro and the affiliation-with-Shopee disclaimer at the top of the description.<\/li>\n<li>No database or settings migration is required.<\/li>\n<\/ul>\n\n<h4>1.5.7<\/h4>\n\n<ul>\n<li>Asset cache-busting and pointer-event fixes for the staging-area glossary modal.<\/li>\n<li>Internal QA build.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Renamed plugin to \"Lestari Importer for Woo with Shopee\" to comply with WordPress.org trademark and naming guidelines.<\/li>\n<li>Updated text domain, admin slug, REST namespace, public URLs, and the affiliation disclaimer to use the new canonical slug <code>lestari<\/code>.<\/li>\n<\/ul>\n\n<h4>1.4.13<\/h4>\n\n<ul>\n<li>Report-a-Bug modal: bounded local log (50 entries, FIFO), opt-out diagnostics, paste-from-clipboard, and an inline \"See what will be sent\" preview before Send.<\/li>\n<li>Hardened sealed daily-import counter (AES-256-GCM envelope bound to the UTC date).<\/li>\n<li>Pro Features tab is now a factual, non-intrusive description of the optional paid add-on \u2014 no form fields, no inert inputs, no urgency copy. Hidden automatically when the Pro add-on registers its own License tab.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>HPOS compatibility declaration and Cart\/Checkout-blocks compatibility declaration.<\/li>\n<li>MIME-sniff from magic bytes for sideloaded images (JPEG \/ PNG \/ WebP).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release of the importer with paired browser-extension intake, HMAC-signed REST endpoint, staging area, image sideloading with deduplication, and configurable duplicate handling.<\/li>\n<\/ul>","raw_excerpt":"Import Shopee catalog data into your WooCommerce store via a paired browser extension \u2014 staged review, image sideloading, duplicate control.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/321283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=321283"}],"author":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/studiomarkas"}],"wp:attachment":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=321283"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=321283"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=321283"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=321283"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=321283"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=321283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}