Last active
September 17, 2018 17:02
-
-
Save steveclason/83775ea65efffa01fff1b1b38bf51eed to your computer and use it in GitHub Desktop.
Woocommerce Enable/Disable Shipping Methods
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Shipping Methods Display | |
* | |
* In 2.1 we show methods per package. This allows for multiple methods per order if so desired. | |
* | |
* This template can be overridden by copying it to yourtheme/woocommerce/cart/cart-shipping.php. | |
* | |
* HOWEVER, on occasion WooCommerce will need to update template files and you | |
* (the theme developer) will need to copy the new files to your theme to | |
* maintain compatibility. We try to do this as little as possible, but it does | |
* happen. When this occurs the version of the template file will be bumped and | |
* the readme will list any important changes. | |
* | |
* @see https://docs.woocommerce.com/document/template-structure/ | |
* @author WooThemes | |
* @package WooCommerce/Templates | |
* @version 3.2.0 | |
*/ | |
if ( ! defined( 'ABSPATH' ) ) { | |
exit; | |
} | |
?> | |
<?php | |
/** | |
* Function to determine if the order includes a particular product. If so then Flat_Rate will | |
* be the only avialable shipping method for all packages and if not then Flat_Rate will not be a | |
* shipping method for any packages. | |
* | |
* Filtering woocommerce_package_rates() would be preferable but the array of rates are stored as | |
* a session variable AFTER that action so if the cart contents change the aviable shipping methods | |
* and rates aren't recalculated. | |
*/ | |
function has_lamps() { | |
$has_lamps = -1; | |
// loop through the cart | |
$cart = WC() -> cart -> get_cart(); | |
foreach ( $cart as $cart_key => $cart_values ) { | |
$product = $cart_values['product_id']; | |
// If cart contains a UPS lamp set a flag. | |
if( $product === 779 ) { | |
$has_lamps = 1; | |
} | |
} | |
return $has_lamps; | |
} | |
/* | |
* Use this dump to find out the key for the shipping method you want to disable, like 'flat_rate:7', slug:id. | |
*/ | |
// echo '<pre>'; | |
// echo 'available_methods:<br/>'; | |
// print_r( $available_methods ); | |
// echo '</pre>'; | |
if ( has_lamps() === 1 ) { | |
// If the cart contains lamps then make Flat_Rate the shipping method. | |
// Make a new array and populate it with one element. | |
$flat_rate = $available_methods[ 'flat_rate:7' ]; | |
$available_methods = array(); | |
$available_methods[ 'flat_rate:7' ] = $flat_rate; | |
} else { | |
// If cart does not contain a UPS lamp, disable flat_rate shipping. | |
// Convoluted because array_splice seems to require a numeric index. | |
$needle = 'flat_rate:7'; | |
// Get the numeric key for the flat rate shipping method and delete it. | |
$rate_keys = array_keys( $available_methods ); | |
$search_key = array_search( $needle, $rate_keys, false ); | |
array_splice( $available_methods, $search_key, 1 ); | |
} | |
?> | |
<tr class="shipping"> | |
<th><?php echo wp_kses_post( $package_name ); ?></th> | |
<td data-title="<?php echo esc_attr( $package_name ); ?>"> | |
<?php if ( 1 < count( $available_methods ) ) : ?> | |
<ul id="shipping_method"> | |
<?php foreach ( $available_methods as $method ) : ?> | |
<li> | |
<?php | |
printf( '<input type="radio" name="shipping_method[%1$d]" data-index="%1$d" id="shipping_method_%1$d_%2$s" value="%3$s" class="shipping_method" %4$s /> | |
<label for="shipping_method_%1$d_%2$s">%5$s</label>', | |
$index, sanitize_title( $method->id ), esc_attr( $method->id ), checked( $method->id, $chosen_method, false ), wc_cart_totals_shipping_method_label( $method ) ); | |
do_action( 'woocommerce_after_shipping_rate', $method, $index ); | |
?> | |
</li> | |
<?php endforeach; ?> | |
</ul> | |
<?php elseif ( 1 === count( $available_methods ) ) : ?> | |
<?php | |
$method = current( $available_methods ); | |
printf( '%3$s <input type="hidden" name="shipping_method[%1$d]" data-index="%1$d" id="shipping_method_%1$d" value="%2$s" class="shipping_method" />', $index, esc_attr( $method->id ), wc_cart_totals_shipping_method_label( $method ) ); | |
do_action( 'woocommerce_after_shipping_rate', $method, $index ); | |
?> | |
<?php elseif ( WC()->customer->has_calculated_shipping() ) : ?> | |
<?php | |
if ( is_cart() ) { | |
echo apply_filters( 'woocommerce_cart_no_shipping_available_html', wpautop( __( 'There are no shipping methods available. Please ensure that your address has been entered correctly, or contact us if you need any help.', 'woocommerce' ) ) ); | |
} else { | |
echo apply_filters( 'woocommerce_no_shipping_available_html', wpautop( __( 'There are no shipping methods available. Please ensure that your address has been entered correctly, or contact us if you need any help.', 'woocommerce' ) ) ); | |
} | |
?> | |
<?php elseif ( ! is_cart() ) : ?> | |
<?php echo wpautop( __( 'Enter your full address to see shipping costs.', 'woocommerce' ) ); ?> | |
<?php endif; ?> | |
<?php if ( $show_package_details ) : ?> | |
<?php echo '<p class="woocommerce-shipping-contents"><small>' . esc_html( $package_details ) . '</small></p>'; ?> | |
<?php endif; ?> | |
<?php if ( ! empty( $show_shipping_calculator ) ) : ?> | |
<?php woocommerce_shipping_calculator(); ?> | |
<?php endif; ?> | |
</td> | |
</tr> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment