1. Admin OrderForm: Changed billing & shipping state from Select to
SearchableSelect for better UX (consistent with country field)
2. OrdersController: Replaced Rajaongkir-specific hardcoded session
handling with generic filter hook:
do_action('woonoow/shipping/before_calculate', $shipping, $items)
3. Added RAJAONGKIR_INTEGRATION.md with:
- Hook documentation
- Code snippet to bridge Rajaongkir with WooNooW
- Frontend integration examples
- Troubleshooting guide
5.8 KiB
Rajaongkir Integration with WooNooW
This guide explains how to bridge the Rajaongkir shipping plugin with WooNooW's admin order form and checkout flow.
The Challenge
Rajaongkir doesn't use standard WooCommerce address fields. Instead of using city and state, it requires a destination ID from its own Indonesian location database.
Standard WooCommerce Flow:
Country → State → City → Postcode
Rajaongkir Flow:
Country (ID) → Destination ID (subdistrict level)
WooNooW Integration Hook
WooNooW provides a hook that fires before shipping calculation. This allows plugins like Rajaongkir to set session variables or prepare any data they need.
Hook: woonoow/shipping/before_calculate
do_action( 'woonoow/shipping/before_calculate', $shipping_data, $items );
Parameters:
$shipping_data(array) - The shipping address from frontend:country- Country code (e.g., 'ID')state- State codecity- City namepostcode- Postal codeaddress_1- Street addressaddress_2- Additional address (optional)-
- Any custom fields added by addons
$items(array) - Cart items being shipped
Code Snippet: Rajaongkir Bridge
Add this code to your theme's functions.php or via a code snippets plugin:
<?php
/**
* Bridge Rajaongkir plugin with WooNooW shipping calculation.
*
* This code listens for WooNooW's shipping hook and sets the
* Rajaongkir session variables it needs to calculate rates.
*/
add_action( 'woonoow/shipping/before_calculate', function( $shipping, $items ) {
// Only process for Indonesia
if ( empty( $shipping['country'] ) || $shipping['country'] !== 'ID' ) {
// Clear Rajaongkir session for non-ID countries
WC()->session->__unset( 'selected_destination_id' );
WC()->session->__unset( 'selected_destination_label' );
return;
}
// Check if destination_id is provided by frontend
if ( ! empty( $shipping['destination_id'] ) ) {
WC()->session->set( 'selected_destination_id', $shipping['destination_id'] );
WC()->session->set( 'selected_destination_label', $shipping['destination_label'] ?? $shipping['city'] );
return;
}
// Fallback: Try to lookup destination from city name
// This requires the Rajaongkir database lookup
$destination = rajaongkir_lookup_destination( $shipping['city'], $shipping['state'] );
if ( $destination ) {
WC()->session->set( 'selected_destination_id', $destination['id'] );
WC()->session->set( 'selected_destination_label', $destination['label'] );
}
}, 10, 2 );
/**
* Helper: Lookup Rajaongkir destination by city/state name.
*
* This is a simplified example. Implement based on your Rajaongkir data structure.
*/
function rajaongkir_lookup_destination( $city, $state ) {
// Query the Rajaongkir location database
// This depends on how your Rajaongkir plugin stores location data
// Example using transient/option storage:
$locations = get_option( 'cekongkir_destinations', [] );
foreach ( $locations as $location ) {
if (
stripos( $location['city'], $city ) !== false ||
stripos( $location['district'], $city ) !== false
) {
return [
'id' => $location['id'],
'label' => $location['label'],
];
}
}
return null;
}
Frontend Integration (Optional)
To add a proper Rajaongkir destination selector to WooNooW's admin order form, you need to:
1. Register Custom Address Fields
add_filter( 'woonoow/checkout/address_fields', function( $fields ) {
// Only for Indonesia
if ( WC()->customer && WC()->customer->get_shipping_country() === 'ID' ) {
$fields['destination_id'] = [
'type' => 'hidden',
'required' => true,
];
$fields['destination_selector'] = [
'type' => 'custom',
'component' => 'RajaongkirDestinationSelector',
'label' => __( 'Destination', 'woonoow-rajaongkir' ),
'required' => true,
];
}
return $fields;
} );
2. Enqueue JavaScript for Destination Search
add_action( 'woonoow/admin/enqueue_scripts', function() {
wp_enqueue_script(
'woonoow-rajaongkir',
plugins_url( 'assets/js/woonoow-integration.js', __FILE__ ),
[ 'woonoow-admin' ],
'1.0.0',
true
);
wp_localize_script( 'woonoow-rajaongkir', 'WNW_RAJAONGKIR', [
'ajaxUrl' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'rajaongkir_search' ),
] );
} );
Testing
- Install and configure Rajaongkir plugin
- Add the code snippet above
- Go to WooNooW → Orders → Create New Order
- Add a product
- Set country to Indonesia
- Fill in city/state (or use destination selector if implemented)
- Click "Calculate Shipping"
- Verify Rajaongkir rates appear
Troubleshooting
Rates not appearing?
-
Check browser DevTools Network tab for
/shipping/calculateresponse -
Look for
debugobject in response:{ "methods": [...], "debug": { "packages_count": 1, "cart_items_count": 1, "address": { ... } } } -
Verify Rajaongkir session is set:
error_log( 'destination_id: ' . WC()->session->get( 'selected_destination_id' ) );
Session not persisting?
Make sure WooCommerce session is initialized before the hook runs. The hook fires during REST API calls where session may not be initialized by default.
Related Documentation
- SHIPPING_INTEGRATION.md - General shipping integration guide
- SHIPPING_METHOD_TYPES.md - Shipping method types explanation
- Rajaongkir Plugin Documentation