{"id":306949,"date":"2026-05-12T11:25:32","date_gmt":"2026-05-12T11:25:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/orderkrab-for-woocommerce\/"},"modified":"2026-08-19T14:14:23","modified_gmt":"2026-08-19T14:14:23","slug":"orderkrab-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/pcm.wordpress.org\/plugins\/orderkrab-for-woocommerce\/","author":23409503,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.0","stable_tag":"1.5.0","tested":"6.9.7","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"OrderKrab for WooCommerce","header_author":"OrderKrab","header_description":"Thin integration between WooCommerce and OrderKrab for rates, fulfillment, and tracking sync.","assets_banners_color":"e4e4e4","last_updated":"2026-08-19 14:14:23","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/orderkrab.com","rating":0,"author_block_rating":0,"active_installs":10,"downloads":340,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.2":{"tag":"1.2.2","author":"orderkrab","date":"2026-05-12 11:26:15"},"1.2.3":{"tag":"1.2.3","author":"orderkrab","date":"2026-05-13 11:22:46"},"1.2.4":{"tag":"1.2.4","author":"orderkrab","date":"2026-05-13 11:32:53"},"1.2.6":{"tag":"1.2.6","author":"orderkrab","date":"2026-05-13 11:59:23"},"1.2.7":{"tag":"1.2.7","author":"orderkrab","date":"2026-07-13 14:39:32"},"1.5.0":{"tag":"1.5.0","author":"orderkrab","date":"2026-08-19 14:14:23"}},"upgrade_notice":{"1.2.4":"<p>Fixes a persistent &quot;Connect to OrderKrab&quot; failure that affected 1.2.2 and 1.2.3. Recommended for all users.<\/p>","1.2.3":"<p>Fixes a regression in 1.2.2 that caused &quot;Connect to OrderKrab&quot; to fail with &quot;WooCommerce REST helper unavailable&quot;. Recommended for all 1.2.2 users.<\/p>","1.2.2":"<p>Adds an uninstall handler that fully removes plugin data on deletion, plus a per-IP rate limit on the public locker-search endpoint and several escape-on-output security hardenings. No configuration changes required.<\/p>","1.2.1":"<p>WooCommerce is now declared as a required plugin via the <code>Requires Plugins<\/code> header; WordPress will block activation if WooCommerce is missing.<\/p>","1.2.0":"<p>First release on WordPress.org. Updates will be delivered through the WordPress plugin directory going forward; no separate updater is needed.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3529731,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3529731,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":501}},"assets_blueprints":{},"all_blocks":{"orderkrab\/return-portal":{"name":"orderkrab\/return-portal","title":"OrderKrab Return Portal"}},"tagged_versions":["1.2.2","1.2.3","1.2.4","1.2.6","1.2.7","1.5.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3529731,"resolution":"1","location":"assets","locale":"","width":1748,"height":1550},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3529731,"resolution":"2","location":"assets","locale":"","width":2900,"height":2480},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3529731,"resolution":"3","location":"assets","locale":"","width":1250,"height":1116},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3529731,"resolution":"4","location":"assets","locale":"","width":2320,"height":1282}},"screenshots":{"1":"The Connection tab \u2014 paste your OrderKrab access token and connect the store to the OrderKrab API.","2":"The Display tab \u2014 choose between the Native and Shopify-style shipping blocks and customize the styling. Includes a live preview.","3":"The Shopify-style shipping block at checkout \u2014 distance-based parcel locker options with carrier logos and selectable lockers.","4":"The Native shipping block at checkout \u2014 WooCommerce shipping methods with an inline parcel locker search field."}},"plugin_section":[],"plugin_tags":[13906,65950,262650,3546,286],"plugin_category":[45],"plugin_contributors":[262651],"plugin_business_model":[],"class_list":["post-306949","plugin","type-plugin","status-publish","hentry","plugin_tags-fulfillment","plugin_tags-order-sync","plugin_tags-parcel-locker","plugin_tags-shipping","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-orderkrab","plugin_committers-orderkrab"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/orderkrab-for-woocommerce\/assets\/icon-256x256.png?rev=3529731","icon_2x":"https:\/\/ps.w.org\/orderkrab-for-woocommerce\/assets\/icon-256x256.png?rev=3529731","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/orderkrab-for-woocommerce\/assets\/screenshot-1.png?rev=3529731","caption":"The Connection tab \u2014 paste your OrderKrab access token and connect the store to the OrderKrab API."},{"src":"https:\/\/ps.w.org\/orderkrab-for-woocommerce\/assets\/screenshot-2.png?rev=3529731","caption":"The Display tab \u2014 choose between the Native and Shopify-style shipping blocks and customize the styling. Includes a live preview."},{"src":"https:\/\/ps.w.org\/orderkrab-for-woocommerce\/assets\/screenshot-3.png?rev=3529731","caption":"The Shopify-style shipping block at checkout \u2014 distance-based parcel locker options with carrier logos and selectable lockers."},{"src":"https:\/\/ps.w.org\/orderkrab-for-woocommerce\/assets\/screenshot-4.png?rev=3529731","caption":"The Native shipping block at checkout \u2014 WooCommerce shipping methods with an inline parcel locker search field."}],"raw_content":"<!--section=description-->\n<p>OrderKrab for WooCommerce is a thin integration between WooCommerce and the OrderKrab fulfillment platform. It lets a WooCommerce store offer carrier-driven shipping rates and parcel locker selection at checkout, then keeps order state in sync with OrderKrab as the order moves through fulfillment.<\/p>\n\n<p><strong>What it does<\/strong><\/p>\n\n<ul>\n<li>Adds a shipping method that returns rates from the OrderKrab API, including parcel locker pricing per carrier.<\/li>\n<li>Renders a parcel locker search field at checkout (native or Shopify-style block).<\/li>\n<li>Syncs newly created and updated WooCommerce orders to OrderKrab.<\/li>\n<li>Provides an hourly batch reconciliation for any orders that didn't sync in real time.<\/li>\n<li>Receives webhooks from OrderKrab for order, product, and connection status updates.<\/li>\n<li>Embeds the hosted OrderKrab return portal on any page \u2014 via a Gutenberg block or the <code>[orderkrab_return_portal]<\/code> shortcode \u2014 so customers can register returns without leaving the store.<\/li>\n<li>Emails customers their return shipping label as a real WooCommerce email when a return is approved in OrderKrab, and records the return on the order.<\/li>\n<\/ul>\n\n<p><strong>Who it's for<\/strong><\/p>\n\n<p>Stores that already use (or plan to use) the OrderKrab fulfillment platform to manage shipping with carriers like DPD, LP Express, Omniva, InPost, FedEx, DHL, and others.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the OrderKrab API (<code>https:\/\/api.orderkrab.com<\/code>) \u2014 the configured base URL is shown in the plugin's Connection settings and can be overridden by store administrators.<\/p>\n\n<p><strong>What is sent and when:<\/strong><\/p>\n\n<ul>\n<li>When a customer reaches checkout, the plugin sends the shipping destination (country, postcode, city) and cart contents to OrderKrab to retrieve available shipping methods and prices.<\/li>\n<li>When a customer searches for a parcel locker, the plugin sends the search query plus destination country\/city to OrderKrab to retrieve matching locker locations.<\/li>\n<li>When an order is created or updated in WooCommerce, the plugin sends the order details (line items, shipping address, totals, selected shipping method) to OrderKrab so fulfillment can be coordinated.<\/li>\n<li>The plugin authenticates each request using an access token that the store administrator pastes into the plugin's Connection tab.<\/li>\n<li>When a visitor opens a page containing the return portal block or shortcode, their browser loads the hosted OrderKrab return portal (<code>https:\/\/returns.orderkrab.com<\/code>) in an iframe. The store's portal token, the display language, and any theme colors configured under OrderKrab \u2192 Returns are passed as URL parameters so the portal can identify the store and match its styling.<\/li>\n<\/ul>\n\n<p><strong>Why an external service is required:<\/strong> carrier rate calculation, parcel locker availability lookups, and label\/tracking generation depend on real-time data from carriers, which is aggregated by OrderKrab and cannot be performed locally by the plugin.<\/p>\n\n<p><strong>Provider links:<\/strong><\/p>\n\n<ul>\n<li>OrderKrab website: https:\/\/orderkrab.com<\/li>\n<li>Terms of Service: https:\/\/orderkrab.com\/terms<\/li>\n<li>Privacy Policy: https:\/\/orderkrab.com\/privacy<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin ZIP via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, or extract the folder into <code>wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Make sure WooCommerce is installed and active (the plugin requires it).<\/li>\n<li>Go to <strong>OrderKrab \u2192 Connection<\/strong> in the WordPress admin, paste your OrderKrab access token, and click <strong>Connect to OrderKrab<\/strong>.<\/li>\n<li>Configure shipping methods and display options under <strong>OrderKrab \u2192 Display<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20orderkrab%20account%3F\"><h3>Do I need an OrderKrab account?<\/h3><\/dt>\n<dd><p>Yes. The plugin is a client for the OrderKrab fulfillment service; you'll need an account and an access token to use it.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20without%20woocommerce%3F\"><h3>Does the plugin work without WooCommerce?<\/h3><\/dt>\n<dd><p>No. WooCommerce is a hard requirement; the plugin will not bootstrap if WooCommerce isn't active.<\/p><\/dd>\n<dt id=\"what%20wordpress%20and%20php%20versions%20are%20supported%3F\"><h3>What WordPress and PHP versions are supported?<\/h3><\/dt>\n<dd><p>WordPress 6.0 or higher and PHP 7.4 or higher.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20the%20return%20portal%20to%20my%20store%3F\"><h3>How do I add the return portal to my store?<\/h3><\/dt>\n<dd><p>Generate a portal token in OrderKrab admin \u2192 Returns \u2192 Settings, paste it under <strong>OrderKrab \u2192 Returns<\/strong> in WordPress, then add the \"OrderKrab Return Portal\" block (or the <code>[orderkrab_return_portal]<\/code> shortcode) to any page.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20help%3F\"><h3>Where can I get help?<\/h3><\/dt>\n<dd><p>Reach the OrderKrab team via https:\/\/orderkrab.com.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added inventory sync endpoints for OrderKrab warehouse customers. <code>GET \/wp-json\/orderkrab\/v1\/inventory\/levels<\/code> returns a paginated feed of products and variations with their stock fields (including <code>global_unique_id<\/code> on WooCommerce 9.2+), and <code>POST \/wp-json\/orderkrab\/v1\/inventory\/adjustments<\/code> applies batched relative stock adjustments atomically, with per-adjustment idempotency keys so a retried request can never move stock twice. Both endpoints use the same HMAC signature as the existing OrderKrab endpoints.<\/li>\n<li>Stock changes (including order-driven reductions) are now reported to OrderKrab as debounced, batched events via Action Scheduler. Delivery is best-effort by design: failures are retried once per cycle and anything missed is corrected by OrderKrab's nightly reconciliation. Can be disabled with the <code>orderkrab_wc_stock_events_enabled<\/code> filter.<\/li>\n<li>Added a small database table (<code>orderkrab_inventory_adjustments<\/code>) that records applied adjustment idempotency keys; it is created on update and removed on uninstall.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added a return portal embed, the WooCommerce counterpart of the OrderKrab Shopify return portal block. A new <strong>OrderKrab \u2192 Returns<\/strong> tab holds the portal token (generated in OrderKrab admin \u2192 Returns \u2192 Settings), max width, iframe height, default language (auto = match site language, WPML\/Polylang aware), and seven optional portal theme colors.<\/li>\n<li>The portal can be placed on any page with the \"OrderKrab Return Portal\" Gutenberg block or the <code>[orderkrab_return_portal]<\/code> shortcode; both share one renderer, and height, max width, and language can be overridden per placement (e.g. <code>[orderkrab_return_portal height=\"1100\" lang=\"lt\"]<\/code>).<\/li>\n<li>The embed reproduces the Shopify block's behavior: same iframe URL contract (<code>shop_jwt<\/code>, <code>lang<\/code>, color query parameters), forgiving URL handling (missing scheme, trailing slash), and a fit script that centers the iframe in the viewport at max width regardless of the theme's content column. Front-end assets load only on pages that actually render the portal.<\/li>\n<li>When no portal token is configured, the page shows a setup notice to store managers only \u2014 visitors see nothing.<\/li>\n<li>The OrderKrab admin menu now uses the OrderKrab logo mark as its icon instead of a generic dashicon (recolored automatically by WordPress to match the admin color scheme). The return portal block uses the same mark in the editor.<\/li>\n<li>The Return portal URL field is read-only by default, matching the API Base URL field's protection against accidental edits.<\/li>\n<li>Added a return-creation endpoint (<code>POST \/wp-json\/orderkrab\/v1\/orders\/{id}\/return<\/code>, HMAC-signed like the other OrderKrab endpoints). When a return is approved in OrderKrab, the plugin records it on the order (meta + order note) and emails the customer the return shipping label with a download button and tracking link.<\/li>\n<li>The label email is a real WooCommerce email \u2014 \"Return label (OrderKrab)\" under <strong>WooCommerce \u2192 Settings \u2192 Emails<\/strong> \u2014 so it uses the store's email branding and from-address, the subject\/heading\/additional content are editable, it can be disabled, and its templates can be overridden in the theme like any WooCommerce email.<\/li>\n<li>The return endpoint is idempotent per return request, so OrderKrab-side retries never email the customer the same label twice; if the email is disabled or fails, the order note says so and includes the label URL for manual handling, and OrderKrab admin shows the request as not customer-notified.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added a bulk order status endpoint (<code>POST \/wp-json\/orderkrab\/v1\/orders\/status\/batch<\/code>) so OrderKrab can update up to 50 orders per request instead of one request per order. Batches are processed within a time budget and any orders not reached are returned as <code>unprocessed<\/code> for the caller to re-send; item updates are idempotent, so re-sending is safe and produces no duplicate order notes.<\/li>\n<li>The bulk endpoint reports per-order results and leaves orders that are already cancelled, refunded, or trashed untouched (<code>skipped_final_status<\/code>).<\/li>\n<li>Outgoing requests to the OrderKrab API now include an <code>X-Orderkrab-Plugin-Version<\/code> header so the platform can detect per-store plugin capabilities.<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>The API Base URL field on the Connection tab is now read-only by default. The default production endpoint (https:\/\/api.orderkrab.com) is shown but cannot be edited through the normal UI, protecting store owners from accidentally pointing the plugin at a different host.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Added an orientation card and prominent \"Open OrderKrab admin\" button at the top of the Connection tab so store owners can reach the OrderKrab dashboard (admin.orderkrab.com) where fulfillment is actually managed.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Fixed: \"Connect to OrderKrab\" still failed in 1.2.3 because <code>wc_rest_generate_keys()<\/code> is not actually a public WooCommerce function in all installations. The plugin now falls back to inserting the WooCommerce REST API key row directly when WooCommerce's helper is unavailable, mirroring how WC's own admin UI generates keys internally.<\/li>\n<li>The fallback no longer introspects the WooCommerce API keys table with <code>SHOW COLUMNS<\/code> \u2014 it writes only the core columns and lets the database default any optional fields.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Fixed: \"WooCommerce REST helper unavailable\" error when clicking <strong>Connect to OrderKrab<\/strong>. The plugin now loads <code>wc-rest-functions.php<\/code> on demand via WooCommerce's own <code>WC()-&gt;plugin_path()<\/code> getter (or <code>WC_ABSPATH<\/code> as a fallback). WooCommerce only auto-includes this file during REST API requests, not on every admin request, so a manual <code>require_once<\/code> is needed before calling <code>wc_rest_generate_keys()<\/code> from an admin context.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Removed code that filtered another plugin's admin notices, per WordPress.org Guideline 11.<\/li>\n<li>Added an <code>uninstall.php<\/code> handler that removes the integration user, the WooCommerce REST API key row, and all plugin options when the plugin is deleted.<\/li>\n<li>Added a per-IP transient rate limit to the public <code>\/orderkrab\/v1\/shipping-points<\/code> REST endpoint to protect against abuse of the merchant's upstream API.<\/li>\n<li>Replaced inline <code>file_get_contents()<\/code> SVG output in the parcel locker search with <code>&lt;img&gt;<\/code> tags pointing at the bundled asset URLs, in line with WordPress's escape-on-output rule.<\/li>\n<li>Wrapper, style, and method-id attributes in the parcel locker search are now built and escaped at the point of output rather than passed through pre-baked attribute strings.<\/li>\n<li>Removed the manual WooCommerce REST API key fallback (and its <code>SHOW COLUMNS<\/code> introspection queries). With WooCommerce now declared as a hard dependency, <code>wc_rest_generate_keys()<\/code> is always available.<\/li>\n<li>Removed the diagnostic <code>error_log()<\/code> call that ran when WooCommerce REST helpers were unavailable.<\/li>\n<li>Excluded screenshots from the production ZIP; they live in the WordPress.org <code>\/assets\/<\/code> SVN folder instead.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Declared WooCommerce as a formal plugin dependency via the <code>Requires Plugins<\/code> header.<\/li>\n<li>Removed an unreliable hardcoded fallback to <code>WP_PLUGIN_DIR . 'woocommerce\/'<\/code> when locating WooCommerce REST helper files; the plugin now relies on WooCommerce's own getters and <code>WC_ABSPATH<\/code> constant.<\/li>\n<li>Renamed the main plugin file to match the plugin slug (<code>orderkrab-for-woocommerce.php<\/code>).<\/li>\n<li>Excluded the development-only <code>wp-stubs.php<\/code> shim from the published build.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Activated the batch order sync (hourly reconciliation of pending\/on-hold\/processing orders).<\/li>\n<li>Refactored admin assets to use <code>wp_enqueue_style<\/code> \/ <code>wp_enqueue_script<\/code> \/ <code>wp_add_inline_style<\/code> \/ <code>wp_localize_script<\/code> instead of inline <code>&lt;style&gt;<\/code> and <code>&lt;script&gt;<\/code> blocks.<\/li>\n<li>Fixed: API access tokens are now preserved verbatim instead of being passed through <code>sanitize_text_field()<\/code>, which could silently corrupt valid tokens.<\/li>\n<li>Modernized <code>register_setting()<\/code> registration with explicit <code>type<\/code> and <code>sanitize_callback<\/code> keys.<\/li>\n<li>Removed the call to <code>load_plugin_textdomain()<\/code>. WordPress automatically loads translations for plugins hosted in the directory since WordPress 4.6.<\/li>\n<li>Added <code>defined( 'ABSPATH' )<\/code> guard to template files that execute code on inclusion.<\/li>\n<li>Removed the self-hosted plugin updater. Updates are now delivered through the WordPress.org plugin directory.<\/li>\n<li>Removed the <code>test-weight-logic.php<\/code> development test harness from the published plugin.<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li>Previous internally distributed release.<\/li>\n<\/ul>","raw_excerpt":"Connect WooCommerce to the OrderKrab fulfillment platform: dynamic shipping rates, parcel locker selection, and two-way order sync.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/306949","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=306949"}],"author":[{"embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/orderkrab"}],"wp:attachment":[{"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=306949"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=306949"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=306949"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=306949"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=306949"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcm.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=306949"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}