API настроек: Два уведомления об обновлении после сохранения настроек?


Я использовал API настроек для создания очень простой страницы настроек плагина. Это мой первый раз, когда я использую API, и благодаря различным учебным пособиям в Интернете и ответам здесь, я думаю, что понял это. Это подтверждается тем фактом, что страница даже работает!!

Однако происходит что-то странное:

two notices regarding the saving of settings

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

Вот код:

public function __construct() {
    /* more stuff */

    add_action("admin_menu", array($this, "plugin_settings_menu_add");
    if($pagenow == "options.php" || $pagenow == "options-general.php") {
        add_action("admin_init", array($this, "plugin_settings_initialize");
    }
}

public function plugin_settings_menu_add() {
    add_options_page("Gallery Settings", "Galleries", "manage_options", "galleries-settings-page", array($this, "plugin_settings_menu_display"));
}

public function plugin_settings_menu_display() {
    require(plugin_dir_path(__FILE__) . "views/plugin-settings.php");
}

public function plugin_settings_permissions_to_use_default() {
    return apply_filters(
        "plugin_settings_permissions_to_use_default",
        array(
            "galleries-settings-permission-to-use-url" => ""
        )
    );
}

public function plugin_settings_initialize() {
    if(get_option("galleries-settings-permission-to-use") == false) {
        add_option("galleries-settings-permission-to-use", $this->plugin_settings_permissions_to_use_default());
    }

    add_settings_section(
        "galleries-settings-permission-to-use-section",                    // DOM ID for the section
        "Permission to Use Gallery Items",                                        // on-screen title for it
        array($this, "plugin_settings_permissions_to_use_header_display"),        // callback to display its header
        "galleries-settings-page"                                            // the menu page on which to show it
    );

    add_settings_field(
        "galleries-settings-permission-to-use-url",
        '<label for="galleries-settings-permission-to-use-url">Webtools Form (required)</label>',
        array($this, "plugin_settings_permissions_to_use_url_display"),
        "galleries-settings-page",
        "galleries-settings-permission-to-use-section"
    );

    register_setting(
        "galleries-settings-page",
        "galleries-settings-permission-to-use",
        array($this, "plugin_settings_permissions_to_use_sanitize")
    );
}

public function plugin_settings_permissions_to_use_header_display() {
    echo "<p>......</p>";
}

public function plugin_settings_permissions_to_use_url_display() {
    $settings = get_option("galleries-settings-permission-to-use");
    $value = isset($settings["galleries-settings-permission-to-use-url"])
        ? $settings["galleries-settings-permission-to-use-url"]
        : ""; ?>

    <input type="url" id="galleries-settings-permission-to-use-url"
        name="galleries-settings-permission-to-use[galleries-settings-permission-to-use-url]"
        value="<?=esc_url($value)?>" class="regular-text" required aria-required="true"><br>

    <em>Enter the full URL but without any query string parameters.</em>    
<? }

public function plugin_settings_permissions_to_use_sanitize($input) {
    $output = array();
    foreach($input as $key => $value) {
        // even though we have only one field here at the moment, we'll use a loop and a switch
        // to santize.  that way we're ready to go with respect to additional data that might one
        // day be sent here.  

        switch($key) {
        case "galleries-settings-permission-to-use-url":
            if(empty($value) || !filter_var($value, FILTER_VALIDATE_URL)) {
                add_setting_error("galleries-settings-permission-to-use-url",
                    "galleries-settings-permission-to-use-url-invalid",
                    "You must enter a valid web address."
                );
            } elseif(($qloc = strpos($value, "?"))!==false) $value = substr($value, 0, $qloc);
            break;
        }

        $output[$key] = $value;
    }

    return apply_filters("galleries_plugin_settings_permissions_to_use_sanitize", $output, $input);
}

Ниже приводится содержимое страницы plugin-settings.php, которая включена в приведенный выше код:

<div class="wrap">
    <div id="icon-options-general" class="icon32"></div>
    <h2>Gallery Settings</h2>

    <? settings_errors(); ?>

    <form method="post" action="options.php">
            <? settings_fields("galleries-settings-page"); ?>
            <? do_settings_sections("galleries-settings-page"); ?>
            <? submit_button(); ?>
    </form>
</div>

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

Author: David Kees, 2013-11-06

2 answers

Проблема, как определил Чип Беннетт в нашем разговоре выше, была связана со звонком settings_errors(). Проблема заключалась в том, что я не указал параметр, для которого я хотел бы отображать либо ошибки, либо уведомления об обновлении, в основном потому, что учебник, с которым я работал, тоже этого не делал. Указав этот параметр, я вижу одно единственное уведомление и ошибки, если это необходимо.

Спасибо, Чип, за помощь!

 1
Author: David Kees, 2013-11-07 12:53:01

Мы можем легко решить эту проблему, используя страницу параметров, например, settings_errors('page_slug'); Я не уверен, правильно это или неправильно, но для меня это хорошо сработало.

 1
Author: Mashiur Rahman, 2016-09-04 20:10:23