Skip to content

Instantly share code, notes, and snippets.

@steveclason
Last active September 17, 2018 17:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save steveclason/83775ea65efffa01fff1b1b38bf51eed to your computer and use it in GitHub Desktop.
Save steveclason/83775ea65efffa01fff1b1b38bf51eed to your computer and use it in GitHub Desktop.
Woocommerce Enable/Disable Shipping Methods
<?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