Skip to content

Instantly share code, notes, and snippets.

@corsonr
Last active September 14, 2018 09:02
Show Gist options
  • Save corsonr/d00d72d6f248452e43e3e4af7521f7fe to your computer and use it in GitHub Desktop.
Save corsonr/d00d72d6f248452e43e3e4af7521f7fe to your computer and use it in GitHub Desktop.
WooCommerce: set price to zero
<?php
function make_it_free() {
echo '<table class="variations" cellspacing="0">
<tbody>
<tr>
<td class="label"><label>Make this free!</label></td>
<td class="value">
<label><input type="checkbox" name="option_free" value="YES" /> Set price to zero</label>
</td>
</tr>
</tbody>
</table>';
}
add_action( 'woocommerce_before_add_to_cart_button', 'make_it_free' );
function save_make_it_free( $cart_item_data, $product_id ) {
if( isset( $_POST['option_free'] ) && $_POST['option_free'] === 'YES' ) {
$cart_item_data[ "is_free" ] = "YES";
}
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'save_make_it_free', 99, 2 );
function calculate_make_it_free( $cart_object ) {
if( !WC()->session->__isset( "reload_checkout" )) {
foreach ( WC()->cart->get_cart() as $key => $value ) {
if( isset( $value["is_free"] ) ) {
if( method_exists( $value['data'], "set_price" ) ) {
/* Woocommerce 3.0 + */
$value['data']->set_price( 0 );
} else {
/* Version before 3.0 */
$value['data']->price = ( 0 );
}
}
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_make_it_free', 99 );
function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
$meta_items = array();
/* Woo 2.4.2 updates */
if( !empty( $cart_data ) ) {
$meta_items = $cart_data;
}
if( isset( $cart_item["is_free"] ) ) {
$meta_items[] = array( "name" => "Make it free", "value" => "Yes" );
}
return $meta_items;
}
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 99, 2 );
function make_it_free_order_meta_handler( $item_id, $values, $cart_item_key ) {
if( isset( $values["is_free"] ) ) {
wc_add_order_item_meta( $item_id, "Make it free", 'YES' );
}
}
add_action( 'woocommerce_add_order_item_meta', 'make_it_free_order_meta_handler', 99, 3 );
@corsonr
Copy link
Author

corsonr commented Sep 14, 2018

Textarea version:

<?php
function make_it_free() {
    echo '<table class="variations" cellspacing="0">
            <tbody>
                <tr>
                    <td class="label"><label>Make this free!</label></td>
                    <td class="value">
                        <textarea name="option_free"></textarea>
                    </td>
                </tr>
            </tbody>
        </table>';
}
add_action( 'woocommerce_before_add_to_cart_button', 'make_it_free' );

function save_make_it_free( $cart_item_data, $product_id ) {

    if( isset( $_POST['option_free'] ) && $_POST['option_free'] !== '' ) {
        $cart_item_data[ "is_free" ] = $_POST['option_free'];
    }
    return $cart_item_data;

}
add_filter( 'woocommerce_add_cart_item_data', 'save_make_it_free', 99, 2 );

function calculate_make_it_free( $cart_object ) {
    if( !WC()->session->__isset( "reload_checkout" )) {
        foreach ( WC()->cart->get_cart() as $key => $value ) {
            if( isset( $value["is_free"] ) ) {
                if( method_exists( $value['data'], "set_price" ) ) {
                    /* Woocommerce 3.0 + */
                    $value['data']->set_price( 0 );
                } else {
                    /* Version before 3.0 */
                    $value['data']->price = ( 0 );
                }
            }
        }
    }
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_make_it_free', 99 );

function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
    $meta_items = array();
    /* Woo 2.4.2 updates */
    if( !empty( $cart_data ) ) {
        $meta_items = $cart_data;
    }
    if( isset( $cart_item["is_free"] ) ) {
        $meta_items[] = array( "name" => "Make it free", "value" => $cart_item["is_free"] );
    }
    return $meta_items;
}
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 99, 2 );

function make_it_free_order_meta_handler( $item_id, $values, $cart_item_key ) {
    if( isset( $values["is_free"] ) ) {
        wc_add_order_item_meta( $item_id, "Make it free", $values["is_free"] );
    }
}
add_action( 'woocommerce_add_order_item_meta', 'make_it_free_order_meta_handler', 99, 3 );

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment