Bridge Pattern

Integrating third-party plugins with WooNooW

Philosophy

WooNooW Core = Zero Addon Dependencies

We don't integrate specific plugins into WooNooW core. Instead, we provide:

  1. Hook system for addons to extend functionality
  2. Bridge snippets for compatibility with existing plugins
  3. Addon development guide for building proper WooNooW addons

The Problem

Example: Rajaongkir (Indonesian Shipping Plugin). It removes standard fields and adds custom dropdowns, storing data in WooCommerce sessions. It doesn't work with WooNooW OrderForm out of the box because the OrderForm uses standard fields and API-based validation.


Solution: Bridge Snippet

Option A: Standalone Bridge Plugin

Create a tiny bridge plugin that makes the third-party plugin work with WooNooW.

/**
 * Plugin Name: WooNooW Rajaongkir Bridge
 * Description: Makes Rajaongkir plugin work with WooNooW OrderForm
 * Version: 1.0.0
 */

// Hook into WooNooW's shipping calculation
add_filter('woonoow_before_shipping_calculate', function($shipping_data) {
    if ($shipping_data['country'] === 'ID' && !empty($shipping_data['city'])) {
        // Search API and set session data
        $api = Cekongkir_API::get_instance();
        $results = $api->search_destination_api($shipping_data['city']);
        
        if (!empty($results[0])) {
            WC()->session->set('selected_destination_id', $results[0]['id']);
        }
    }
    return $shipping_data;
});

Option B: Frontend Injection

Inject script to handle UI changes.

import { addonLoader, addFilter } from '@woonoow/hooks';

addonLoader.register({
  id: 'rajaongkir-bridge',
  init: () => {
    addFilter('woonoow_order_form_after_shipping', (content, formData, setFormData) => {
      if (formData.shipping?.country !== 'ID') return content;
      return (
        <>
          {content}
          <div className="custom-field">
             {/* Custom Destination Select */}
          </div>
        </>
      );
    });
  }
});

Published on Jul 16, 1936