Woocommerce

Cómo insertar la calculadora de envío en la ficha de producto

4 Genial hay muchos Likes :D

Para activar esta funcionalidad en tu instalación de WooCommerce sólo tienes que añadir el siguiente código en tu plugin de funciones:

// Shortcode calculadora de envíos

global $shortcode_times;
add_action( 'wp', 'mk_woo_shipping_calculator_ajax' );

function mk_woo_shipping_calculator_ajax() {

    if( $_POST["action"] != "mk_woo_shipping_calculator")
        return false;

    $result = array();

    try {

        WC()->shipping->load_shipping_methods();
        WC()->shipping->reset_shipping();
        $country  = wc_clean( $_POST['country'] );
        $state    = wc_clean( isset( $_POST['state'] ) ? $_POST['state'] : '' );
        $postcode = apply_filters( 'woocommerce_shipping_calculator_enable_postcode', true ) ? wc_clean( $_POST['postcode'] ) : '';
        $city     = apply_filters( 'woocommerce_shipping_calculator_enable_city', false ) ? wc_clean( $_POST['city'] ) : '';

        if ( $postcode && ! WC_Validation::is_postcode( $postcode, $country ) ) {
            throw new Exception( __( 'Please enter a valid postcode / ZIP.', 'woocommerce' ) );
        } elseif ( $postcode ) {
            $postcode = wc_format_postcode( $postcode, $country );
        }

        if ( $country ) {

            WC()->customer->set_location( $country, $state, $postcode, $city );
            WC()->customer->set_shipping_location( $country, $state, $postcode, $city );
        } else {
            WC()->customer->set_to_base();
            WC()->customer->set_shipping_to_base();
        }

        WC()->customer->set_calculated_shipping( true );
        WC()->customer->save();

        do_action( 'woocommerce_calculated_shipping' );

        $cu = get_woocommerce_currency_symbol();
        WC()->shipping->calculate_shipping( WC()->cart->get_shipping_packages() );
	$packages = WC()->shipping->get_packages();

        if(count($packages ) > 0){
            $result["result"] = 1;
            $message = "<ul>";
            foreach ( $packages as $i => $package ) {
                if(count($package['rates']) > 0){
                    foreach($package['rates'] as $k => $v){
                        $message .= "<center><h4><strong>".$v->label." - ".$v->cost." ".$cu."</strong></h4></center>";
                    }
                }
            }
            $result["message"] = $message ;
        }
    } catch ( Exception $e ) {

        $result["result"] = 0;
        $result["message"] = $e->getMessage() ;
    }

    echo json_encode($result);
    die();
}

