[WooCommerce UPS Shipping] This script allows you to specify products as "already packed". They will not be added to separate boxes, and will not be combined with other products.
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 | |
// This script allows you to specify products as "already packed". They will not be added to separate boxes, and will not be combined with other products. | |
// This is useful if you have products that are already packed and ready to ship that should not be put into another box. | |
// | |
// IMPORTANT: | |
// The plugin 'WooCommerce UPS Shipping' does not currently support the filter "woocommerce_shipping_ups_skip_packing". | |
// For now, you must manually edit the UPS plugin directly. The two edits are located below (for version 3.2.18): | |
// 1. https://gist.github.com/RadGH/ad8d8e599366a27c81bc84dd1f66aaa9 | |
// 2. https://gist.github.com/RadGH/b7b69f65bbeb7212083058d1d644b0c9 | |
// | |
// The rest of this script goes in your functions.php or similar location. | |
/** | |
* When the WooCommerce UPS Shipping Method is packing cart items into boxes, examine each eligible product and see if "Packed Separately" is enabled. | |
* When "Packed Separately" is enabled, the product's dimensions are used as a custom package size and the product is not combined in another package. | |
* If multiple quantity is specified, more than one package will be added. | |
* | |
* @param bool $skip | |
* @param string $cart_item_key | |
* @param array $cart_item_data | |
* @param string $dim_unit | |
* @param string $weight_unit | |
* @param WC_Boxpack $WC_Boxpack | |
* @param WC_Shipping_UPS $WC_Shipping_UPS | |
* | |
* @return mixed | |
*/ | |
function tt_ups_maybe_use_separate_package_for_product( $skip, $cart_item_key, $cart_item_data, $dim_unit, $weight_unit, $WC_Boxpack, $WC_Shipping_UPS ) { | |
if ( $skip ) return $skip; | |
// Get some cart item data | |
$product_id = $cart_item_data['product_id']; | |
$variation_id = $cart_item_data['variation_id']; | |
$quantity = max( 1, $cart_item_data['quantity'] ); | |
// Abort unless "_packed_separately" is enabled for the product (for variations, checks the parent product) | |
if ( ! get_post_meta( $product_id, '_packed_separately', true ) ) return $skip; | |
// Get dimensions and value for packing | |
$length = number_format( wc_get_dimension( $cart_item_data['data']->get_length(), strtolower( $dim_unit ) ), 2, '.', '' ); | |
$width = number_format( wc_get_dimension( $cart_item_data['data']->get_width(), strtolower( $dim_unit ) ), 2, '.', '' ); | |
$height = number_format( wc_get_dimension( $cart_item_data['data']->get_height(), strtolower( $dim_unit ) ), 2, '.', '' ); | |
$weight = number_format( wc_get_weight( $cart_item_data['data']->get_weight(), strtolower( $weight_unit ) ), 2, '.', '' ); | |
$value = $cart_item_data['data']->get_price(); | |
// Add a box (or multiple boxes if qty more than 1) | |
for ( $i = 1; $i <= $quantity; $i++ ) { | |
$WC_Boxpack->add_package( $length, $width, $height, $weight, $value ); | |
// Report some debugging info | |
$WC_Shipping_UPS->debug( '['. $i .'] Self-packed item added:<br><pre>' . print_r(array('product_id' => $product_id, 'variation_id' => $variation_id, 'length' => $length, 'width' => $width, 'height' => $height, 'weight' => $weight, 'value' => $value), true) ); | |
} | |
return true; | |
} | |
add_filter( 'woocommerce_shipping_ups_skip_packing', 'tt_ups_maybe_use_separate_package_for_product', 10, 7 ); | |
/** | |
* Add a checkbox below Dimensions on shipping tab of products to allow enabling the "Packed Separately" option. | |
*/ | |
function tt_packed_separately_field() { | |
global $post; | |
// Display checkbox below dimensions field | |
woocommerce_wp_checkbox( | |
array( | |
'id' => '_packed_separately', | |
'wrapper_class' => 'show_if_simple show_if_variable hide_if_external hide_if_grouped hide_if_virtual', | |
'label' => __( 'Packed Separately', 'terratech' ), | |
'description' => __( 'Product is already boxed and should not be packed with other products (UPS Only).', 'terratech' ) | |
) | |
); | |
} | |
add_action( 'woocommerce_product_options_dimensions', 'tt_packed_separately_field' ); | |
/** | |
* Save "_packed_separately" metadata to the product | |
* | |
* @param $post_id | |
*/ | |
function tt_save_packed_separately_field( $post_id ) { | |
$checked = isset( $_POST['_packed_separately'] ) ? 'yes': ''; | |
update_post_meta( $post_id, '_packed_separately', $checked ); | |
} | |
add_action( 'woocommerce_process_product_meta', 'tt_save_packed_separately_field' ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment