get('timezone'));
$state = sanitize_text_field($request->get('state'));
if ($timezone) {
$countryCode = LocalizationManager::guessCountryFromTimezone($timezone);
} else {
$countryCode = sanitize_text_field($request->get('country_code'));
}
if (!$countryCode) {
return [
'status' => false,
'message' => __('Country code is required', 'fluent-cart')
];
}
// Single query: get all applicable methods from both general and class-specific zones
$availableShippingMethods = ShippingMethod::query()
->whereHas('zone', function ($query) use ($countryCode) {
$query->where(function ($q) use ($countryCode) {
$q->whereIn('region', [$countryCode, 'all'])
->orWhere('region', 'selection');
});
})
->where('is_enabled', 1)
->where(function ($q) use ($state) {
// State filter (same logic as scopeApplicableToCountry)
$isSqlite = defined('DB_ENGINE') && DB_ENGINE === 'sqlite';
if ($isSqlite) {
$q->where('states', '[]')
->orWhereNull('states');
if ($state) {
$escapedState = str_replace(['%', '_'], ['\\%', '\\_'], $state);
$q->orWhere('states', 'LIKE', '%"' . $escapedState . '"%');
}
} else {
$q->whereJsonLength('states', 0);
if ($state) {
$q->orWhereJsonContains('states', $state);
}
}
})
->orderBy('amount', 'DESC')
->with('zone')
->get();
// Post-filter selection zones that don't match this country
$availableShippingMethods = $availableShippingMethods->filter(function ($method) use ($countryCode) {
if (!$method->zone || $method->zone->region !== 'selection') {
return true;
}
return $method->zone->appliesToCountry($countryCode);
})->values();
if (!$availableShippingMethods || $availableShippingMethods->isEmpty()) {
$settingView = '
'
. esc_html__('No shipping methods available for this address.', 'fluent-cart');
if (current_user_can('manage_options')) {
$settingsPageUrl = admin_url('admin.php?page=fluent-cart#/settings/shipping');
$settingsLink = '
' . esc_html__('Activate from settings.', 'fluent-cart') . '';
$settingView .= ' ' . $settingsLink;
}
$settingView .= '
';
return [
'status' => false,
'country_code' => $countryCode,
'view' => $settingView
];
}
return [
'available_shipping_methods' => $availableShippingMethods,
'country_code' => $countryCode
];
}
public function getShippingMethodsListView(Request $request)
{
$availableShippingMethods = $this->getAvailableShippingMethods($request);
$shippingMethods = Arr::get($availableShippingMethods, 'available_shipping_methods');
$countryCode = Arr::get($availableShippingMethods, 'country_code');
$status = Arr::get($availableShippingMethods, 'status');
if ($status === false) {
return $availableShippingMethods;
}
ob_start();
do_action('fluent_cart/views/checkout_page_shipping_method_list', [
'shipping_methods' => $shippingMethods
]);
$content = ob_get_clean();
return $this->sendSuccess(
[
'status' => true,
'view' => $content,
'country_code' => $countryCode,
]
);
}
public function getCountryInfo(Request $request): \WP_REST_Response
{
$timezone = sanitize_text_field($request->get('timezone'));
if ($timezone) {
$countryCode = LocalizationManager::guessCountryFromTimezone($timezone);
} else {
$countryCode = sanitize_text_field($request->get('country_code'));
}
$states = LocalizationManager::getInstance()->statesOptions($countryCode);
$addressLocale = LocalizationManager::getInstance()->addressLocales($countryCode);
return $this->sendSuccess([
'country_code' => $countryCode,
'states' => $states,
'address_locale' => $addressLocale
]);
}
}