WordPress Plugin WooCommerce, Custom Payment Gateway Settings Not Saving

I’m working on a custom payment gateway for the WordPress plugin WooCommerce. I cannot seem to save the settings for the payment gateway. When I enter information into the fields and then click save, the page refreshes with all of the fields blank. What am I doing wrong?

Here is my code.

Read More
<?php
/**
 * Plugin Name: Bitcoin WooCommerce Integration Made Easy
 * Description: A Bitcoin processing plugin that integrates into WooCommerce made specifically for Bitcoin Publish.
 * Version: 0.01
 * Author: Cammy_the_block
 */

add_action( 'plugins_loaded', 'init_your_gateway_class' );

function init_your_gateway_class() {
    class WC_Gateway_Your_Gateway extends WC_Payment_Gateway {
        function __construct() {
            $this->id = "Bitcoin WooCommerce Integration Gateway";
            $this->method_title = "Bitcoin with BWCIME";
            $this->method_description = "More later";

            $this->init_form_fields();
            $this->init_settings();

            if ( version_compare( WOOCOMMERCE_VERSION, '2.0.0', '>=' ) ) {
                    add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( &$this, 'process_admin_options' ) );
            } 
            else {
                    add_action( 'woocommerce_update_options_payment_gateways', array( &$this, 'process_admin_options' ) );
            }
        }
        function init_form_fields(){
            $this->form_fields = array(
                    'enabled' => array(
                            'title' => __( 'Enable/Disable', 'woocommerce' ),
                            'type' => 'checkbox',
                            'label' => __( 'Enable Cheque Payment', 'woocommerce' ),
                            'default' => 'yes'
                    ),
                    'title' => array(
                            'title' => __( 'Title', 'woocommerce' ),
                            'type' => 'text',
                            'description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce' ),
                            'default' => __( 'Cheque Payment', 'woocommerce' ),
                            'desc_tip' => true,
                    ),
                    'description' => array(
                            'title' => __( 'Customer Message', 'woocommerce' ),
                            'type' => 'textarea',
                            'default' => ''
                    )
            );
        }
    }
    function process_payment( $order_id ) {
        global $woocommerce;
        $order = new WC_Order( $order_id );
        $productArray = array();
        $x = 0;
        foreach( $order->get_items() as $item_id => $item ) {
            $productArray[x] = $order->get_product_from_item( $item );
            $x++;
        }

        // Mark as on-hold (we're awaiting the cheque)
        $order->update_status('on-hold', 
        __( 'Awaiting cheque payment. there are ' + $productArray.length + 'items', 'woocommerce' )
        );


        // Remove cart
        $woocommerce->cart->empty_cart();

        // Return thankyou redirect
        return array(
            'result' => 'success',
            'redirect' => $this->get_return_url( $order )
        );
    }
}
function add_your_gateway_class ($methods ) {
    $methods[] = 'WC_Gateway_Your_Gateway'; 
    return $methods;
}

add_filter( 'woocommerce_payment_gateways', 'add_your_gateway_class' );
 ?>

EDIT:

The add filter code runs add_your_gateway_class, which in turn causes it to run WC_Gateway_Your_Gateway.

Related posts

Leave a Reply

3 comments

  1. you have to call them on the constructor after the init_settings();

        $this->init_settings();
        // Define user set variables
        $this->access_key = $this->get_option( 'access_key' );
        $this->title = $this->get_option( 'title' );
        $this->description = $this->get_option( 'description' );
    

    edit:

    you also need another action/hook, just at the end of the constructor, no need to create that new function that you came up with:

                add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
    

    edit 2:

    sorry you already have it, my bad :p, dont realy know what happened there, glad its solved

  2. The actual problem is your this->id="example_gateway": id is always case sensitive and it should be without space and lowercase.

    Example:

    function __construct() { 
        $this->id = "bitcoin_woocommerce_integration_gateway"; 
        $this->method_title =( "Bitcoin with BWCIME", 'bitcoin_woocommerce_integration_gateway' );
        $this->title = __( "Bitcoin with BWCIME", 'bitcoin_woocommerce_integration_gateway' );
        $this->method_description = "More later";
    
        //further as same as your code..... 
    
    }
    
  3. I’m not completely sure how I fixed it, but I believe it had to do with adding the function admin_options().

     public function admin_options() {
     ?>
                <h3><?php _e('Bitcoin Payment', 'woothemes'); ?></h3>
                <p><?php _e('Message!.', 'woothemes'); ?></p>
                <table class="form-table">
                <?php
                    // Generate the HTML For the settings form.
                    $this->generate_settings_html();
                ?>
                </table>
                <?php
    } 
    

    EDIT: I’m not sure what causes it but you have to clear the plugin’s settings by interfacing with the database. The easy way to do this is to change the ID of the plugin. I’m not actually sure where the settings are stored in the database.