Store a dynamic value for a custom Woocommerce plugin

Example

I read different articles, but they describe more other things. I do not want to make the wrong code with too much space. In the module there will be one single value that can be changed in the admin panel and other extraneous functions. How correctly to create a database for value of this window in a plugin? I found the documentation, but I do not have enough experience to cut the excess, if it is.

My code /plugins/custom-counter/custom-counter.php

/*
Plugin Name: Custom Counter
Plugin URI: https://example.com
Description: This plugin adds counter.
Author: Kuznetsova Alexandra
Author URI: https://example.com
*/

// Hook for adding admin menus
add_action('admin_menu', 'custom_counter_menu');

// action function for above hook
function custom_counter_menu() {
    // Add a submenu to Woocommerce menu:
    add_submenu_page('woocommerce', 'Custom Counter', 'Custom Counter', 'administrator', 'custom-counter', 'custom_counter_page');
}

// custom_counter_page() displays the page content
function custom_counter_page() {
    ?>
    <div class="wrap">
        <h2>Custom Counter</h2>

        <form method="post" action="options.php">
            <?php settings_fields( 'baw-settings-group' ); ?>
            <table class="form-table">
                <tr valign="top">
                    <th scope="row">Total Counter</th>
                    <td><input type="text" name="custom-counter" value="..." /></td>
                </tr>
            </table>

            <p class="submit">
                <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
            </p>
        </form>
    </div>
<?php }

Upvotes: 2

Views: 471

Answers (2)

LoicTheAztec
LoicTheAztec

Reputation: 253784

Updated - As this is a unique value that will be updated multiple times, you can use the wp_options table with the following WordPress dedicated functions:

The fact that options are cached is not a problem if you use some tricks as you will see below, to avoid this data to be cached.

So try the following code:

// Add a custom admin submenu to Woocommerce
add_action('admin_menu', 'custom_counter_menu');
function custom_counter_menu() {
    add_submenu_page('woocommerce', 'Custom Counter', 'Custom Counter', 'administrator', 'custom-counter', 'custom_counter_page');
}

// Content for the custom Woocommerce admin submenu
function custom_counter_page() {
    $option_name = 'wc-custom-counter' ;
    if( isset($_POST[$option_name]) ){
        $new_value = sanitize_text_field( $_POST[$option_name] );
        if ( get_option( $option_name ) !== false ) {
            update_option($option_name, $new_value );
        } else {
            add_option( $option_name, $new_value, null, 'no' );
        }
    }
    $default = ''; // Set the default value
    $value = get_option( $option_name ) ? get_option( $option_name ) : $default;
    ?>
    <div class="wrap">
        <h2><?php _e('Custom Counter'); ?></h2>
        <form method="post" action="">
            <?php settings_fields( 'baw-settings-group' ); ?>
            <table class="form-table">
                <tr valign="top">
                    <th scope="row"><?php _e('Total Counter'); ?></th>
                    <td><input type="text" name="<?php echo $option_name; ?>" value="<?php echo $value; ?>" /></td>
                </tr>
            </table>
            <p class="submit">
                <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
            </p>
        </form>
    </div>
    <?php 
}

Code goes in function.php file of the active child theme (or active theme). tested and work.

If the option already exist, to avoid caching issue, you should need to delete it using:

delete_option('wc-custom-counter');

And adding it in your function.php file. Then browse any page of your web site and remove it.

Upvotes: 1

Derek Nolan
Derek Nolan

Reputation: 744

If you only want to store one thing, like a setting, then you can use wp_options. You can then use WordPress functions to interact with the database instead of writing your own SQL.

Upvotes: 1

Related Questions