| 开发者 | limchik |
|---|---|
| 更新时间 | 2026年5月30日 23:18 |
| 捐献地址: | 去捐款 |
| PHP版本: | 8.0 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
id or sku (at least one is required)
Optional fields:
type
barcodeshort_descriptiondescriptionsale_startsale_endin_stockpricesale_pricecategoriestagsimagealt_text
Custom meta fields are stored as product meta keys without overwriting protected WooCommerce core fields.
The CSV structure is flexible. Only the required identifier field must be present.
All other fields are optional and processed only if provided.span.onsale element (the wrapper does not matter, but the onsale class must be present).
Transliteration
Automatically transliterate non-Latin product URLs and filenames.
Features:
{first_name}, {site_name}, etc.)Yes. All features are fully available without restrictions. If you find it useful and want to support further development, you can do so via the donation link.
Yes. Each module can be enabled or disabled independently.
Currently optimized for WooCommerce stores, but the architecture allows future expansion.
Yes. Imports use batch processing, logging, and safety checks.
Official Google Drive API documentation is available at: https://developers.google.com/drive/api/guides/enable-drive-api
Cron is required only for automated imports and scheduled discounts. Manual operations work without cron.
Yes. Role-based prices apply to both simple and variable products. Per-product manual overrides are also supported on the product edit screen.
Yes. You need an OpenAI API key. The module uses the embeddings endpoint - small per-product cost, charged only when the index is (re)built. Search queries themselves do not call OpenAI at runtime; matches are computed from the local vector index.
Both modules use the shared SMT Mailer. Email branding (logo, From, footer) is sourced from the Newsletter module when configured, otherwise from your site defaults. Sending is rate-limited per module.
Wishlist: guest lists are kept in a cookie and merge into the user account on login. Rewards: points are tied to the user account, so customers need to sign in to earn or redeem.
link attachment again so Facebook can scrape the product OG image instead of publishing a plain text URL.is_due() no longer treats token_refresh_checked as a "last refreshed" timestamp; a failing endpoint can no longer lock retries out for 45 days.wp priority 1 to template_redirect so is_cart()/is_checkout()/is_order_received_page()/is_account_page() are reliable; conversion tracking on checkout/thank-you pages is no longer accidentally stripped./threads creation and /threads_publish via wp_schedule_single_event to match Meta's recommended media-processing window./v2/ugcPosts to current /rest/posts endpoint with LinkedIn-Version header.preserve_token_meta() keeps refresh_token, token_refreshed and token_expires_at when an admin rotates the access token; only the status meta is reset so the next cron re-checks freshness.parse_url($uri, PHP_URL_PATH) before basename() so query strings can't trigger false positives.add_option lock prevents an ad-hoc trigger from racing the daily cron and double-writing the options blob.?smt_ig_debug=1 so a passing admin (with WP_DEBUG enabled) never sees diagnostic strings in the page source.mark_uncacheable() (defines DONOTCACHEPAGE / sends nocache_headers()) so a logged-in admin's "no-tracking" render is never served by page caches to logged-out visitors.script_loader_tag last-resort filter that strips known Google / Meta tracking handles even when another plugin re-registers them after our dequeue pass.smttool_social_instagram_refresh cron unschedule (the hook is no longer registered since Graph long-lived tokens are managed manually).q parameterHTTP_X_FORWARDED_FOR / CF-Connecting-IP headers are honoured only when REMOTE_ADDR is in the new TRUSTED_PROXIES whitelist; rate-limit is now atomic via wp_cache_incrjson_decode (memory-exhaustion DoS)libxml_disable_entity_loader(true) on PHP < 8.0, plus a 50-level depth guard in clean_node (XXE + stack DoS hardening)created_by queue check is now default-deny (only the original author or an administrator can resume a queue)is_purchasable() and is_in_stock()wp_delete_attachment() is now skipped when the same attachment is referenced by another product as a featured image or in a product galleryadd() uses atomic INSERT ... ON DUPLICATE KEY UPDATE to eliminate the lost-update racededuct() is capped by a low balance, the shortage is now persisted to order meta and subtracted from any re-completion credit (prevents double-credit on partial-refund edge sequences)order_id == product_id cannot suppress a legitimate bonuscart_loaded_from_session now call cart->set_session() so they survive the next requestrecompile_now() serialised via option lock; old-CSS retention raised from 2 to 5 files to absorb CDN cache lagwp_enqueue_scripts trigger in admin context wrapped in try/catch so misbehaving 3rd-party plugins can't break the responsebefore_calculate_totals_smttool_discount_sort clause filter now idempotent; will not duplicate JOINs when the filter fires multiple times in a querylist_drive_files, bounded static product caches, explicit 30s timeout on download_url, 50MB cap on CSV bodycalculate_totals() recalculationfilter_stock_status query string is cast to string before explode, preventing silent failures when sent as an arrayproduct_visibility, product_shipping_class) refused as archive context to prevent hidden-product enumerationprice_html injection routed through DOMPurify when available