function mk_woo_shipping_calculator_shortcode() {
    global $shortcode_times;
    $shortcode_times++;

    if($shortcode_times > 1){
        return "";
    }

    wp_enqueue_script(  'wc-cart' );
    ob_start();

    do_action( 'woocommerce_before_shipping_calculator' );
?>

<form>

	<section class="shipping-calculator-form-shortcode" >

		<p class="form-row form-row-wide" id="calc_shipping_country_field">
			<select name="calc_shipping_country" id="calc_shipping_country" class="country_to_state" rel="calc_shipping_state">
				<option value=""><?php _e( 'Select a country&hellip;', 'woocommerce' ); ?></option>
				<?php
					foreach ( WC()->countries->get_shipping_countries() as $key => $value )
						echo '<option value="' . esc_attr( $key ) . '"' . selected( WC()->customer->get_shipping_country(), esc_attr( $key ), false ) . '>' . esc_html( $value ) . '</option>';
				?>
			</select>
		</p>

		<p class="form-row form-row-wide" id="calc_shipping_state_field">
			<?php
				$current_cc = WC()->customer->get_shipping_country();
				$current_r  = WC()->customer->get_shipping_state();
				$states     = WC()->countries->get_states( $current_cc );
				// Hidden Input
				if ( is_array( $states ) && empty( $states ) ) {
					?><input type="hidden" name="calc_shipping_state" id="calc_shipping_state" placeholder="<?php esc_attr_e( 'State / County', 'woocommerce' ); ?>" /><?php
				// Dropdown Input
				} elseif ( is_array( $states ) ) {
					?><span>
						<select name="calc_shipping_state" id="calc_shipping_state" placeholder="<?php esc_attr_e( 'State / County', 'woocommerce' ); ?>">
							<option value=""><?php esc_html_e( 'Select a state&hellip;', 'woocommerce' ); ?></option>
							<?php
								foreach ( $states as $ckey => $cvalue )
									echo '<option value="' . esc_attr( $ckey ) . '" ' . selected( $current_r, $ckey, false ) . '>' . esc_html( $cvalue ) . '</option>';
							?>
						</select>
					</span><?php
				// Standard Input
				} else {
					?><input type="text" class="input-text" value="<?php echo esc_attr( $current_r ); ?>" placeholder="<?php esc_attr_e( 'State / County', 'woocommerce' ); ?>" name="calc_shipping_state" id="calc_shipping_state" /><?php
				}
			?>
		</p>

		<?php if ( apply_filters( 'woocommerce_shipping_calculator_enable_city', false ) ) : ?>

			<p class="form-row form-row-wide" id="calc_shipping_city_field">
				<input type="text" class="input-text" value="<?php echo esc_attr( WC()->customer->get_shipping_city() ); ?>" placeholder="<?php esc_attr_e( 'City', 'woocommerce' ); ?>" name="calc_shipping_city" id="calc_shipping_city" />
			</p>

		<?php endif; ?>

		<?php if ( apply_filters( 'woocommerce_shipping_calculator_enable_postcode', true ) ) : ?>

			<p class="form-row form-row-wide" id="calc_shipping_postcode_field">
				<input type="text" class="input-text" value="<?php echo esc_attr( WC()->customer->get_shipping_postcode() ); ?>" placeholder="<?php esc_attr_e( 'Postcode / ZIP', 'woocommerce' ); ?>" name="calc_shipping_postcode" id="calc_shipping_postcode" />
			</p>

		<?php endif; ?>

		<p><button  value="1" class="button mk-woo-shipping-calculator"><?php _e( 'Update totals', 'woocommerce' ); ?></button><span id="mk-woo-shipping-calculator-loading" style="display:none"><img src='<?php echo plugins_url( '/files/default.gif', __FILE__ ) ?>' /></span></p>

		<?php wp_nonce_field( 'woocommerce-cart' ); ?>
                <div id="mk-woo-shipping-result">

                </div>
	</section>
</form>
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20type%3D%22text%2Fjavascript%22%3E%0Avar%20%24s%20%3D%20jQuery.noConflict()%3B%0A%24s(document).ready(function(%24)%20%7B%0A%20%20%20%20%24(%22.mk-woo-shipping-calculator%22).click(function()%7B%0A%20%20%20%20%20%20%20%20var%20ajaxurl%20%3D%20%22%3C%3Fphp%20echo%20admin_url('admin-ajax.php')%3B%20%3F%3E%22%3B%0A%20%20%20%20%20%20%20%20var%20country%20%3D%20%24(this).parent().parent().find(%22%23calc_shipping_country%22).val()%3B%0A%20%20%20%20%20%20%20%20var%20state%20%3D%20%24(this).parent().parent().find(%22%23calc_shipping_state%22).val()%3B%0A%20%20%20%20%20%20%20%20var%20city%20%3D%20%24(this).parent().parent().find(%22%23calc_shipping_city%22).val()%3B%0A%20%20%20%20%20%20%20%20var%20postcode%20%3D%20%24(this).parent().parent().find(%22%23calc_shipping_postcode%22).val()%3B%0A%20%20%20%20%20%20%20%20%24(%22%23mk-woo-shipping-calculator-loading%22).show()%3B%0A%20%20%20%20%20%20%20%20var%20data%20%3D%20%7B'action'%3A%20'mk_woo_shipping_calculator'%2C'country'%3A%20country%2C'state'%3A%20state%2C'city'%3A%20city%2C'postcode'%3A%20postcode%7D%3B%0A%20%20%20%20%20%20%20%20%24.post(%22%3C%3Fphp%20echo%20get_home_url()%3B%20%3F%3E%22%2C%20data%2C%20function(response)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24(%22%23mk-woo-shipping-calculator-loading%22).hide()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20JSON.parse(response)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(response.result%20%3D%3D%201)%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24(%22%23mk-woo-shipping-result%22).html(response.message)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7Delse%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert(response.message)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24(%22%23mk-woo-shipping-result%22).html(%22%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D)%3B%0A%7D)%3B%0A%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />
<?php
do_action( 'woocommerce_after_shipping_calculator' ); 

$out = ob_get_contents();
ob_end_clean();

return $out;

}
add_shortcode('calculadora-envio', 'mk_woo_shipping_calculator_shortcode');

Este snippet de código como tal, sólo crea el shortcode [calculadora-envio] para incrustar la calculadora de envío haya donde la necesites. Pero para incluirla en la ficha de producto, puedes seguir dos aproximaciones distintas:

Volver al listado