{"id":257891,"date":"2025-11-04T02:34:48","date_gmt":"2025-11-04T02:34:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/jemdy-product-builder\/"},"modified":"2025-12-02T03:13:39","modified_gmt":"2025-12-02T03:13:39","slug":"jemdy-product-builder","status":"publish","type":"plugin","link":"https:\/\/test.wordpress.org\/plugins\/jemdy-product-builder\/","author":23153589,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"2.0.0","stable_tag":"trunk","tested":"6.8.5","requires":"6.1","requires_php":"7.4","requires_plugins":null,"header_name":"Jemdy Product Builder","header_author":"JemdyCommerce","header_description":"Custom product builder for Woocommerce.","assets_banners_color":"debcf5","last_updated":"2025-12-02 03:13:39","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/jemdycommerce.com\/","header_plugin_uri":"","header_author_uri":"https:\/\/jemdycommerce.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":225,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"jemdycommerce","date":"2025-11-04 02:35:07"},"1.1.0":{"tag":"1.1.0","author":"jemdycommerce","date":"2025-11-06 05:40:30"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3389287,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3389287,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3389287,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3389287,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2","1.1.0"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[148874,66523,39420,80,286],"plugin_category":[43,45],"plugin_contributors":[250218],"plugin_business_model":[],"class_list":["post-257891","plugin","type-plugin","status-publish","hentry","plugin_tags-attributes-filter","plugin_tags-product-builder","plugin_tags-product-configurator","plugin_tags-shortcode","plugin_tags-woocommerce","plugin_category-customization","plugin_category-ecommerce","plugin_contributors-jemdycommerce","plugin_committers-jemdycommerce"],"banners":{"banner":"https:\/\/ps.w.org\/jemdy-product-builder\/assets\/banner-772x250.png?rev=3389287","banner_2x":"https:\/\/ps.w.org\/jemdy-product-builder\/assets\/banner-1544x500.png?rev=3389287","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/jemdy-product-builder\/assets\/icon-128x128.gif?rev=3389287","icon_2x":"https:\/\/ps.w.org\/jemdy-product-builder\/assets\/icon-256x256.gif?rev=3389287","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Create a seamless WooCommerce Product Builder \/ Configurator that lets customers pick items (including variable products) with real-time filtering by attributes, price, stock, and on-sale status. Optimized UI for mobile with Drawer patterns, smooth scrolling, and performance-minded REST API.<\/p>\n\n<p>Works with both global attributes (pa_*) and custom product attributes defined per product.<\/p>\n\n<p>\u26a1 Key Features<\/p>\n\n<p>Shortcode: Drop the builder anywhere \u2013 [jemdy-builder-form].<\/p>\n\n<p>Variable products: Pick variations by attributes; price\/thumbnail update instantly.<\/p>\n\n<p>Advanced filters: Attributes (global + custom), price range, in-stock, on-sale, keyword search, sorting (newest \/ price asc \/ price desc).<\/p>\n\n<p>Mobile-ready: Drawer UI, body-scroll lock, smooth \u201cscroll to top\u201d when switching categories.<\/p>\n\n<p>Performance: Custom REST endpoint, server-side pagination, transient caching for filter facets, Vite + React build.<\/p>\n\n<p>Localization: Translation-ready (text domain: jemdy-product-builder, languages\/ folder). Safe HTML in help texts is sanitized.<\/p>\n\n<p>Extensible: Filters\/Hooks allow modifying product payloads before sending to the frontend.<\/p>\n\n<p>\ud83d\ude4c Admin Experience<\/p>\n\n<p>Configure which categories appear in the builder and set the display labels.<\/p>\n\n<p>Helpful Help tab with usage guide and shortcode\/template tag.<\/p>\n\n<p>Production\/Development build modes for smooth local development.<\/p>\n\n<p>\ud83c\udf52 Typical Use Cases<\/p>\n\n<p>PC parts configurator (CPU, RAM, etc.)<\/p>\n\n<p>Bundles with variable products (size\/color)<\/p>\n\n<p>Curated category pickers with price\/stock filters<\/p>\n\n<p>\u2705 Compatibility<\/p>\n\n<p>Compatible with modern WooCommerce themes.<\/p>\n\n<p>Works with standard WooCommerce product\/variation data and attribute taxonomies.<\/p>\n\n<p>Enjoy the plugin? A quick rating keeps development going \u2764\ufe0f<\/p>\n\n<!--section=installation-->\n<p>Manual installation:<\/p>\n\n<p>Upload the jemdy-product-builder folder to \/wp-content\/plugins\/.<\/p>\n\n<p>Activate the plugin via Plugins \u2192 Installed Plugins.<\/p>\n\n<p>In the WordPress admin, open Jemdy Builder to configure categories and labels.<\/p>\n\n<p>Add the shortcode to a page\/post: [jemdy-builder-form]<\/p>\n\n<p>That\u2019s it \u2014 your product builder is ready.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id='do%20i%20need%20woocommerce%3F'><h3>Do I need WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. This plugin extends WooCommerce and requires it to be active.<\/p><\/dd>\n<dt id='how%20do%20i%20output%20the%20builder%3F'><h3>How do I output the builder?<\/h3><\/dt>\n<dd><p>Use the shortcode [jemdy-builder-form] in any page or post.\nFor theme files, you can use: echo do_shortcode('[jemdy-builder-form]');<\/p><\/dd>\n<dt id='does%20it%20support%20variable%20products%3F'><h3>Does it support variable products?<\/h3><\/dt>\n<dd><p>Yes. Customers can select variations by attributes (supports both global pa_* and custom attributes added directly on the product edit screen).<\/p><\/dd>\n<dt id='why%20don%E2%80%99t%20i%20see%20any%20products%3F'><h3>Why don\u2019t I see any products?<\/h3><\/dt>\n<dd><p>Check that:<\/p>\n\n<p>The selected categories contain published products with prices.<\/p>\n\n<p>Filters (in-stock \/ on-sale \/ attributes) are not overly strict.<\/p>\n\n<p>You switched categories \u2014 filters reset to default for clarity.<\/p><\/dd>\n<dt id='is%20it%20translation-ready%3F'><h3>Is it translation-ready?<\/h3><\/dt>\n<dd><p>Yes. Text domain is jemdy-product-builder. Place translations in the languages\/ directory. The plugin also localizes UI strings to the React app.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>NEW: Implemented native Tailwind CSS v4 architecture (CSS-first config) for better performance.<\/li>\n<li>FIX: Solved persistent CSS specificity conflicts in WP Admin by applying \"Selector Strategy\" (<code>#jdpb-apps<\/code> scoping) and removing conflicting WP form styles via PHP hook on the plugin page.<\/li>\n<li>TWEAK: Updated <code>tailwind-merge<\/code> configuration to correctly handle custom color conflicts (e.g., <code>text-foreground<\/code> vs <code>text-primary-foreground<\/code>).<\/li>\n<li>DEV: Converted all utility class usages from <code>jw-utility<\/code> to <code>jw:utility<\/code> namespace structure.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<p>Build: Refactored packaging script \u2014 exclude all .ts\/.tsx sources, include only compiled dist assets.<\/p>\n\n<p>Build: Removed PostCSS and Tailwind v3 config files from release (migrated to CSS-first Tailwind 4 pipeline with prefix jw-).<\/p>\n\n<p>Improved: Added full color token system synced between PHP + Tailwind config:\n- background \/ foreground\n- primary \/ primary-foreground\n- secondary \/ secondary-foreground\n- accent \/ accent-foreground\n- muted \/ muted-foreground\n- destructive \/ destructive-foreground\n- popover \/ popover-foreground\n- border \/ input \/ ring<\/p>\n\n<p>Improved: Refined UI variants for Button (default, outline, secondary, ghost, link, destructive).<\/p>\n\n<p>Security: Updated build exclusion rules to avoid leaking source maps or internal tools in final zip.<\/p>\n\n<p>Docs: Added migration plan to Tailwind v4 (on hold) and internal documentation on token architecture.<\/p>\n\n<p>Internal: Adopted consistent jw- prefix for all Tailwind utilities (previous jd- prefix deprecated).<\/p>\n\n<h4>1.0.2<\/h4>\n\n<p>Improved: Switched to proper script\/style enqueues (wp_enqueue_scripts, admin_enqueue_scripts) with script_loader_tag to add type=\"module\" (and crossorigin in dev). Removed direct \/ outputs.<\/p>\n\n<p>Improved: Admin page now renders a clean app root without inline CSS\/JS; notices remain intact per WP guidelines.<\/p>\n\n<p>Security: Added\/updated permission_callback on REST routes \u2014 public reads keep __return_true; settings write endpoints require manage_options.<\/p>\n\n<p>Security: Replaced raw SQL with $wpdb-&gt;prepare() (including dynamic IN (...) placeholders). Removed long anonymous closures per coding standards.<\/p>\n\n<p>Security: Hardened sanitization\/escaping across payload parsing and query args.<\/p>\n\n<p>Performance: Introduced object caching (wp_cache_*) for attribute labels, global term aggregations, and _product_attributes meta scans; cache keys auto-bust with last_changed.<\/p>\n\n<p>Performance: Prefilter by taxonomy only when all selected attributes are global (pa_*), reducing unnecessary scans.<\/p>\n\n<p>Refactor: Modular architecture \u2014 added Services (ProductService), Repositories (ProductRepository), Support (Attributes, Pagination), Domain (DTO Payload, Builders, Filters). Easier maintenance and extension.<\/p>\n\n<p>Feature: Filter logic revised \u2014 custom (per-product) attributes now match correctly alongside global attributes. Empty attribute groups are omitted from payload.<\/p>\n\n<p>Fix: Pagination rendering logic corrected near edges (e.g., pages 1\u20133 and n\u20132\u2026n).<\/p>\n\n<p>Fix: ScrollArea\/key handling updated for React 18; mobile drawer + filter UX tweaks.<\/p>\n\n<p>Docs: readme.txt updated \u2014 max 5 tags, short description trimmed to \u2264150 chars.<\/p>\n\n<p>Build: Packaging script updated to build app, toggle dev flag, and zip with proper exclusions.<\/p>\n\n<h4>1.0.1<\/h4>\n\n<p>First public release of Jemdy Product Builder<\/p>\n\n<p>Product builder shortcode [jemdy-builder-form]<\/p>\n\n<p>Variable product support with attribute selection<\/p>\n\n<p>Advanced filters: attributes (global + custom), price, in-stock, on-sale, search, sorting<\/p>\n\n<p>Mobile Drawer UX, scroll optimizations<\/p>\n\n<p>REST API with pagination and transient caching for filter facets<\/p>\n\n<p>Translation-ready (text domain jemdy-product-builder)<\/p>\n\n<p>Hooks to customize product payloads before response<\/p>\n\n<h4>1.0.0<\/h4>\n\n<p>Initial internal build and foundation (enqueue from Vite manifest, module preload, CSS auto-enqueue, i18n plumbing)<\/p>","raw_excerpt":"Create a modern WooCommerce product builder with attribute\/price filters and variation support. Shortcode: [jemdy-builder-form].","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/257891","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=257891"}],"author":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jemdycommerce"}],"wp:attachment":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=257891"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=257891"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=257891"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=257891"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=257891"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=257891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}