从插件设置页面更新核心选项

时间:2021-01-04 作者:Sean

我正在尝试更新核心WordPress选项,image_default_link_type, 但WordPress拒绝更新它。插件本身注册的选项将更新。下面是一个简单的示例:

add_action( \'init\', \'wpse_register_plugin_settings\' );    
add_action( \'admin_menu\', \'wpse_add_plugin_admin_menu_entry\' );

/**
 * Register a plugin setting.
 */
function wpse_register_plugin_settings() {
    add_settings_field(
        \'my_plugin_settings\',
        __( \'Settings\', \'my-plugin\' ),
        \'wpse_display_settings_field\',
        \'my-plugin-admin-options\',
    );

    register_setting(
        \'my-plugin-admin-options\',
        \'my_plugin_setting\',
    );
}

/**
 * Callback function for the plugin settings section.
 */
function wpse_display_settings_field() {
    require_once plugin_dir_path( \'my-plugin\' ) . \'partials/admin/settings/section-display.php\';
}

/**
 * Add the settings page as an entry in the admin menu.
 */
function wpse_add_plugin_admin_menu_entry() {
    add_options_page(
        __( \'My Plugin Settings\', \'my-plugin\' ),
        __( \'My Plugin\', \'my-plugin\' ),
        \'manage_options\',
        \'my-plugin-setting-page-slug\',
        \'wpse_output_plugin_settings_page\'
    );
}

/**
 * Callback function for the plugin settings page.
 */
function wpse_output_plugin_settings_page() {
    // Check user has permissions.
    if ( ! current_user_can( \'manage_options\' ) ) {
        wp_die(
            \'<h1>\' . esc_html__( \'You need a higher level of permission.\', \'my-plugin\' ) . \'</h1>\' .
            \'<p>\' . esc_html__( \'Sorry, you are not allowed to use the plugin admin settings.\', \'my-plugin\' ) . \'</p>\',
            403
        );
    }

    require_once plugin_dir_path( \'my-plugin\' ) . \'partials/admin/settings/display.php\';
}
目录section-display.php:

<label for="my_plugin_setting">
    <input type="checkbox" name="my_plugin_setting" id="my_plugin_setting" value="1" <?php checked( get_option( \'my_plugin_setting\' ) ); ?> />
    <?php esc_html_e( \'Some setting\', \'my-plugin\' ); ?>
</label>
<br/>
<select name="image_default_link_type">
    <!-- some options -->
</select>
目录display.php:

<?php

/**
 * Plugin settings.
 */
?>
<div class="wrap">
    <h2><?php esc_html_e( \'My Plugin Settings\', \'my-plugin\' ); ?></h2>
    <div>
        <form method="post" action="options.php">
            <?php settings_fields( \'my-plugin-admin-options\' ); ?>
            <?php do_settings_sections( \'my-plugin-admin-options\' ); ?>
            <?php submit_button( esc_html__( \'Save Changes\' ) ); ?>
        </form>
    </div>
</div>
WordPress似乎正在阻止更新设置。如何通过插件的设置页面启用对核心选项的更新?

1 个回复
SO网友:Sean

文件wp-admin/options.php 处理通过管理区域提交的选项更新,并根据提交请求的选项页面的允许选项列表过滤提交的选项值。

允许的列表(在WordPress 5.5之前称为“白名单”)使用变量的值$option_page 确定允许更新的设置。这个$option_page 值将设置为指定为的参数的任何值settings_fields() 输出选项页时,在您的情况下my-plugin-admin-options.

核心选项image_default_link_type 仅允许在以下情况下更新$option_pagemedia. 这就是为什么插件的设置页面不会更新它。您注意到您自己的插件的设置已更新,没有任何问题-这是因为register_setting 将选项名称添加到指定$option_page 自动地

解决方案是在allowed_options (WordPress 5.5以上)或whitelist_options (WordPress<;5.5)将核心选项添加到当前$option_page:

add_filter( \'allowed_options\', \'wpse_allow_image_default_link_type_update\' );

/**
 * Allow core `image_default_link_type` setting to be updated from the
 * plugin settings page.
 *
 * @global $option_page
 */
function wpse_allow_image_default_link_type_update( $allowed_options ) {
    global $option_page;

    if ( \'my-plugin-admin-options\' === $option_page ) {
        $allowed_options[\'my-plugin-admin-options\'][] = \'image_default_link_type\';
    }

    return $allowed_options;
}

相关推荐

Huge wp_options table

我有一个WP网站的问题。由于没有更多可用磁盘空间,网站崩溃。搜索时,我检测到wp\\U选项表大小为12GB,但大约只有1100行:有什么想法吗?提前感谢[UPDATE 1]如果我导出wp\\U选项表,拖放并导入,大小将减少到9,7mb:我没有机会用优化表OPTIMIZE TABLE wp_options 但如果再发生的话我会试试的[UPDATE 2]问题仍然存在。我试着OPTIMIZE TABLE wp_options;无结果: