Store a dynamic value for a custom Woocommerce plugin

Обновить

November 2018

Просмотры

128 раз

2

пример

Я читал различные статьи, но они описывают несколько других вещей. Я не хочу , чтобы сделать неправильный код слишком много места. В модуле будет один единственное значение , которое может быть изменено в панели администратора и других посторонних функций. Как правильно создать базу данных для значения этого окна в плагине? Я нашел в документации , но у меня нет достаточно опыта , чтобы сократить избыток, если она есть.

Мой код /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 }

2 ответы

1

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.

1

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 bellow, 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.