简体   繁体   English

WordPress自定义选项未保存

[英]Wordpress custom options not being saved

I'm having problems with adding a custom settings page for wordpress, and more specifically getting the options to save. 我在为wordpress添加自定义设置页面时遇到问题,更具体地说,是要获取保存的选项。

The documentation for this seems to be lacking and inconsistent, as different examples and different different functions explain the same thing differently. 由于不同的示例和不同的功能对同一事物的解释不同,因此此文档似乎缺乏而且前后不一致。

The newest example on the wordpress codex uses the sanitize callback function to save options. Wordpress Codex上的最新示例使用清理回调函数来保存选项。 But the add_settings_field() documentation says that saving the options should happen behind the scenes. 但是add_settings_field()文档说保存选项应该在幕后进行。 Seems wierd to use san callback to save anyways. 似乎更愿意使用san回调进行保存。

I have tried various different approaches, and at one time my code managed to save one of the fields but not all of them. 我尝试了各种不同的方法,但有一次我的代码设法保存了其中一个字段,但不是全部。

My current code: 我当前的代码:

class wwtkSettings {
    public function __construct() {
        if ( is_admin() ){
            add_action( 'admin_menu', array( $this, 'add_plugin_page' ) );
            add_action( 'admin_init', array( $this, 'page_init' ) );
        }
    }

    public function add_plugin_page(){
        add_options_page( 'WWTK Settings', 'WWTK settings', 'manage_options', 'wwtk-settings', array( $this, 'create_admin_page' ) );
    }

    public function create_admin_page() {
        ?>
        <div class="wrap">
            <?php screen_icon(); ?>
            <h2>WWTK Settings</h2>
            <form method="post" action="options.php">
                <?php
                settings_fields( 'wwtk-setting-group' );
                do_settings_sections( 'wwtk-settings' );
                ?>
                <?php submit_button(); ?>
            </form>
        </div>
        <?php
    }

    public function page_init() {
        register_setting( 'wwtk-setting-group', 'wwtk-setting-group', array( $this, 'wwtk_validate_options' ) );

        add_settings_section(
            'wwtk-settings-section',
            'Categories and pages',
            array( $this, 'print_section_info' ),
            'wwtk-settings'
            );  

        add_settings_field(
            'frontpage', 
            'Frontpage category:', 
            array( $this, 'create_category_field' ), 
            'wwtk-settings',
            'wwtk-settings-section',
            'frontpage'
            );
        add_settings_field(
            'category1', 
            'Category & page 1', 
            array( $this, 'create_category_field' ), 
            'wwtk-settings',
            'wwtk-settings-section',
            'category1'
            );
        add_settings_field(
            'category2', 
            'Category & page 2', 
            array( $this, 'create_category_field' ), 
            'wwtk-settings',
            'wwtk-settings-section',
            'category2'
            );
        add_settings_field(
            'category3', 
            'Category & page 3', 
            array( $this, 'create_category_field' ), 
            'wwtk-settings',
            'wwtk-settings-section',
            'category3'
            );
    }

    //TODO: check if category and page exist. and sanitize!
    public function wwtk_validate_options( $input ) {
        return $input;
    }

    public function print_section_info(){
        print 'Enter the names of categories that should be displayed on the page with the same name(both must exist):';
    }

    public function create_category_field($args){
        ?><input type="text" id="<?php echo $args ?>" name="wwtk-setting-group" value="<?php echo get_option( 'wwtk-setting-group['.$args.']' ); ?>" /><?php
    }
}
/* code similar to your example */

class MySettingsPage{
/**
 * Holds the values to be used in the fields callbacks
 */
private $options;

/**
 * Start up
 */
public function __construct()
{
    add_action( 'admin_menu', array( $this, 'add_plugin_page' ) );
    add_action( 'admin_init', array( $this, 'page_init' ) );
}

/**
 * Add options page
 */
public function add_plugin_page()
{
    // This page will be under "Settings"
    add_options_page(
        'Settings Admin', 
        'My Settings', 
        'manage_options', 
        'my-setting-admin', 
        array( $this, 'create_admin_page' )
    );
}

/**
 * Options page callback
 */
public function create_admin_page()
{
    // Set class property
    $this->options = get_option( 'my_option_name' );
    ?>
    <div class="wrap">
        <?php screen_icon(); ?>
        <h2>My Settings</h2>           
        <form method="post" action="options.php">
        <?php
            // This prints out all hidden setting fields
            settings_fields( 'my_option_group' );   
            do_settings_sections( 'my-setting-admin' );
            submit_button(); 
        ?>
        </form>
    </div>
    <?php
}

/**
 * Register and add settings
 */
public function page_init()
{        
    register_setting(
        'my_option_group', // Option group
        'my_option_name', // Option name
        array( $this, 'sanitize' ) // Sanitize
    );

    add_settings_section(
        'setting_section_id', // ID
        'My Custom Settings', // Title
        array( $this, 'print_section_info' ), // Callback
        'my-setting-admin' // Page
    );  

    add_settings_field(
        'id_number', // ID
        'ID Number', // Title 
        array( $this, 'id_number_callback' ), // Callback
        'my-setting-admin', // Page
        'setting_section_id' // Section           
    );      

    add_settings_field(
        'title', 
        'Title', 
        array( $this, 'title_callback' ), 
        'my-setting-admin', 
        'setting_section_id'
    );      
}

/**
 * Sanitize each setting field as needed
 *
 * @param array $input Contains all settings fields as array keys
 */
public function sanitize( $input )
{
    if( !is_numeric( $input['id_number'] ) )
        $input['id_number'] = '';  

    if( !empty( $input['title'] ) )
        $input['title'] = sanitize_text_field( $input['title'] );

    return $input;
}

/** 
 * Print the Section text
 */
public function print_section_info()
{
    print 'Enter your settings below:';
}

/** 
 * Get the settings option array and print one of its values
 */
public function id_number_callback()
{
    printf(
        '<input type="text" id="id_number" name="my_option_name[id_number]" value="%s" />',
        esc_attr( $this->options['id_number'])
    );
}

/** 
 * Get the settings option array and print one of its values
 */
 public function title_callback()
 {
    printf(
        '<input type="text" id="title" name="my_option_name[title]" value="%s" />',
        esc_attr( $this->options['title'])
    );
 }
}

if( is_admin() )
    $my_settings_page = new MySettingsPage();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM