WordPress设置验证消息显示两次

rfbsl7qr  于 2024-01-06  发布在  WordPress
关注(0)|答案(2)|浏览(127)

我为我的WordPress插件添加了一个非常基本的(我觉得)设置页面验证的实现,它确实工作,但错误消息显示了两次。我通过我的代码和add_settings_error的调用只执行了一次。

<?php

class Example_plugin_Settings {
    private $example_plugin_settings_options;
    private $settings_options_name;

    public function __construct() {
        add_action( 'admin_menu', array( $this, 'example_plugin_settings_add_plugin_page' ) );
        add_action( 'admin_init', array( $this, 'example_plugin_settings_page_init' ) );
        $this->settings_options_name = 'example_plugin_options';
    }

    public function example_plugin_settings_add_plugin_page() {
        add_options_page(
            'Example-Plugin Connector Settings', // page_title
            'Example-Plugin', // menu_title
            'manage_options', // capability
            'example-plugin-connector-settings', // menu_slug
            array( $this, 'example_plugin_settings_create_admin_page' ) // function
        );
    }

    public function example_plugin_settings_create_admin_page() {
        $this->example_plugin_settings_options = get_option( 'example_plugin_options' ); ?>

        <div class="wrap">
            <h2>Example-Plugin Connector Settings</h2>
            <p>Set up additional portals/currencies to be used with WooCommerce Currency Switcher (WOOCS).  Enter a comma-delimited list of portals, then the corresponding comma-delimited list of currencies that those portals support.</p>
            <?php settings_errors(); ?>

            <form method="post" action="options.php">
                <?php
                settings_fields( 'example_plugin_settings_option_group' );
                do_settings_sections( 'example-plugin-connector-settings-admin' );
                submit_button();
                ?>
            </form>
        </div>
    <?php }

    public function example_plugin_settings_page_init() {
        register_setting(
            'example_plugin_settings_option_group', // option_group
            $this->settings_options_name, // option_name
            array( $this, 'example_plugin_settings_sanitize' ) // sanitize_callback
        );

        add_settings_section(
            'example_plugin_settings_setting_section', // id
            'Settings', // title
            array( $this, 'example_plugin_settings_section_info' ), // callback
            'example-plugin-connector-settings-admin' // page
        );

        add_settings_field(
            'portals', // id
            'Portals', // title
            array( $this, 'portals_callback' ), // callback
            'example-plugin-connector-settings-admin', // page
            'example_plugin_settings_setting_section' // section
        );

        add_settings_field(
            'currencies', // id
            'Currencies', // title
            array( $this, 'currencies_callback' ), // callback
            'example-plugin-connector-settings-admin', // page
            'example_plugin_settings_setting_section' // section
        );
    }

    public function example_plugin_settings_sanitize($input) {
        $sanitary_values = array();
        if ( isset( $input['portals'] ) ) {
            if ( '' == $input['portals'] ) {
                $input['portals'] = '';
                add_settings_error(
                    $this->settings_options_name,
                    'portals',
                    'Portals is a required field.',
                    'error'
                );
            } else {
                $sanitary_values['portals'] = sanitize_text_field( trim( $input['portals'] ) );
            }
        }

        if ( isset( $input['currencies'] ) ) {
            if ( '' == $input['currencies'] ) {
                $input['currencies'] = '';
                add_settings_error(
                    $this->settings_options_name,
                    'currencies',
                    'Currencies is a required field.',
                    'error'
                );
            } else {
                $sanitary_values['currencies'] = sanitize_text_field( trim( $input['currencies'] ) );
            }
        }

        return $sanitary_values;
    }

    public function example_plugin_settings_section_info() {

    }

    public function portals_callback() {
        printf(
            '<input class="regular-text" type="text" name="example_plugin_options[portals]" id="portals" value="%s">',
            isset( $this->example_plugin_settings_options['portals'] ) ? esc_attr( $this->example_plugin_settings_options['portals']) : ''
        );
    }

    public function currencies_callback() {
        printf(
            '<input class="regular-text" type="text" name="example_plugin_options[currencies]" id="currencies" value="%s">',
            isset( $this->example_plugin_settings_options['currencies'] ) ? esc_attr( $this->example_plugin_settings_options['currencies']) : ''
        );
    }

}
if ( is_admin() )
    $example_plugin_settings = new Example_plugin_Settings();

字符串


的数据

vdzxcuhz

vdzxcuhz1#

似乎问题是行<?php settings_errors(); ?> .我从WordPress Options Page Generator的基本代码,但也许代码是过时的,该行现在是多余的较新版本的WordPress?我不确定.

dldeef67

dldeef672#

这是因为WordPress已经在调用settings_errors(),所以你不需要再添加它。
需要注意的是,settings_errors()默认只包含在某些wp-admin页面中:设置下的所有内容似乎都包含它。
这是一个常见的问题。您可能会发现more information about it here
如果我们检查documentation for settings_errors(),我们会发现以下内容:
在提交基于设置API的设置页面后自动调用。应在验证register_setting()中定义的设置的回调函数期间添加错误。
这告诉我们,如果我们使用设置API来设置页面,我们不需要手动包含settings_errors(),因为它们已经在为我们调用它了。
换句话说,如果你在你的页面中使用register_setting(),你不需要使用settings_errors()。在这种情况下使用它会导致得到重复的管理员通知。这是,至少,在理论上。

相关问题