/**
* ============================================================
* CRASH CRUMB – KARACHI DELIVERY SYSTEM
* COMPLETE REPLACEMENT VERSION
*
* WooCommerce + Storefront
*
* IMPORTANT:
* 1. Disable/delete ALL previous delivery snippets first.
* 2. Paste this whole code into Code Snippets.
* 3. DO NOT add array(
‘areas’ => array(
‘Gulshan-e-Iqbal (All Blocks)’ => 200,
),
),
/* =========================
* ZONE B
* ========================= */
‘Zone B’ => array(
‘areas’ => array(
‘Gulistan-e-Johar (Blocks 7, 8, 9, 10)’ => 300,
‘Askari 4’ => 250,
‘Gulshan-e-Jamal’ => 250,
‘Scheme 33 – Jamali Pull’ => 300,
‘Safoora’ => 300,
‘Gulzar-e-Hijri’ => 300,
‘AOHS’ => 300,
‘DOHS’ => 300,
‘KDA Officers Society’ => 300,
‘FB Area (All Blocks)’ => 250,
),
),
/* =========================
* ZONE C
* ========================= */
‘Zone C’ => array(
‘areas’ => array(
‘NHS Karsaz (All Phases)’ => 300,
‘Aga Khan Hospital’ => 300,
‘Liaquat National Hospital’ => 300,
‘Bahadurabad’ => 250,
‘Saadi Town’ => 300,
‘Airport’ => 300,
‘Malir Cantt’ => 400,
‘Malir’ => 500,
‘North Nazimabad (All Blocks)’ => 350,
‘Bufferzone (All Sectors)’ => 300,
‘Shadman Town (All Sectors)’ => 450,
‘Nazimabad (All Blocks)’ => 350,
‘Liaquatabad’ => 300,
),
),
/* =========================
* ZONE D
* ========================= */
‘Zone D’ => array(
‘areas’ => array(
‘Al Hilal Society’ => 400,
‘PIB Colony’ => 400,
‘Garden East’ => 400,
‘Guru Mandir’ => 400,
‘Jamshed Road’ => 300,
‘Kashmir Road’ => 300,
‘Lines Area’ => 300,
‘Sindhi Muslim Society’ => 300,
‘PECHS (All Blocks)’ => 350,
/* Same area/rate as Zone C */
‘Bahadurabad’ => 250,
‘Sharfabad’ => 250,
‘M. Ali Society’ => 300,
‘KDA Scheme 1’ => 400,
‘Falcon Complex’ => 400,
‘Dadabhai Town’ => 400,
‘KECHS (All Blocks)’ => 350,
‘Mehmoodabad’ => 400,
‘Shahrah-e-Faisal (up to FTC)’ => 400,
‘Shah Faisal Colony’ => 450,
‘Gulshan-e-Maymar’ => 500,
‘North Karachi’ => 450,
‘Pak Colony’ => 450,
‘Garden West’ => 450,
‘Saddar’ => 450,
‘Civil Hospital’ => 450,
‘I.I. Chundrigar Road’ => 450,
‘Bazatta Line’ => 450,
‘Avari Tower’ => 450,
‘Manzoor Colony’ => 450,
‘PIDC’ => 450,
‘Akhter Colony’ => 450,
‘Kashmir Colony’ => 450,
),
),
/* =========================
* ZONE E
* ========================= */
‘Zone E’ => array(
‘areas’ => array(
‘DHA (All Phases)’ => 500,
‘Clifton (All Blocks)’ => 600,
‘Frere Town’ => 500,
‘Bath Island’ => 500,
‘Civil Lines’ => 500,
‘Jinnah Hospital’ => 500,
‘Kharadar’ => 500,
‘Tower’ => 500,
‘Lyari’ => 500,
‘Lalazar’ => 500,
‘SITE Area / Metroville’ => 500,
),
),
/* =========================
* ZONE F
* ========================= */
‘Zone F’ => array(
‘areas’ => array(
‘Korangi’ => 650,
‘Landhi’ => 650,
‘Baldia Town’ => 650,
‘Orangi Town’ => 650,
),
),
);
}
/* ============================================================
* 2. GET DELIVERY PRICE
* ============================================================ */
function cc_get_delivery_price( $area ) {
if ( empty( $area ) ) {
return false;
}
$areas = cc_delivery_areas();
foreach ( $areas as $zone ) {
if ( isset( $zone[‘areas’][ $area ] ) ) {
return (float) $zone[‘areas’][ $area ];
}
}
return false;
}
/* ============================================================
* 3. GET ALL DELIVERY OPTIONS
* ============================================================ */
function cc_get_delivery_options() {
$options = array();
$areas = cc_delivery_areas();
foreach ( $areas as $zone ) {
foreach ( $zone[‘areas’] as $area => $price ) {
$options[ $area ] = (float) $price;
}
}
return $options;
}
/* ============================================================
* 4. ADD DELIVERY CHARGE TO WOOCOMMERCE TOTAL
* ============================================================ */
add_action(
‘woocommerce_cart_calculate_fees’,
‘cc_add_delivery_charge_to_cart’,
20
);
function cc_add_delivery_charge_to_cart( $cart ) {
if ( is_admin() && ! defined( ‘DOING_AJAX’ ) ) {
return;
}
if ( ! function_exists( ‘WC’ ) ) {
return;
}
if ( ! WC()->session ) {
return;
}
$area = WC()->session->get( ‘cc_delivery_area’ );
if ( empty( $area ) ) {
return;
}
$delivery_charge = cc_get_delivery_price( $area );
if ( false === $delivery_charge ) {
return;
}
if ( $delivery_charge <= 0 ) {
return;
}/*
* This creates a real WooCommerce fee.
* Therefore it will also become part of the order total.
*/$cart->add_fee(
‘Delivery Charges’,
$delivery_charge,
false
);
}
/* ============================================================
* 5. CART DELIVERY AREA
* ============================================================ */
add_action(
‘woocommerce_before_cart’,
‘cc_cart_delivery_area’,
10
);
function cc_cart_delivery_area() {
if ( ! function_exists( ‘WC’ ) || ! WC()->session ) {
return;
}
$selected_area = WC()->session->get(
‘cc_delivery_area’
);
$options = cc_get_delivery_options();
echo ‘
echo ‘
Delivery Area
‘;
echo ‘‘;
echo ‘
echo ‘‘;
foreach ( $options as $area => $price ) {
echo ‘
echo esc_html( $area );
echo ‘ – PKR ‘;
echo esc_html(
number_format_i18n( $price )
);
echo ‘‘;
}
echo ‘‘;
echo ‘
if ( ! empty( $selected_area ) ) {
$price = cc_get_delivery_price(
$selected_area
);
if ( false !== $price ) {
echo ‘Delivery Charges: PKR ‘;
echo esc_html(
number_format_i18n( $price )
);
echo ‘‘;
}
}
echo ‘
‘;
echo ‘
‘;
echo ‘
‘;
}
/* ============================================================
* 6. CHECKOUT DELIVERY AREA
* ============================================================ */
add_action(
‘woocommerce_after_order_notes’,
‘cc_checkout_delivery_area’,
10
);
function cc_checkout_delivery_area( $checkout ) {
$options = array(
” => ‘Select your delivery area’,
);
$delivery_options = cc_get_delivery_options();
foreach ( $delivery_options as $area => $price ) {
$options[ $area ] =
$area .
‘ – PKR ‘ .
number_format_i18n( $price );
}
$selected_area = ”;
if ( function_exists( ‘WC’ ) && WC()->session ) {
$selected_area = WC()->session->get(
‘cc_delivery_area’
);
}
echo ‘
echo ‘
Delivery Area
‘;
woocommerce_form_field(
‘cc_delivery_area’,
array(
‘type’ => ‘select’,
‘class’ => array(
‘form-row-wide’,
‘cc-delivery-field’,
),
‘label’ => ‘Select your area’,
‘required’ => true,
‘options’ => $options,
),
$selected_area
);
echo ‘
if ( ! empty( $selected_area ) ) {
$price = cc_get_delivery_price(
$selected_area
);
if ( false !== $price ) {
echo ‘Delivery Charges: PKR ‘;
echo esc_html(
number_format_i18n( $price )
);
echo ‘‘;
}
}
echo ‘
‘;
echo ‘
‘;
echo ‘
‘;
}
/* ============================================================
* 7. AJAX – SAVE DELIVERY AREA
* ============================================================ */
add_action(
‘wp_ajax_cc_save_delivery_area’,
‘cc_ajax_save_delivery_area’
);
add_action(
‘wp_ajax_nopriv_cc_save_delivery_area’,
‘cc_ajax_save_delivery_area’
);
function cc_ajax_save_delivery_area() {
check_ajax_referer(
‘cc_delivery_nonce’,
‘nonce’
);
if ( ! function_exists( ‘WC’ ) || ! WC()->session ) {
wp_send_json_error(
array(
‘message’ => ‘WooCommerce session not available.’,
)
);
}
$area = isset( $_POST[‘area’] )
? sanitize_text_field(
wp_unslash(
$_POST[‘area’]
)
)
: ”;
/* Customer cleared area */
if ( empty( $area ) ) {
WC()->session->__unset(
‘cc_delivery_area’
);
if ( WC()->cart ) {
WC()->cart->calculate_totals();
}
wp_send_json_success(
array(
‘area’ => ”,
‘charge’ => 0,
)
);
}
/* Validate area */
$charge = cc_get_delivery_price(
$area
);
if ( false === $charge ) {
wp_send_json_error(
array(
‘message’ => ‘Invalid delivery area.’,
)
);
}
/* Save area in WooCommerce session */
WC()->session->set(
‘cc_delivery_area’,
$area
);
/* Recalculate totals */
if ( WC()->cart ) {
WC()->cart->calculate_totals();
}
wp_send_json_success(
array(
‘area’ => $area,
‘charge’ => $charge,
)
);
}
/* ============================================================
* 8. CHECKOUT – SAVE AREA DURING CHECKOUT UPDATE
* ============================================================ */
add_action(
‘woocommerce_checkout_update_order_review’,
‘cc_checkout_update_delivery_area’
);
function cc_checkout_update_delivery_area( $post_data ) {
if (
! function_exists( ‘WC’ ) ||
! WC()->session
) {
return;
}
parse_str(
$post_data,
$data
);
if ( isset( $data[‘cc_delivery_area’] ) ) {
$area = sanitize_text_field(
wp_unslash(
$data[‘cc_delivery_area’]
)
);
if ( ! empty( $area ) ) {
$price = cc_get_delivery_price(
$area
);
if ( false !== $price ) {
WC()->session->set(
‘cc_delivery_area’,
$area
);
}
} else {
WC()->session->__unset(
‘cc_delivery_area’
);
}
}
}
/* ============================================================
* 9. REQUIRE DELIVERY AREA BEFORE ORDER
* ============================================================ */
add_action(
‘woocommerce_checkout_process’,
‘cc_require_delivery_area’
);
function cc_require_delivery_area() {
$area = isset( $_POST[‘cc_delivery_area’] )
? sanitize_text_field(
wp_unslash(
$_POST[‘cc_delivery_area’]
)
)
: ”;
if ( empty( $area ) ) {
wc_add_notice(
‘Please select your delivery area before placing the order.’,
‘error’
);
return;
}
$price = cc_get_delivery_price(
$area
);
if ( false === $price ) {
wc_add_notice(
‘Please select a valid delivery area.’,
‘error’
);
}
}
/* ============================================================
* 10. SAVE DELIVERY AREA + CHARGE TO ORDER
* ============================================================ */
add_action(
‘woocommerce_checkout_create_order’,
‘cc_save_delivery_data_to_order’,
20,
2
);
function cc_save_delivery_data_to_order(
$order,
$data
) {
if (
! function_exists( ‘WC’ ) ||
! WC()->session
) {
return;
}
$area = WC()->session->get(
‘cc_delivery_area’
);
/*
* Extra fallback:
* If session is empty, get area directly from checkout POST.
*/
if (
empty( $area ) &&
isset( $_POST[‘cc_delivery_area’] )
) {
$area = sanitize_text_field(
wp_unslash(
$_POST[‘cc_delivery_area’]
)
);
}
if ( empty( $area ) ) {
return;
}
$charge = cc_get_delivery_price(
$area
);
/* Save delivery area */
$order->update_meta_data(
‘_cc_delivery_area’,
sanitize_text_field( $area )
);
/* Save delivery charge */
if ( false !== $charge ) {
$order->update_meta_data(
‘_cc_delivery_charge’,
(float) $charge
);
}
}
/* ============================================================
* 11. ADMIN ORDER – SHOW DELIVERY DETAILS
* ============================================================ */
add_action(
‘woocommerce_admin_order_data_after_billing_address’,
‘cc_admin_show_delivery_data’,
20
);
function cc_admin_show_delivery_data( $order ) {
if ( ! $order ) {
return;
}
$area = $order->get_meta(
‘_cc_delivery_area’
);
$charge = $order->get_meta(
‘_cc_delivery_charge’
);
if (
empty( $area ) &&
” === $charge
) {
return;
}
echo ‘
echo ‘
Delivery Details
‘;
if ( ! empty( $area ) ) {
echo ‘
‘;
echo ‘Delivery Area: ‘;
echo esc_html( $area );
echo ‘
‘;
}
if ( ” !== $charge ) {
echo ‘
‘;
echo ‘Delivery Charges: PKR ‘;
echo esc_html(
number_format_i18n(
(float) $charge
)
);
echo ‘
‘;
}
echo ‘
‘;
}
/* ============================================================
* 12. CUSTOMER ORDER – SHOW DELIVERY DETAILS
* ============================================================ */
add_action(
‘woocommerce_order_details_after_customer_details’,
‘cc_customer_show_delivery_data’
);
function cc_customer_show_delivery_data( $order ) {
$area = $order->get_meta(
‘_cc_delivery_area’
);
$charge = $order->get_meta(
‘_cc_delivery_charge’
);
if (
empty( $area ) &&
” === $charge
) {
return;
}
echo ‘
echo ‘
‘;
echo ‘Delivery Area: ‘;
echo esc_html( $area );
echo ‘
‘;
if ( ” !== $charge ) {
echo ‘Delivery Charges: PKR ‘;
echo esc_html(
number_format_i18n(
(float) $charge
)
);
}
echo ‘
‘;
echo ‘
‘;
}
/* ============================================================
* 13. CSS
* ============================================================ */
add_action(
‘wp_head’,
‘cc_delivery_css’
);
function cc_delivery_css() {
if (
! is_cart() &&
! is_checkout()
) {
return;
}
?>
jQuery(function($){
var ccPrices=;
var ccNonce=;
var ccAjaxURL=;
function ccUpdateDisplay(selector,priceSelector){
var area=$(selector).val();
if(!area){
$(priceSelector).html('');
return}
var price=ccPrices[area];
if(typeof price==='undefined'){
$(priceSelector).html('');
return}
$(priceSelector).html('Delivery Charges: PKR '+Number(price).toLocaleString()+'')}
function ccSaveDeliveryArea(area,page){
var messageSelector;
if(page==='cart'){
messageSelector='#cc-cart-delivery-message';
}else{
messageSelector='#cc-checkout-delivery-message'}
$(messageSelector).html('Updating delivery charges...');
$.ajax({
type:'POST',
url:ccAjaxURL,
data:{
action:'cc_save_delivery_area',
nonce:ccNonce,
area:area},
success:function(response){
if(!response||!response.success){
$(messageSelector).html(''+'Unable to update delivery charges.'+'');
return}
$(messageSelector).html('');
if(page==='cart'){
var updateButton=$('button[name="update_cart"]');
if(updateButton.length){
updateButton.prop('disabled',!1).trigger('click');
}else{
$(document.body).trigger('wc_fragment_refresh');
window.location.reload()}}
if(page==='checkout'){
$(document.body).trigger('update_checkout')}
},
error:function(){
$(messageSelector).html(''+'Connection error. Please try again.'+'')}
})}
$(document).on('change','#cc_cart_delivery_area',function(){
var area=$(this).val();
ccUpdateDisplay('#cc_cart_delivery_area','#cc-cart-delivery-price');
ccSaveDeliveryArea(area,'cart');
});
$(document).on('change','#cc_delivery_area',function(){
var area=$(this).val();
ccUpdateDisplay('#cc_delivery_area','#cc-checkout-delivery-price');
ccSaveDeliveryArea(area,'checkout');
});
if($('#cc_cart_delivery_area').length){
ccUpdateDisplay('#cc_cart_delivery_area','#cc-cart-delivery-price')}
if($('#cc_delivery_area').length){
ccUpdateDisplay('#cc_delivery_area','#cc-checkout-delivery-price')}
$(document.body).on('updated_checkout',function(){
if($('#cc_delivery_area').length){
ccUpdateDisplay('#cc_delivery_area','#cc-checkout-delivery-price')}});
$(document.body).on('updated_wc_div',function(){
if($('#cc_cart_delivery_area').length){
ccUpdateDisplay('#cc_cart_delivery_area','#cc-cart-delivery-price')}});
});
get_meta(
‘_cc_delivery_area’
);
$delivery_charge = $order->get_meta(
‘_cc_delivery_charge’
);
/*
* If delivery information was not saved,
* don’t display the box.
*/
if (
empty( $delivery_area ) &&
” === $delivery_charge
) {
return;
}
?>
Delivery Details
Delivery Area:
Delivery Charges:
PKR





Reviews
There are no reviews yet.