Skip to content

Instantly share code, notes, and snippets.

@igorbenic
Created May 26, 2023 15:09
Show Gist options
  • Save igorbenic/277cf5095e77d00e30101d5768b9884e to your computer and use it in GitHub Desktop.
Save igorbenic/277cf5095e77d00e30101d5768b9884e to your computer and use it in GitHub Desktop.

Revisions

  1. igorbenic created this gist May 26, 2023.
    29 changes: 29 additions & 0 deletions checkout-1.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,29 @@
    jQuery( function( $ ) {

    var cities = wc_city_dropdown.cities;
    wrapper_selectors = '.woocommerce-billing-fields,' +
    '.woocommerce-shipping-fields,' +
    '.woocommerce-address-fields';

    $( document.body ).on( 'change refresh', 'select.country_to_state, input.country_to_state', function() {
    var $wrapper = $( this ).closest( wrapper_selectors );

    if ( ! $wrapper.length ) {
    $wrapper = $( this ).closest('.form-row').parent();
    }


    var country = $( this ).val(),
    $citybox = $wrapper.find( '#billing_city, #shipping_city' ),
    $parent = $citybox.closest( '.form-row' ),
    input_name = $citybox.attr( 'name' ),
    input_id = $citybox.attr('id'),
    input_classes = $citybox.attr('data-input-classes'),
    value = $citybox.val(),
    placeholder = $citybox.attr( 'placeholder' ) || $citybox.attr( 'data-placeholder' ) || '',
    $newcity;

    // next code here
    });

    })
    76 changes: 76 additions & 0 deletions checkout-2.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,76 @@
    jQuery( function( $ ) {

    var cities = wc_city_dropdown.cities;
    wrapper_selectors = '.woocommerce-billing-fields,' +
    '.woocommerce-shipping-fields,' +
    '.woocommerce-address-fields';

    $( document.body ).on( 'change refresh', 'select.country_to_state, input.country_to_state', function() {
    // ... previous code

    // If we have cities for a country, let's create a dropdown
    // In case we have a country defined here, but no cities at all, we'll add a hidden field.
    if ( cities[ country ] ) {
    if ( $.isEmptyObject( cities[ country ] ) ) {
    $newcity = $( '<input type="hidden" />' )
    .prop( 'id', input_id )
    .prop( 'name', input_name )
    .prop( 'placeholder', placeholder )
    .attr( 'data-input-classes', input_classes )
    .addClass( 'hidden ' + input_classes );
    $parent.hide().find( '.select2-container' ).remove();
    $citybox.replaceWith( $newcity );
    $( document.body ).trigger( 'country_to_city_changed', [ country, $wrapper ] );
    } else {
    var city = cities[country],
    $defaultOption = $('<option value=""></option>').text('Select a City');

    if (!placeholder) {
    placeholder = 'Select a City';
    }

    $parent.show();

    if ($citybox.is('input')) {
    $newcity = $('<select></select>')
    .prop('id', input_id)
    .prop('name', input_name)
    .data('placeholder', placeholder)
    .attr('data-input-classes', input_classes)
    .addClass('state_select ' + input_classes);
    $citybox.replaceWith($newcity);
    $citybox = $wrapper.find('#billing_city, #shipping_city');
    }

    $citybox.empty().append($defaultOption);

    $.each(city, function (index) {
    var $option = $('<option></option>')
    .prop('value', index)
    .text(city[index]);
    $citybox.append($option);
    });

    $citybox.val(value).trigger('change');

    $( document.body ).trigger( 'country_to_city_changed', [country, $wrapper ] );
    }
    } else {
    // No cities found and no country found? Create a regular text input field.
    if ( $citybox.is( 'select, input[type="hidden"]' ) ) {
    $newcity = $( '<input type="text" />' )
    .prop( 'id', input_id )
    .prop( 'name', input_name )
    .prop('placeholder', placeholder)
    .attr('data-input-classes', input_classes )
    .addClass( 'input-text ' + input_classes );
    $parent.show().find( '.select2-container' ).remove();
    $citybox.replaceWith( $newcity );
    $( document.body ).trigger( 'country_to_city_changed', [country, $wrapper ] );
    }
    }

    $( document.body ).trigger( 'country_to_city_changing', [country, $wrapper ] );
    });

    })
    88 changes: 88 additions & 0 deletions checkout.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,88 @@
    jQuery( function( $ ) {

    var cities = wc_city_dropdown.cities;
    wrapper_selectors = '.woocommerce-billing-fields,' +
    '.woocommerce-shipping-fields,' +
    '.woocommerce-address-fields';

    $( document.body ).on( 'change refresh', 'select.country_to_state, input.country_to_state', function() {
    var $wrapper = $( this ).closest( wrapper_selectors );

    if ( ! $wrapper.length ) {
    $wrapper = $( this ).closest('.form-row').parent();
    }


    var country = $( this ).val(),
    $citybox = $wrapper.find( '#billing_city, #shipping_city' ),
    $parent = $citybox.closest( '.form-row' ),
    input_name = $citybox.attr( 'name' ),
    input_id = $citybox.attr('id'),
    input_classes = $citybox.attr('data-input-classes'),
    value = $citybox.val(),
    placeholder = $citybox.attr( 'placeholder' ) || $citybox.attr( 'data-placeholder' ) || '',
    $newcity;

    if ( cities[ country ] ) {
    if ( $.isEmptyObject( cities[ country ] ) ) {
    $newcity = $( '<input type="hidden" />' )
    .prop( 'id', input_id )
    .prop( 'name', input_name )
    .prop( 'placeholder', placeholder )
    .attr( 'data-input-classes', input_classes )
    .addClass( 'hidden ' + input_classes );
    $parent.hide().find( '.select2-container' ).remove();
    $citybox.replaceWith( $newcity );
    $( document.body ).trigger( 'country_to_city_changed', [ country, $wrapper ] );
    } else {
    var city = cities[country],
    $defaultOption = $('<option value=""></option>').text('Select a City');

    if (!placeholder) {
    placeholder = 'Select a City';
    }

    $parent.show();

    if ($citybox.is('input')) {
    $newcity = $('<select></select>')
    .prop('id', input_id)
    .prop('name', input_name)
    .data('placeholder', placeholder)
    .attr('data-input-classes', input_classes)
    .addClass('state_select ' + input_classes);
    $citybox.replaceWith($newcity);
    $citybox = $wrapper.find('#billing_city, #shipping_city');
    }

    $citybox.empty().append($defaultOption);

    $.each(city, function (index) {
    var $option = $('<option></option>')
    .prop('value', index)
    .text(city[index]);
    $citybox.append($option);
    });

    $citybox.val(value).trigger('change');

    $( document.body ).trigger( 'country_to_city_changed', [country, $wrapper ] );
    }
    } else {
    if ( $citybox.is( 'select, input[type="hidden"]' ) ) {
    $newcity = $( '<input type="text" />' )
    .prop( 'id', input_id )
    .prop( 'name', input_name )
    .prop('placeholder', placeholder)
    .attr('data-input-classes', input_classes )
    .addClass( 'input-text ' + input_classes );
    $parent.show().find( '.select2-container' ).remove();
    $citybox.replaceWith( $newcity );
    $( document.body ).trigger( 'country_to_city_changed', [country, $wrapper ] );
    }
    }

    $( document.body ).trigger( 'country_to_city_changing', [country, $wrapper ] );
    });

    })
    21 changes: 21 additions & 0 deletions enqueue.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,21 @@
    function myplugin_enqueue() {
    if ( ! function_exists( 'is_checkout' ) ) {
    return;
    }

    if ( ! is_checkout() ) {
    return;
    }

    wp_enqueue_script(
    'wc-city-dropdown',
    trailingslashit( plugin_dir_url( __FILE__ ) ) . 'assets/checkout.js',
    [ 'jquery' ],
    filemtime( trailingslashit( plugin_dir_path( __FILE__ ) ) . 'assets/checkout.js' ),
    true
    );

    wp_localize_script( 'wc-city-dropdown', 'wc_city_dropdown', [
    'cities' => myplugin_get_cities()
    ]);
    }
    14 changes: 14 additions & 0 deletions get_cities.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,14 @@
    function myplugin_get_cities() {
    $cities = [
    'US' => [
    'New York' => 'New York',
    'Texas' => 'Texas',
    ],
    'IT' => [
    'Rome' => 'Rome',
    'Venezia' => 'Venezia',
    ]
    ];

    return $cities;
    }