Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set Payment Gateway by change order from admin side in WooCommerce

please help! I'm trying to define Payment Gateway by changing order details from admin.

As a default option I want to use 'bacs' payment gateway. Customer make order and then I want to change order and turn payment method to custom 'payment2' gateway.

For this, I've made metabox with checkbox which should turn on/off 'payment2' method and unset default 'bacs'. Checkbox working properly.

But, I can't get it to work. First of all, I can't get post meta with checkbox value. Check code below please:

function show_payment2_payment_gateway( $available_gateways ) { 

    $use_payment2 = get_post_meta( $post->ID, 'use_payment2', true );    

    if($use_payment2 == "yes") {

    unset( $available_gateways['bacs'] );
    }  
    else {
        unset( $available_gateways['payment2'] );
    }

    return $available_gateways; 
}

add_filter( 'woocommerce_available_payment_gateways',    'show_payment2_payment_gateway', 10, 1 ); 

UPD

This is my code for backend checkbox. As I said it's working well and save meta value as 'yes'

//
//Adding Meta container admin shop_order pages
//
add_action( 'add_meta_boxes', 'mv_add_meta_boxes' );
if ( ! function_exists( 'mv_add_meta_boxes' ) )
{
    function mv_add_meta_boxes()
    {
        global $woocommerce, $order, $post;

        add_meta_box( 'mv_other_fields', __('PAYMENT2','woocommerce'),   'mv_add_other_fields_for_packaging', 'shop_order', 'side', 'core' );
    }
}


//
//adding Meta field in the meta container admin shop_order pages
//
if ( ! function_exists( 'mv_save_wc_order_other_fields' ) )
{
    function mv_add_other_fields_for_packaging()
    {
        global $woocommerce, $order, $post;

        $meta_field_data = get_post_meta( $post->ID, 'use_payment2', true );
        $meta_field_data_checked = $meta_field_data["use_payment2"][0];         

        if($meta_field_data == "yes") $meta_field_data_checked =  'checked="checked"';         

        echo '
        <label for="use_epay">TURN PAYMENT2 ON?</label>
        <input type="hidden" name="mv_other_meta_field_nonce" value="' .  wp_create_nonce() . '">
        <input type="checkbox" name="use_payment2" value="yes"  '.$meta_field_data_checked.'>';

    }
}

//
//Save the data of the Meta field
//
add_action( 'save_post', 'mv_save_wc_order_other_fields', 10, 1 );
if ( ! function_exists( 'mv_save_wc_order_other_fields' ) )
{

    function mv_save_wc_order_other_fields( $post_id ) {

        // We need to verify this with the proper authorization (security  stuff).

        // Check if our nonce is set.
        if ( ! isset( $_POST[ 'mv_other_meta_field_nonce' ] ) ) {
            return $post_id;
        }
        $nonce = $_REQUEST[ 'mv_other_meta_field_nonce' ];

        //Verify that the nonce is valid.
        if ( ! wp_verify_nonce( $nonce ) ) {
            return $post_id;
        }

        // If this is an autosave, our form has not been submitted, so we don't  want to do anything.
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
            return $post_id;
        }

        // Check the user's permissions.
        if ( 'page' == $_POST[ 'post_type' ] ) {

            if ( ! current_user_can( 'edit_page', $post_id ) ) {
                return $post_id;
            }
        } else {

            if ( ! current_user_can( 'edit_post', $post_id ) ) {
                return $post_id;
            }
        }
        // --- Its safe for us to save the data ! --- //

        // Sanitize user input  and update the meta field in the database.
        update_post_meta( $post_id, 'use_payment2', $_POST[ 'use_payment2' ] );
    }
}

UPD

This is working code for Back-End (custom checkbox metabox). It save checkbox value and change payment method in order details:

//
//Adding Meta container admin shop_order pages
//
add_action( 'add_meta_boxes', 'mv_add_meta_boxes' );
if ( ! function_exists( 'mv_add_meta_boxes' ) )
{
function mv_add_meta_boxes()
{
    global $woocommerce, $order, $post;

    add_meta_box( 'mv_other_fields', __('PAYMENT2','woocommerce'),   'mv_add_other_fields_for_packaging', 'shop_order', 'side', 'core' );
}
}



//
//adding Meta field in the meta container admin shop_order pages
//
if ( ! function_exists( 'mv_save_wc_order_other_fields' ) )
{
function mv_add_other_fields_for_packaging()
 {
    global $woocommerce, $order, $post;

    $meta_field_data = get_post_meta( $post->ID, 'use_payment2', true );    

    echo '<label for="use_payment2">USE PAYMENT2?</label>
          <input type="hidden" name="mv_other_meta_field_nonce" value="' .  wp_create_nonce() . '">';

    if($meta_field_data == "yes") {
        $meta_field_data_checked =  'checked="checked"';

    echo'<input type="checkbox" name="use_payment2" value="yes"  '.$meta_field_data_checked.'>';
}
    else {
    echo'<input type="checkbox" name="use_payment2" value="yes">';    
    }
 }
}

