{"id":393274,"date":"2026-10-27T06:55:00","date_gmt":"2026-10-27T06:55:00","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/joinery-core\/"},"modified":"2026-10-27T20:05:02","modified_gmt":"2026-10-27T20:05:02","slug":"joinery-core","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/joinery-core\/","author":23593695,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.0","stable_tag":"0.4.0","tested":"7.1.4","requires":"6.5","requires_php":"8.1","requires_plugins":null,"header_name":"Joinery Core","header_author":"Joinery","header_description":"The shared core for Joinery plugins: one rules engine, one pricing pipeline and one customer wallet. Includes free discount rules.","assets_banners_color":"a4a684","last_updated":"2026-10-27 20:05:02","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/www.joinerywp.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":85,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.0":{"tag":"0.3.0","author":"joinery","date":"2026-10-27 19:16:54","revision":3769298},"0.4.0":{"tag":"0.4.0","author":"joinery","date":"2026-10-27 20:05:02","revision":3769397}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3767875,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3767875,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3767875,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3767875,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3769397,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"title\":\"Joinery Core\",\"description\":\"WooCommerce with Joinery Core, a few hardware products and four discount rules.\",\"author\":\"joinery\"},\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=joinery\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"steps\":[{\"step\":\"login\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"woocommerce\"},\"options\":{\"activate\":true}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"joinery-core\"},\"options\":{\"activate\":true}},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Joinery demo shop\",\"woocommerce_coming_soon\":\"no\",\"woocommerce_currency\":\"USD\",\"woocommerce_default_country\":\"US:CA\",\"woocommerce_onboarding_profile\":{\"skipped\":true},\"woocommerce_task_list_hidden\":\"yes\",\"woocommerce_show_marketplace_suggestions\":\"no\"}},{\"step\":\"runPHP\",\"code\":\"<?php require_once '\\\/wordpress\\\/wp-load.php';\\n\\\/\\\/ Open on Joinery \\u2192 Rules, not WooCommerce's welcome screen.\\ndelete_transient( '_wc_activation_redirect' );\\n$term = term_exists( 'Hardware', 'product_cat' );\\n$category = $term ? (int) $term['term_id'] : (int) wp_insert_term( 'Hardware', 'product_cat' )['term_id'];\\nforeach ( array( array( 'Oak shelf bracket', '12' ), array( 'Oak shelf, 80 cm', '35' ), array( 'Wall plugs and screws', '4' ) ) as $item ) {\\n\\t$product = new WC_Product_Simple();\\n\\t$product->set_name( $item[0] );\\n\\t$product->set_regular_price( $item[1] );\\n\\t$product->set_status( 'publish' );\\n\\t$product->set_category_ids( array( $category ) );\\n\\t$product->save();\\n}\\n$repo = Joinery\\\\Core\\\\Plugin::instance()->rules();\\n$rule = function ( $name, $active, $priority, $exclusive, $condition, $settings, $action, $percent ) use ( $repo ) {\\n\\t$repo->save( Joinery\\\\Core\\\\Rules\\\\Rule::from_array( array( 'name' => $name, 'active' => $active, 'priority' => $priority, 'exclusive' => $exclusive, 'conditions' => array( array( 'type' => $condition, 'settings' => $settings ) ), 'actions' => array( array( 'type' => $action, 'settings' => array( 'percent' => $percent ) ) ) ) ) );\\n};\\n$rule( '10% off hardware', true, 10, false, 'product_category', array( 'categories' => array( $category ) ), 'percentage_off', 10 );\\n$rule( '5% off orders over $100', true, 20, false, 'cart_subtotal', array( 'min' => 100 ), 'cart_percentage_off', 5 );\\n$rule( 'Shop managers: 20% off', true, 30, true, 'customer_role', array( 'roles' => array( 'shop_manager' ) ), 'percentage_off', 20 );\\n$rule( 'Black Friday weekend', false, 40, false, 'date_range', array( 'from' => '2026-11-27T00:00', 'to' => '2026-11-30T23:59' ), 'cart_percentage_off', 15 );\\n\"}]}"}},"all_blocks":[],"tagged_versions":["0.3.0","0.4.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3769397,"resolution":"1","location":"assets","locale":"","width":2220,"height":1780},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3769397,"resolution":"2","location":"assets","locale":"","width":1506,"height":1212},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3769397,"resolution":"3","location":"assets","locale":"","width":1506,"height":1212},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3769397,"resolution":"4","location":"assets","locale":"","width":2456,"height":1046}},"screenshots":{"1":"Joinery \u2192 Rules: every rule in one list, with the selected rule open beside it.","2":"A cart rule: 5% off the whole order once the cart subtotal reaches $100.","3":"A date condition limits a rule to a sale weekend. Rules can be saved switched off until you need them.","4":"The block cart with both rules applied: 10% off each hardware item, then 5% off the order."}},"plugin_section":[],"plugin_tags":[65401,197693,15963,139401,286],"plugin_category":[45],"plugin_contributors":[288874],"plugin_business_model":[],"class_list":["post-393274","plugin","type-plugin","status-publish","hentry","plugin_tags-cart-discount","plugin_tags-discount-rules","plugin_tags-dynamic-pricing","plugin_tags-role-based-pricing","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-joinery","plugin_committers-joinery"],"banners":{"banner":"https:\/\/ps.w.org\/joinery-core\/assets\/banner-772x250.png?rev=3767875","banner_2x":"https:\/\/ps.w.org\/joinery-core\/assets\/banner-1544x500.png?rev=3767875","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/joinery-core\/assets\/icon-128x128.png?rev=3767875","icon_2x":"https:\/\/ps.w.org\/joinery-core\/assets\/icon-256x256.png?rev=3767875","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/joinery-core\/assets\/screenshot-1.png?rev=3769397","caption":"Joinery \u2192 Rules: every rule in one list, with the selected rule open beside it."},{"src":"https:\/\/ps.w.org\/joinery-core\/assets\/screenshot-2.png?rev=3769397","caption":"A cart rule: 5% off the whole order once the cart subtotal reaches $100."},{"src":"https:\/\/ps.w.org\/joinery-core\/assets\/screenshot-3.png?rev=3769397","caption":"A date condition limits a rule to a sale weekend. Rules can be saved switched off until you need them."},{"src":"https:\/\/ps.w.org\/joinery-core\/assets\/screenshot-4.png?rev=3769397","caption":"The block cart with both rules applied: 10% off each hardware item, then 5% off the order."}],"raw_content":"<!--section=description-->\n<p>Joinery Core gives your store a simple rule builder: choose when a rule applies (customer role, cart quantity, cart subtotal, product category, dates) and what it does (percentage off items or off the cart).<\/p>\n\n<p>It is also the foundation for the paid Joinery plugins. They all use the same rules engine, pricing pipeline and customer wallet, so they work together without conflicts.<\/p>\n\n<h4>Works without code, and headless<\/h4>\n\n<p>Rules run on the server inside WooCommerce, so prices are right in the classic and block cart and checkout, and in the Store API for headless stores. Developers get a price-preview REST endpoint and can add their own conditions and actions with two PHP functions.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>Joinery Core doesn't contact any external service and doesn't track you or your customers. Pricing rules run on your own server. If you use store credit (added by paid Joinery plugins), each credit and use of credit is stored in your database and works with WordPress's personal data export and erasure tools.<\/p>\n\n<h4>Source code<\/h4>\n\n<p>The admin screen's JavaScript in <code>build\/<\/code> is compiled. Its readable source ships with the plugin in <code>assets\/<\/code> (including the shared packages in <code>assets\/packages\/<\/code>). To rebuild it, run <code>npm install<\/code> and <code>npm run build<\/code> in the plugin folder; it uses @wordpress\/scripts.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce.<\/li>\n<li>Install and activate Joinery Core.<\/li>\n<li>Go to Joinery \u2192 Rules and add your first rule.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20with%20the%20block%20cart%20and%20checkout%3F\"><h3>Does it work with the block cart and checkout?<\/h3><\/dt>\n<dd><p>Yes. Rules apply wherever WooCommerce calculates the cart: classic and block cart, checkout, and the Store API.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20paid%20plugin%3F\"><h3>Do I need a paid plugin?<\/h3><\/dt>\n<dd><p>No. Joinery Core works on its own. Paid Joinery plugins add more rule types, such as tiered pricing, wholesale accounts and gift cards, to the same rules screen. A small \u201cMore rule types\u201d panel there lists the ones you don\u2019t have; you can hide it.<\/p><\/dd>\n<dt id=\"does%20it%20slow%20down%20my%20store%3F\"><h3>Does it slow down my store?<\/h3><\/dt>\n<dd><p>Active rules are loaded with one database query per request, and each price is worked out in a single pass through them.<\/p><\/dd>\n<dt id=\"can%20developers%20extend%20it%3F\"><h3>Can developers extend it?<\/h3><\/dt>\n<dd><p>Yes. Register conditions and actions on the <code>joinery_core_init<\/code> hook. See the developer documentation.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>New: A small \u201cMore rule types\u201d panel on Joinery \u2192 Rules lists the paid Joinery plugins that add rule types. It only shows plugins you don\u2019t have, and you can hide it.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>New: Rules can tell whether the customer has ordered before, for first-order offers.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>New: Event actions, rules that run once an order is paid or completed.<\/li>\n<li>New: Store credit spends the credit that expires soonest first.<\/li>\n<li>Fix: Lines kept out of pricing no longer count toward cart conditions and discounts.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First development version.<\/li>\n<\/ul>","raw_excerpt":"Discount rules for WooCommerce, and the shared core that lets Joinery plugins work together.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=393274"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/joinery"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393274"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393274"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393274"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393274"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393274"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}