How to Make WooCommerce Plugin HPOS Compatible

How to Make WooCommerce Plugin HPOS Compatible

In today’s rapidly evolving eCommerce landscape, compatibility with advanced systems like High-Performance Order Storage (HPOS) is paramount for businesses aiming to simplify order management processes.

This comprehensive guide on how to make the WooCommerce plugin HPOS compatible discusses the complexities of optimizing its performance to ensure seamless integration with HPOS.

From enhancing order storage efficiency to fine-tuning processing capabilities, we’ll explore essential strategies to achieve optimal compatibility with HPOS.

Whether you’re a seasoned developer seeking to optimize your plugin or a business owner aiming to enhance operational efficiency, this article offers invaluable insights into achieving high-performance compatibility with HPOS.

What is HPOS (High-Performance Order Storage)?

What is HPOS

HPOS (High-Performance Order Storage) is an innovative system engineered to elevate and accelerate order management processes, especially within dynamic sectors like eCommerce and retail.

HPOS uses efficient storage and retrieval mechanisms to handle a substantial influx of orders swiftly and precisely.

This system claims functionalities designed to improve order processing velocity, reduce delay, and increase overall effectiveness.

By integrating HPOS, businesses can seamlessly administer their orders in real-time, guaranteeing prompt fulfillment and heightened customer contentment.

Explore how to make your WooCommerce plugin HPOS Compatible and optimize its performance to synchronize effortlessly with this cutting-edge order management solution.

Benefits of Making WooCommerce Plugin HPOS Compatible

In order to make a WooCommerce plugin HPOS compatible, it brings numerous advantages for businesses operating in the eCommerce and retail sectors:

  1. Streamlined Order Management: By ensuring compatibility with HPOS, your WooCommerce plugin seamlessly integrates with the order management system, simplifying the order processing workflow and minimizing errors.
  2. Enhanced Efficiency: HPOS-compatible plugins use the advanced capabilities of the order storage system to boost efficiency. Orders are processed faster, inventory updates occur in real-time, and customer orders are fulfilled promptly.
  3. Improved Customer Experience: With compatibility with HPOS, businesses can provide customers with a smoother purchasing journey. Orders are processed swiftly, inventory availability is accurate, and customers receive timely updates on their order status, leading to higher satisfaction levels.
  4. Better Inventory Control: Integration with HPOS ensures accurate inventory levels across all channels, preventing overselling and differences between online and offline inventory data.
  5. Scalability: Plugins compatible with HPOS are designed to efficiently handle high order volumes, enabling businesses to scale their operations without performance concerns.
  6. Data Synchronization: Syncing order data between your WooCommerce store and HPOS ensures consistency and up-to-date information, eliminating data silos and providing a unified view of business operations.
  7. Increased Productivity: Automating order management tasks through compatibility with HPOS frees up time for teams to focus on other business aspects such as marketing, customer service, and product development.
  8. Competitive Edge: Offering compatibility with HPOS demonstrates a commitment to efficient order management solutions, positioning your WooCommerce store as a preferred choice for customers and partners.

Ensuring your WooCommerce plugin is HPOS compatible can significantly enhance efficiency, accuracy, and customer satisfaction, driving growth and success in the competitive eCommerce landscape.

How to Make WooCommerce Plugin HPOS Compatible

We have successfully made our premium WooCommerce extensions HPOS compatible, such as MultiPOS – Point of Sale for WooCommerce, WooCommerce Affiliates, and more. To make the WooCommerce plugin HPOS compatible, follow these steps:

1. Declare your Plugin’s compatibility with HPOS

You can declare your plugin’s compatibility with HPOS by adding the following code to its main file.

add_action( 'before_woocommerce_init', 'before_woocommerce_hpos' );
function before_woocommerce_hpos() { 
    if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) { 
       \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true ); 

2. Detecting whether HPOS Tables are being used in the Store

While the WooCommerce CRUD API will typically support posts and custom tables without further effort, in some circumstances (such as when building a SQL query for improved performance), you may wish to know whether the shop uses HPOS tables.

In this scenario, you can apply the following pattern:

use Automattic\WooCommerce\Utilities\OrderUtil;

