{"id":53,"date":"2026-10-05T20:09:13","date_gmt":"2026-10-06T00:09:13","guid":{"rendered":"https:\/\/demo.doctorx.ca\/shop\/for-developers\/"},"modified":"2026-10-05T20:09:13","modified_gmt":"2026-10-06T00:09:13","slug":"for-developers","status":"publish","type":"page","link":"https:\/\/demo.doctorx.ca\/shop\/for-developers\/","title":{"rendered":"For developers"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">What developers can build on: hooks, shortcodes, blocks, REST routes and WP-CLI commands, taken from each plugin&#8217;s own readme and from what this site has registered.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">DoctorX Made-to-Measure Checkout<\/h2>\n\n\n\n<ul class=\"drx-dev-facts\"><li><strong>Shortcodes:<\/strong> <code>&#91;drx_mtm_account&#93;<\/code>, <code>&#91;drx_mtm_picker&#93;<\/code>, <code>&#91;drx_mtm_checkout&#93;<\/code>, <code>&#91;drx_mtm_order&#93;<\/code>, <code>&#91;drx_mtm_price_table&#93;<\/code><\/li><li><strong>Blocks:<\/strong> <code>doctorx-commerce\/picker<\/code><\/li><li><strong>REST routes:<\/strong> <code>\/doctorx-commerce\/v1<\/code>, <code>\/doctorx-commerce\/v1\/cart<\/code>, <code>\/doctorx-commerce\/v1\/cart\/add<\/code>, <code>\/doctorx-commerce\/v1\/cart\/line<\/code>, <code>\/doctorx-commerce\/v1\/cart\/clear<\/code>, <code>\/doctorx-commerce\/v1\/cart\/code<\/code>, <code>\/doctorx-commerce\/v1\/quote<\/code>, <code>\/doctorx-commerce\/v1\/order<\/code>, <code>\/doctorx-commerce\/v1\/paypal\/create<\/code>, <code>\/doctorx-commerce\/v1\/paypal\/capture<\/code>, <code>\/doctorx-commerce\/v1\/paypal\/webhook<\/code><\/li><\/ul>\n\n\n\n<p>Every function below is defined only when no other plugin defines it: check <code>function_exists()<\/code> first, because this plugin may be switched off. <code>DOCTORX_COMMERCE_VERSION<\/code> holds the version. Money is in cents (integers) unless stated; sizes are in base units (eighths of an inch for inch products, millimetres for centimetre products); dates are UTC.<\/p>\n<h3>Orders<\/h3>\n<ul>\n<li><code>doctorx_commerce_get_order( $id_or_reference )<\/code> returns an order or null: <code>id<\/code>, <code>reference<\/code>, <code>status<\/code>, <code>status_label<\/code>, <code>created_at<\/code>, <code>paid_at<\/code> (ISO 8601, UTC), <code>customer<\/code> (<code>user_id<\/code>, <code>name<\/code>, <code>email<\/code>, <code>phone<\/code>, <code>address_1<\/code>, <code>address_2<\/code>, <code>city<\/code>, <code>province<\/code>, <code>postal<\/code>, <code>country<\/code>), <code>fulfilment<\/code> (<code>ship<\/code> or <code>pickup<\/code>), <code>tax_province<\/code>, <code>currency<\/code>, <code>subtotal_cents<\/code> (before the discount), <code>shipping_cents<\/code>, <code>fee_cents<\/code>, <code>discount_code<\/code>, <code>discount_cents<\/code>, <code>tax_cents<\/code>, <code>taxes<\/code> (<code>label<\/code>, <code>type<\/code>, <code>rate<\/code> in thousandths of a percent, <code>cents<\/code>), <code>total_cents<\/code>, <code>paid_cents<\/code>, <code>refunded_cents<\/code>, <code>payment_method<\/code>, <code>items<\/code> (<code>product_id<\/code>, <code>title<\/code>, <code>sku<\/code>, <code>size_text<\/code>, <code>area_text<\/code>, <code>width<\/code>, <code>height<\/code>, <code>unit<\/code>, <code>material_id<\/code>, <code>material_name<\/code>, <code>options<\/code>, <code>label<\/code>, <code>qty<\/code>, <code>each_cents<\/code>, <code>line_cents<\/code>, <code>discount_cents<\/code> (the line&#039;s share of the discount)), <code>meta<\/code>, <code>view_url<\/code> (the customer&#039;s private link), <code>admin_url<\/code>.<\/li>\n<li><code>doctorx_commerce_get_orders( array $args )<\/code>: <code>status<\/code> (a status or a list), <code>email<\/code>, <code>user_id<\/code>, <code>search<\/code>, <code>since<\/code>, <code>until<\/code> (UTC &quot;Y-m-d H:i:s&quot;), <code>limit<\/code> (default 50, at most 500), <code>offset<\/code>. Newest first.<\/li>\n<li><code>doctorx_commerce_get_customer_orders( $user_id_or_email, array $args )<\/code>.<\/li>\n<li><code>doctorx_commerce_order_statuses()<\/code>: <code>pending<\/code> (Awaiting payment), <code>review<\/code> (Payment needs review), <code>paid<\/code>, <code>in_production<\/code>, <code>shipped<\/code>, <code>ready<\/code> (Ready for pickup), <code>delivered<\/code>, <code>cancelled<\/code>, <code>refunded<\/code>.<\/li>\n<li><code>doctorx_commerce_set_order_status( $order_id, $status, $note )<\/code>: moves an order the way the order screen would; <code>paid<\/code> and <code>refunded<\/code> come only from a payment or a refund.<\/li>\n<li><code>doctorx_commerce_get_order_meta( $order_id, $key )<\/code> and <code>doctorx_commerce_update_order_meta( $order_id, $key, $value )<\/code> (null removes it): small values of your own on an order.<\/li>\n<li><code>doctorx_commerce_order_url( $order_id )<\/code>: the customer&#039;s private link.<\/li>\n<\/ul>\n<h3>Products, prices and the cart<\/h3>\n<ul>\n<li><code>doctorx_commerce_get_products( array( &#039;status&#039; =&gt; &#039;publish&#039; ) )<\/code> returns one array per product that has a price. Always: <code>id<\/code>, <code>price<\/code> (float, dollars: the &quot;From&quot; price the product page and its structured data show, for one item at the example size with the cheapest material and required options, before tax; send this to shopping feeds so the feed matches the page), <code>price_from<\/code> (the lowest price at the smallest size), <code>currency<\/code>, <code>in_stock<\/code> (true while the store is open and the product is published; filter <code>doctorx_commerce_product_in_stock<\/code>). Also <code>price_cents<\/code>, <code>sku<\/code>, <code>title<\/code>, <code>description<\/code>, <code>url<\/code>, <code>image_url<\/code>, <code>gallery<\/code> (image URLs), <code>categories<\/code> (names), <code>brand<\/code> (the business name), <code>mpn<\/code> (the SKU) and <code>material<\/code> (names joined with &quot;\/&quot;). Arguments: <code>status<\/code> (a status or a list), <code>ids<\/code>, <code>limit<\/code>. <code>doctorx_commerce_get_product( $id )<\/code> returns one.<\/li>\n<li><code>doctorx_commerce_get_product_config( $product_id )<\/code>, without prices: <code>mode<\/code> (<code>area<\/code> or <code>fixed<\/code>), <code>unit<\/code> (<code>in<\/code> or <code>cm<\/code>), <code>min_w<\/code>, <code>max_w<\/code>, <code>min_h<\/code>, <code>max_h<\/code>, <code>example_w<\/code>, <code>example_h<\/code> (base units), <code>max_qty<\/code>, <code>label_field<\/code>, <code>materials<\/code> (swatch id =&gt; name), <code>groups<\/code> (each <code>id<\/code>, <code>label<\/code>, <code>required<\/code>, <code>show_if<\/code> (array( group, choice ) or null), <code>choices<\/code> (id =&gt; label)).<\/li>\n<li><code>doctorx_commerce_quote( $product_id, array $config )<\/code>: the server&#039;s price for <code>width<\/code>, <code>height<\/code>, <code>material<\/code>, <code>options<\/code> (group =&gt; choice), <code>qty<\/code>; returns <code>each_cents<\/code>, <code>line_cents<\/code> and the description, or a WP_Error with a message per field.<\/li>\n<li><code>doctorx_commerce_cart_add( array $item )<\/code> (<code>product<\/code>, <code>width<\/code>, <code>height<\/code>, <code>material<\/code>, <code>options<\/code>, <code>qty<\/code>, <code>label<\/code>) returns true or a WP_Error; <code>doctorx_commerce_cart_clear()<\/code>; <code>doctorx_commerce_cart_url()<\/code> (the checkout page); <code>doctorx_commerce_account_url()<\/code>.<\/li>\n<li><code>doctorx_commerce_money( $cents )<\/code>: a price in the store&#039;s currency, as the shop prints it.<\/li>\n<li><code>doctorx_commerce_cart_totals( array( &#039;province&#039; =&gt; &#039;ON&#039;, &#039;fulfilment&#039; =&gt; &#039;ship&#039; ) )<\/code>: the current visitor&#039;s cart priced as the checkout shows it (the REST <code>GET cart<\/code> figures: <code>subtotal_cents<\/code>, <code>discount_cents<\/code>, <code>shipping_cents<\/code>, <code>tax_cents<\/code>, <code>total_cents<\/code>, lines).<\/li>\n<li><code>doctorx_commerce_store_is_public()<\/code>: true when the store is open to the public. While it is open to staff only (or off), this plugin&#039;s Checkout, Order status and My account pages are private; a plugin that makes its own shop pages can keep them private too and publish them on <code>doctorx_commerce_store_opened<\/code>.<\/li>\n<li><code>doctorx_commerce_payment_methods( $ready_only = true )<\/code>: id =&gt; label of the ways to pay the current visitor is offered (<code>etransfer<\/code>, <code>bank<\/code>, <code>cheque<\/code>, <code>delivery<\/code>, <code>paypal<\/code>, and <code>account<\/code> when a plugin offers it), or every method the store knows with false. Every method except <code>paypal<\/code> is offline: the shop marks the order paid by hand.<\/li>\n<\/ul>\n<h3>Payment on account<\/h3>\n<p>The <code>account<\/code> method (&quot;On account (invoice)&quot;) is never offered to ordinary shoppers. Offer it to a customer by adding it in the <code>doctorx_commerce_payment_methods<\/code> filter, for example for approved trade customers:<\/p>\n<pre class=\"wp-block-code\"><code>add_filter( &#039;doctorx_commerce_payment_methods&#039;, function ( $methods, $ready_only ) {\n    if ( $ready_only &amp;&amp; my_customer_may_pay_on_account( get_current_user_id() ) ) {\n        $methods&#91;&#039;account&#039;&#93; = true; \/\/ or array( &#039;label&#039; =&gt; ..., &#039;note&#039; =&gt; ... )\n    }\n    return $methods;\n}, 10, 2 );<\/code><\/pre>\n<p>Such an order is placed as &quot;Awaiting payment&quot; with its order number as the invoice reference, and the shop marks it paid on the order screen, like an e-Transfer.<\/p>\n<h3>Actions<\/h3>\n<ul>\n<li><code>doctorx_commerce_order_placed<\/code> ( $order_id, $order ): an order was placed (not yet paid).<\/li>\n<li><code>doctorx_commerce_order_paid<\/code> ( $order_id, $order ): paid in full (a verified PayPal capture, or an offline payment marked received). Fires once per order.<\/li>\n<li><code>doctorx_commerce_order_status_changed<\/code> ( $order_id, $status, $old_status, $order, $note ).<\/li>\n<li><code>doctorx_commerce_order_delivered<\/code> ( $order_id, $order ): delivered or collected (for example, to ask for a review).<\/li>\n<li><code>doctorx_commerce_order_cancelled<\/code> ( $order_id, $order ).<\/li>\n<li><code>doctorx_commerce_order_refunded<\/code> ( $order_id, $cents, $order ).<\/li>\n<li><code>doctorx_commerce_payment_mismatch<\/code> ( $order_id, $detail, $facts ): a payment did not match its order; it was left unpaid and marked for review.<\/li>\n<li><code>doctorx_commerce_product_changed<\/code> ( $product_id ): a product&#039;s details, prices, materials or availability changed; 0 means every product (a store-wide setting such as the currency or the store switch changed).<\/li>\n<li><code>doctorx_commerce_before_picker<\/code> ( $product_id ): print above the picker and its prices.<\/li>\n<li><code>doctorx_commerce_product_after_summary<\/code> ( $product_id ): print after the picker on a product&#039;s own page (reviews, ratings).<\/li>\n<li><code>doctorx_commerce_account_top<\/code> ( $user ): print at the top of a signed-in customer&#039;s account page.<\/li>\n<li><code>doctorx_commerce_store_opened<\/code>: the store has just been opened to the public (fires once per opening).<\/li>\n<\/ul>\n<h3>Filters<\/h3>\n<ul>\n<li><code>doctorx_commerce_pricing_rules<\/code> ( $rules, $product_id ): change a product&#039;s rules (for example trade prices). The picker preview, the cart, the checkout and the order all read the filtered rules, so they always agree. Money in cents: <code>lines<\/code> (<code>base<\/code>, <code>rate<\/code>), <code>price<\/code> (fixed products), <code>groups&#91;&#93;.choices&#91;&#93;<\/code> (<code>add<\/code>, <code>add_rate<\/code>).<\/li>\n<li><code>doctorx_commerce_payment_methods<\/code> ( $methods, $ready_only ): the ways to pay (id =&gt; array( label, note )); see &quot;Payment on account&quot;.<\/li>\n<li><code>doctorx_commerce_fulfilment_options<\/code> ( $options ): <code>ship<\/code> =&gt; label and\/or <code>pickup<\/code> =&gt; label for the current visitor.<\/li>\n<li><code>doctorx_commerce_order_row<\/code> ( $row, $input, $totals ): the order just before it is saved. Only <code>meta<\/code> may be changed (an array of your own values); amounts can&#039;t be.<\/li>\n<li><code>doctorx_commerce_account_order_actions<\/code> ( $actions, $order_id, $user_id ): buttons on the customer&#039;s account and order pages, each array( &#039;url&#039; =&gt; &#8230;, &#039;label&#039; =&gt; &#8230; ). <code>$user_id<\/code> is 0 for a guest who opened the order from its link.<\/li>\n<li><code>doctorx_commerce_product_schema<\/code> ( $data, $post ): the Product JSON-LD on a product page (add ratings here).<\/li>\n<li><code>doctorx_commerce_products<\/code> ( $products, $args ): the list from <code>doctorx_commerce_get_products()<\/code>.<\/li>\n<li><code>doctorx_commerce_tax_rates<\/code> ( $rates, $province ): the taxes charged in a province.<\/li>\n<li><code>doctorx_commerce_discount_valid<\/code> ( true, $code, $context ): return a WP_Error (its message is shown to the customer) to refuse a discount code. <code>$code<\/code>: <code>code<\/code>, <code>kind<\/code> (<code>percent<\/code> or <code>fixed<\/code>), <code>amount<\/code> (hundredths of a percent, or cents), <code>min_cents<\/code>, <code>starts_on<\/code>, <code>ends_on<\/code>, <code>max_uses<\/code>, <code>per_customer<\/code>, <code>used<\/code>, <code>products<\/code>. <code>$context<\/code>: <code>subtotal<\/code>, <code>lines<\/code> (<code>index<\/code>, <code>product_id<\/code>, <code>line_cents<\/code>), <code>email<\/code> (when known), <code>stage<\/code> (<code>cart<\/code>, <code>order<\/code> or <code>payment<\/code>), <code>order<\/code> (at payment).<\/li>\n<li><code>doctorx_commerce_discount_amount<\/code> ( $cents, $code, $context ): change what a code takes off; it is always kept between 0 and the eligible goods.<\/li>\n<li><code>doctorx_commerce_method_starts_unpaid<\/code> ( $starts, $method ): methods whose orders may be made and delivered before payment (default <code>delivery<\/code> and <code>account<\/code>); payment is recorded later with &quot;Mark paid&quot;.<\/li>\n<li><code>doctorx_commerce_currencies<\/code> ( $list ): the currencies offered on the Store settings (code =&gt; label).<\/li>\n<li><code>doctorx_commerce_email<\/code> ( $mail ): an order email (to, subject, html, text, headers, context); return false to stop it.<\/li>\n<li><code>doctorx_commerce_status_emails<\/code> ( $texts, $order ): which status changes email the customer.<\/li>\n<li><code>doctorx_commerce_payment_instructions<\/code> ( $lines, $order ): the paragraphs telling the customer how to pay, for every method (add a due date for orders on account, for example).<\/li>\n<li><code>doctorx_commerce_paypal_order_payload<\/code> ( $payload, $order ): the PayPal order request (the amount, invoice number and order id are always put back).<\/li>\n<li><code>doctorx_commerce_crm_lead<\/code> ( $lead, $order ): what is sent to DoctorX Customers; return an empty value to send nothing.<\/li>\n<li><code>doctorx_commerce_social_roles<\/code> ( $roles ): the roles social sign-in may sign in (default <code>customer<\/code> and <code>subscriber<\/code>). An account with any other role, or any capability listed in <code>doctorx_commerce_social_blocked_caps<\/code>, is always refused.<\/li>\n<li><code>doctorx_commerce_social_blocked_caps<\/code> ( $caps ): capabilities that make an account staff for social sign-in.<\/li>\n<li><code>doctorx_commerce_capability<\/code> ( $cap ): who may manage orders and settings (default <code>manage_options<\/code>); <code>doctorx_commerce_pricing_capability<\/code> ( $cap ): who may change prices.<\/li>\n<li><code>doctorx_commerce_may_shop<\/code> ( $ok, $state ): whether the current visitor may add to the cart and order.<\/li>\n<li><code>doctorx_commerce_client_ip<\/code> ( $ip ): the address used for rate limits (behind a proxy).<\/li>\n<li><code>doctorx_commerce_block_editor_for_products<\/code> ( false ): edit products in the block editor instead of the classic one.<\/li>\n<li><code>doctorx_command_center_modules<\/code>: this plugin adds itself to DoctorX Command Center.<\/li>\n<\/ul>\n<h3>Sales Tax Report contract<\/h3>\n<p>DoctorX Sales Tax Report calls <code>drx_commerce_orders_for_accounting( $from, $to, $which )<\/code> with site-time dates (&quot;Y-m-d&quot;) and <code>$which<\/code> <code>paid<\/code> (orders with money received, net of refunds) or <code>awaiting<\/code> (placed, not paid, not cancelled: including orders paid on delivery that were already delivered). Each row, amounts in dollars: <code>id<\/code>, <code>number<\/code>, <code>edit<\/code>, <code>date<\/code> (the day it was placed, site time), <code>province<\/code> (where it was taxed), <code>status<\/code>, <code>customer<\/code>, <code>sales<\/code> (goods after the discount), <code>shipping<\/code>, <code>fees<\/code>, <code>tax<\/code>, <code>tax_names<\/code> (joined with &quot; + &quot;), <code>taxes<\/code> (<code>GST<\/code>, <code>HST<\/code>, <code>PST<\/code>, <code>QST<\/code>, <code>other<\/code>), <code>discount<\/code> (taken off the goods, before tax), <code>total<\/code>, <code>refunded<\/code>, <code>refunded_tax<\/code>, <code>payment<\/code>, <code>items<\/code> (<code>name<\/code>, <code>qty<\/code>, <code>total<\/code>: before tax, after the line&#039;s share of the discount). For paid rows <code>sales + shipping + fees + tax = total<\/code>; refunds take the tax and the discount back in the same proportion they were paid.<\/p>\n<h3>REST routes (namespace doctorx-commerce\/v1)<\/h3>\n<p><code>GET cart<\/code>, <code>POST cart\/add<\/code>, <code>POST cart\/line<\/code>, <code>POST cart\/clear<\/code>, <code>POST cart\/code<\/code> (the code only; the server works out what it is worth), <code>POST quote<\/code>, <code>POST order<\/code>, <code>POST paypal\/create<\/code>, <code>POST paypal\/capture<\/code>, <code>POST paypal\/webhook<\/code>. The cart and order routes follow the store switch and are rate limited; an existing order is reached only with its reference and private key.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">DoctorX Trade Accounts<\/h2>\n\n\n\n<ul class=\"drx-dev-facts\"><li><strong>Shortcodes:<\/strong> <code>&#91;doctorx_trade_notice&#93;<\/code>, <code>&#91;doctorx_trade_apply&#93;<\/code>, <code>&#91;doctorx_trade_portal&#93;<\/code>, <code>&#91;doctorx_trade_dealers&#93;<\/code>, <code>&#91;doctorx_trade_spec_link&#93;<\/code>, <code>&#91;doctorx_trade_projects&#93;<\/code><\/li><\/ul>\n\n\n\n<h3>Shortcodes<\/h3>\n<ul>\n<li><code>&#91;doctorx_trade_apply&#93;<\/code> the application form. <code>kind=&quot;...&quot;<\/code> chooses one of your kinds of business in advance (so does <code>?kind=<\/code> in the address).<\/li>\n<li><code>&#91;doctorx_trade_portal&#93;<\/code> the trade portal.<\/li>\n<li><code>&#91;doctorx_trade_dealers&#93;<\/code> the dealer directory.<\/li>\n<li><code>&#91;doctorx_trade_projects&#93;<\/code> the projects page with its enquiry form.<\/li>\n<li><code>&#91;doctorx_trade_notice&#93;<\/code> the &quot;trade account&quot; line, shown only to approved dealers.<\/li>\n<li><code>&#91;doctorx_trade_spec_link text=&quot;...&quot;&#93;<\/code> a link to the spec sheet, shown only to people who may open it.<\/li>\n<\/ul>\n<h3>Hooks for developers<\/h3>\n<ul>\n<li>Filters: <code>doctorx_trade_capability<\/code>, <code>doctorx_trade_email<\/code> (change or stop any email), <code>doctorx_trade_is_spam<\/code>, <code>doctorx_trade_client_ip<\/code>, <code>doctorx_trade_crm_lead<\/code>, <code>doctorx_trade_crm_task<\/code>, <code>doctorx_trade_crm_enquiry_lead<\/code>, <code>doctorx_trade_upload_types<\/code>, <code>doctorx_trade_private_dir<\/code>, <code>doctorx_trade_block_admin<\/code>, <code>doctorx_trade_money<\/code>.<\/li>\n<li>Actions: <code>doctorx_trade_applied<\/code>, <code>doctorx_trade_status_changed<\/code>, <code>doctorx_trade_dealer_message<\/code>, <code>doctorx_trade_project_enquiry<\/code>, <code>doctorx_trade_enquiry_status<\/code>, <code>doctorx_trade_tender_filed<\/code>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">DoctorX Reviews<\/h2>\n\n\n\n<ul class=\"drx-dev-facts\"><li><strong>Shortcodes:<\/strong> <code>&#91;doctorx_reviews&#93;<\/code>, <code>&#91;doctorx_reviews_summary&#93;<\/code>, <code>&#91;drx_reviews&#93;<\/code>, <code>&#91;drx_reviews_summary&#93;<\/code><\/li><\/ul>\n\n\n\n<h3>For developers<\/h3>\n<p>Functions (check <code>function_exists()<\/code> first): <code>doctorx_reviews_get_rating( $product_id )<\/code>, <code>doctorx_reviews_get_reviews( $args )<\/code>, <code>doctorx_reviews_product_block( $product_id )<\/code>, <code>doctorx_reviews_schedule_request( $source, $order_id )<\/code>.<\/p>\n<p>Shortcodes: <code>&#91;doctorx_reviews&#93;<\/code> (every published review; <code>product=&quot;123&quot;<\/code> for one product), <code>&#91;doctorx_reviews_summary&#93;<\/code> (stars and count), <code>&#91;doctorx_review_form&#93;<\/code> (the form page).<\/p>\n<p>Filters: <code>doctorx_reviews_product_schema<\/code> (pass your own Product markup through it to get the rating added), <code>doctorx_reviews_add_schema<\/code>, <code>doctorx_reviews_should_ask<\/code>, <code>doctorx_reviews_request_email<\/code>, <code>doctorx_reviews_display_name<\/code>, <code>doctorx_reviews_moderator_caps<\/code>, <code>doctorx_reviews_sources<\/code> and <code>doctorx_reviews_get_order<\/code> (add another shop). Actions: <code>doctorx_reviews_submitted<\/code>, <code>doctorx_reviews_changed<\/code>, <code>doctorx_reviews_request_sent<\/code>.<\/p>\n<p>DoctorX Made-to-Measure Checkout is read through <code>doctorx_commerce_get_order()<\/code>, <code>doctorx_commerce_get_orders()<\/code>, the <code>doctorx_commerce_order_delivered<\/code> and <code>doctorx_commerce_order_cancelled<\/code> actions and the <code>doctorx_commerce_product_schema<\/code> filter. Its product pages show reviews where it fires <code>do_action( &#039;doctorx_commerce_product_after_summary&#039;, $product_id )<\/code>; ratings are added to its product markup only once it does (override with <code>doctorx_reviews_commerce_shows_reviews<\/code>). Its account page can offer a &quot;Review&quot; button through the <code>doctorx_commerce_account_order_actions<\/code> filter. Statuses that count as delivered: <code>doctorx_reviews_woocommerce_delivered_statuses<\/code> and <code>doctorx_reviews_commerce_delivered_statuses<\/code>.<\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>What developers can build on: hooks, shortcodes, blocks, REST routes and WP-CLI commands, taken from each plugin&#8217;s own readme and from what this site has registered. DoctorX Made-to-Measure Checkout Shortcodes: &#91;drx_mtm_account&#93;, &#91;drx_mtm_picker&#93;, &#91;drx_mtm_checkout&#93;, &#91;drx_mtm_order&#93;, &#91;drx_mtm_price_table&#93; Blocks: doctorx-commerce\/picker REST routes: \/doctorx-commerce\/v1, \/doctorx-commerce\/v1\/cart, \/doctorx-commerce\/v1\/cart\/add, \/doctorx-commerce\/v1\/cart\/line, \/doctorx-commerce\/v1\/cart\/clear, \/doctorx-commerce\/v1\/cart\/code, \/doctorx-commerce\/v1\/quote, \/doctorx-commerce\/v1\/order, \/doctorx-commerce\/v1\/paypal\/create, \/doctorx-commerce\/v1\/paypal\/capture, \/doctorx-commerce\/v1\/paypal\/webhook Every function below is defined [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-53","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/demo.doctorx.ca\/shop\/wp-json\/wp\/v2\/pages\/53","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.doctorx.ca\/shop\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/demo.doctorx.ca\/shop\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.doctorx.ca\/shop\/wp-json\/wp\/v2\/comments?post=53"}],"version-history":[{"count":2,"href":"https:\/\/demo.doctorx.ca\/shop\/wp-json\/wp\/v2\/pages\/53\/revisions"}],"predecessor-version":[{"id":56,"href":"https:\/\/demo.doctorx.ca\/shop\/wp-json\/wp\/v2\/pages\/53\/revisions\/56"}],"wp:attachment":[{"href":"https:\/\/demo.doctorx.ca\/shop\/wp-json\/wp\/v2\/media?parent=53"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}