//Save the data of the Meta field
add_action( 'save_post', 'mv_save_wc_order_other_fields', 10, 1 );
if ( ! function_exists( 'mv_save_wc_order_other_fields' ) )
{

function mv_save_wc_order_other_fields( $post_id ) {

    // We need to verify this with the proper authorization (security  stuff).

    // Check if our nonce is set.
    if ( ! isset( $_POST[ 'mv_other_meta_field_nonce' ] ) ) {
        return $post_id;
    }
    $nonce = $_REQUEST[ 'mv_other_meta_field_nonce' ];

    //Verify that the nonce is valid.
    if ( ! wp_verify_nonce( $nonce ) ) {
        return $post_id;
    }

    // If this is an autosave, our form has not been submitted, so we don't  want to do anything.
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return $post_id;
    }

    // Check the user's permissions.
    if ( 'page' == $_POST[ 'post_type' ] ) {

        if ( ! current_user_can( 'edit_page', $post_id ) ) {
            return $post_id;
        }
    } else {

        if ( ! current_user_can( 'edit_post', $post_id ) ) {
            return $post_id;
        }
    }
    // --- Its safe for us to save the data ! --- //

    // Sanitize user input  and update the meta field in the database.
    $use_payment2 = sanitize_text_field($_POST[ 'use_payment2' ]);
    update_post_meta( $post_id, 'use_payment2', $use_payment2 );

    if($_POST[ 'use_payment2' ] == 'yes') {            
            update_post_meta( $post_id, '_payment_method', 'payment2' );
        }
        elseif (get_post_meta( $post_id, '_payment_method', true ) != 'bacs') {
                update_post_meta( $post_id, '_payment_method', 'bacs' );    
    }

  }
}

But, how I can use checkbox state on my front-end? I still can't get checkbox value using this code:

function show_payment2_payment_gateway( $available_gateways ) { 

global $woocommerce, $order, $post;

$payment_method = get_post_meta( $post_id, 'use_payment2', true );

if(isset($payment_method) == 'yes') {

unset( $available_gateways['bacs'] );

}
 else {

unset( $available_gateways['payment2'] );

}

return $available_gateways; 
}         

add_filter( 'woocommerce_available_payment_gateways', 'show_payment2_payment_gateway', 10, 1 );

Now, it's always showing Payment2 option even if checkbox is checked or unchecked.

like image 512
danibeiss Avatar asked Dec 03 '25 10:12

danibeiss


1 Answers

Update 2 related to your comments (and your question update)

The hook your are using is a front end hook (not admin), so it will not work.

To achieve what want, you need to replace some code inside the function that is going to save your custom checkbox value when you update the order in backend (Admin) edit order pages.

So your code will be now like this:

add_action( 'save_post', 'mv_save_wc_order_other_fields', 10, 1 );
if ( ! function_exists( 'mv_save_wc_order_other_fields' ) )
{

    function mv_save_wc_order_other_fields( $post_id ) {

        // We need to verify this with the proper authorization (security stuff).

        // Check if our nonce is set.
        if ( ! isset( $_POST[ 'mv_other_meta_field_nonce' ] ) )
            return $post_id;

        // Passing the value to a variable
        $nonce = $_REQUEST[ 'mv_other_meta_field_nonce' ];

        // If this is an autosave, our form has not been submitted, so we don't want to do anything.
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
            return $post_id;

        // Check the user's permissions.
        if ( 'page' == $_POST[ 'post_type' ] ) {
            if ( ! current_user_can( 'edit_page', $post_id ) )
                return $post_id;

        } else {
            if ( ! current_user_can( 'edit_post', $post_id ) )
                return $post_id;
        }

        // --- Its safe for us to save the data ! --- //

        // Sanitize user input and update the meta field in the database.
        $use_payment2 = sanitize_text_field($_POST[ 'use_payment2' ]);
        update_post_meta( $post_id, 'use_payment2', $use_payment2 );

        // Updating securely the data with your conditions
        if($use_payment2 == 'yes')
            update_post_meta( $post_id, '_payment_method', 'payment2' );
        else
            update_post_meta( $post_id, '_payment_method', 'bacs' );    
    }
}

This should work as you expect now…

Code goes in function.php file of your active child theme (or theme). Or also in any plugin php files.

As this code comme from one of my answers, you are not obliged to keep the same functions beginning names with "mv_" that was related to the username of the question. You can change it to "dan_" for example…


Reference: WooCommerce : Add custom Metabox to admin order page

like image 83
LoicTheAztec Avatar answered Dec 05 '25 00:12

LoicTheAztec



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!