if ( OrderUtil::custom_orders_table_usage_is_enabled() ) {
    // HPOS usage is enabled.
} else {
    // Traditional CPT-based orders are in use.

3. Get or Set an Order and Order Meta

Further, to make the WooCommerce plugin HPOS compatible, you may use the WooCommerce API to access or set the order and its metadata.

Use the wc_get_order() function instead get_post() to retrieve your order data. Here’s the command change you must make to give you a better representation.

// Instead of 
$order = get_post( $order_id ); // returns WP_Post object. 
// use 
$order = wc_get_order( $order_id ); // returns WC_Order object.

Next, To interact with metadata, call the update_meta_data, add_meta_data, and delete_meta_data methods on the order object, followed by a save call.

WooCommerce will determine active tables and save data to the proper areas.

// Instead of following update/add/delete methods, use:
update_post_meta( $post_id, $meta_key_1, $meta_value_1 );
add_post_meta( $post_id, $meta_key_2, $meta_value_2 );
delete_post_meta( $post_id, $meta_key_3, $meta_value_3 );
get_post_meta( $post_id, $meta_key_4, true);
// use
$order = wc_get_order( $post_id );
$order->update_meta_data( $meta_key_1, $meta_value_1 );
$order->add_meta_data( $meta_key_2, $meta_value_2 );
$order->delete_meta_data( $meta_key_3, $meta_value_3 );
$order->get_meta( $meta_key_4, true );

The save() method is a relatively expensive process, so you may want to avoid using it more than required when understanding how to make WooCommerce plugin HPOS compatible.

(For example, if you know it will be used later in the flow, you may want to avoid making additional early calls when working with the same object).

4. Check for the Order Type

When getting the exact type of order or checking if the given ID is an order, you can use methods from the class OrderUtil.

// Pattern to check when an ID is an order
'shop_order' === get_post_type( $post_id ); // or
in_array( get_post_type( $post_type ), wc_get_order_types() );

// replace with:
use Automattic\WooCommerce\Utilities\OrderUtil;
'shop_order' === OrderUtil::get_order_type( $post_id ); // or
OrderUtil::is_order( $post_id, wc_get_order_types() );

5. Audit for Order Administration Screen Functions

We have created unique order management windows since WC cannot use the WordPress-provided post list and edit screens.

These panels are reasonably similar to the ones you see in the WooCommerce admin right now (except that they use HPOS tables). You can execute this audit using the following regular expression:


There will be many false positives here as well. However, if you discover a usage where these methods are called for the order screen, you must make the following adjustments to upgrade them to HPOS:

Instead of a $post object from the WP_Post class, you should use a $order object from the WC_Order class.

If it’s a filter or an action, we’ll add a similar filter to the new WooCommerce screen that accepts a WC_Order object instead of a post object.

6. Add Meta Boxes

The following code sample demonstrates how to add meta boxes to the legacy order editor screen when legacy orders are active and to the new HPOS-powered editor screen otherwise.

use Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController;

add_action( 'add_meta_boxes', 'add_test_metabox' );

function add_test_metabox() {
	$screen = class_exists( '\Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController' ) && wc_get_container()->get( CustomOrdersTableController::class )->custom_orders_table_usage_is_enabled()
		? wc_get_page_screen_id( 'shop-order' )
		: 'shop_order';

		'Custom Meta Box',

To order, the preceding will also modify the argument supplied to the meta box. So, in your meta boxes, you’d need to account for a post and an order object that could be passed. We recommend retrieving the order object and working with it entirely instead of the passed parameter.

function render_test_metabox( $post_or_order_object ) {
    $order = ( $post_or_order_object instanceof WP_Post ) ? wc_get_order( $post_or_order_object->ID ) : $post_or_order_object;
    // ... rest of the code. $post_or_order_object should not be used directly below this point.

Final Thoughts

In conclusion, mastering the art of how to make WooCommerce plugin HPOS compatible holds the key to optimizing order management processes in the fast-paced realm of eCommerce.

Following the steps outlined in this guide, you can ensure that your plugin seamlessly integrates with High-performance Order Storage (HPOS), facilitating simplified order processing, efficient inventory management, and heightened customer satisfaction.

From understanding HPOS requirements to conducting thorough testing and committing to ongoing maintenance, each phase plays an essential role in crafting a high-performance solution personalized to meet the demands of modern online businesses.

Embrace the opportunity to elevate your order management capabilities and unlock new levels of efficiency and performance by embracing HPOS compatibility.

Leave a Reply

Your email address will not be published. Required fields are marked *

This website uses cookies to ensure you get the best experience on our website. By continuing to use this site, you agree to the use of cookies in accordance with our Cookie Policy.