当还想要更新设置API之外的选项时,在哪里挂接设置API的REGISTER_SETTINGS?

时间:2011-02-18 作者:BigToe

这个Settings API 是添加管理选项的便捷方式。有关设置API hook register\\u设置为admin\\u init的教程。但是,如果您还想在设置API之外以编程方式更改相同的选项,该怎么办?

例如,使用设置API来维护选项X的基值。此外,每个新帖子都会通过直接update\\u option函数调用自动递增选项X。不幸的是,如果注册了选项X,update\\u选项将触发对与注册设置关联的验证函数的调用。验证失败,因为update\\u option参数没有通过,因为我搞砸了选项更改的不同来源所需的不同验证。

应将选项X的register\\u设置挂接在何处,以允许在设置API之外更新选项X?或者,应在何处挂接选项X的unregister\\u设置,以允许直接update\\u选项调用在没有设置API清理/验证函数调用的情况下工作?

更新时间:t31os 下面提供了一些有用的说明性代码。下面是对他的代码的一个小补充:

    function __construct() {
        add_action( \'admin_init\', array( $this, \'admin_init\' ) );
        add_action( \'admin_menu\', array( $this, \'admin_menu\' ) );
        add_action(\'add_meta_boxes\', array( &$this, \'add_regtest_box\' )); //added hook
        }   

//added functions
    function add_regtest_box() {
            global $post;
            add_meta_box( \'regtest_box\', \'Registered Setting Test\', array( &$this, \'regtest_box_contents\'), \'post\' , \'side\' , \'high\' );
        }   
    function regtest_box_contents() {
            update_option( \'test-option\', array(\'fieldone\'=>-11,\'fieldtwo\'=>8) );
            $new_vals = get_option( \'test-option\' );
            print_r( $new_vals );
        }
如果从仪表板“添加新帖子”,您会注意到右上角的metabox显示的fieldone值为11,而不是-11。这是因为regtest\\u box\\u contents中的update\\u option函数调用是通过已注册(register\\u设置)到选项的清理/验证函数来放置选项值。在本例中,这是t31os的update\\u option函数,它将absint()应用于传递的选项值。问题是如何避免该函数调用,例如将选项更新为-11。

3 个回复
最合适的回答,由SO网友:t31os 整理而成

现在我已经考虑过了(Mark就是我,我在其他地方使用另一个帐户),注册设置所做的就是准备options.php 当存在有效的nonce时接受传入表单数据,并提供一种将清理方法挂接到该数据提交的方法。对于插件来说,这真的是一件很方便的事情,诸如此类。。

从网站的前端打电话就可以了update_option 就这样吧。它不需要在前端注册,因为您没有将表单数据提交给options.php 就像管理页面一样。

我试图复制您的问题,但一直无法复制,下面是我难看的测试代码,用于创建一个简单的注册页面,可以保存选项。

class RegisteredSettingsTest {
    private $page;
    private $name = \'test-option\';
    private $options;
    function __construct() {
        add_action( \'admin_init\', array( $this, \'admin_init\' ) );
        add_action( \'admin_menu\', array( $this, \'admin_menu\' ) );
    }
    function admin_init() {
        register_setting( \'setting_ref\', $this->name, array( $this, \'update_option\' ) );
        $this->options = get_option( $this->name );
    }
    function admin_menu() {
        $this->page = add_dashboard_page( \'Test\',\'Test\',\'manage_options\',\'translatable_demo\', array( &$this , \'load\' ) );
    }
    function update_option( $data ) {
        $clean = array_map( \'absint\', $data );
        unset($data);
        return $clean;
    }
    function load() {
        ?>
        <div class="wrap">
            <?php screen_icon(\'index\'); ?>
            <h2>Test</h2>
            <form action="options.php" method="post">
                <?php settings_fields( \'setting_ref\' ); ?>
                <p><label for="<?php $this->field_name( \'fieldone\') ?>">Field one <input value="<?php $this->get_option( \'fieldone\') ?>" name="<?php $this->field_name( \'fieldone\') ?>" type="text" /></label></p>
                <p><label for="<?php $this->field_name( \'fieldtwo\') ?>">Field two <input value="<?php $this->get_option( \'fieldtwo\') ?>" name="<?php $this->field_name( \'fieldtwo\') ?>" type="text" /></label></p>
                <p class="submit"><input type="submit" name="Submit" class="button-secondary action" value="Save" /></p>
            </form>
            <!-- Output options data, so we can see how it currently looks -->
            <pre><?php print_r( $this->options ) ?></pre>
        </div>
        <?php
    }
    function field_name( $name, $echo = true ) {
        $name = "{$this->name}[$name]";
        if( $echo )
            echo $name;
        else
            return $name;
    }
    function get_option( $name, $echo = true ) {
        $val = \'\';
        if( is_array( $this->options ) && isset( $this->options[$name] ) )
            $val = $this->options[$name];

        if( $echo )
            echo $val;
        else
            return $val;
    }
}
$r = new RegisteredSettingsTest;
我加载了页面,输入了值12 进入字段并点击Save(这当然很好,我看到了值12). 我使用数值,因为这只是一个简单的测试。

我能想到的最简单的前端测试就是打电话update_option 在我的内部single.php(尽管我可以使用任何其他模板文件)。

update_option( \'test-option\', array(\'fieldone\'=>3,\'fieldtwo\'=>4) );
如果有问题,我仍然应该看到值12 当我加载我的测试管理页面时。不幸的是,事实并非如此,新的价值观,34 如图所示。

您是否可以发布用于从前端更新选项的代码?如果它在回调中,请发布整个函数,以及它所连接的操作/过滤器:)

UPDATE:

更新选项之前,请删除清理回调。

remove_all_filters( \'sanitize_option_test-option\', 10 );
并且您的值不会再被回调函数破坏,因为它将被解除挂钩:)

SO网友:Mark Duncan

你能不能不只是在init上启动你的操作?

更新选项的要求仍然相同(只有管理员可以manage_options), 所以从理论上讲应该是可行的,你试过了吗,他们有问题吗?

现在不能在我的主PC上,否则我会亲自试一试,看看它是否有效。

你这是什么意思。。

验证失败,因为未传递update\\u option参数。

我会在评论中询问,但我还没有达到这个客户的代表要求。

SO网友:wyrfel

在旁注上。。。数一数相关的帖子,然后从你的选项中加上基本值,得出总数,不是更好吗?(如果你真的需要它的话。)除非您想从前端构建一个可用的设置界面,否则这听起来似乎表明您应该以不同的方式进行。我认为如果用户的“设置”自行更改,可能会让用户感到困惑?

结束

相关推荐

如何获取我在Add_Options_Page中为我的页眉指定的标题

我有add_options_page(\'Post Products Settings\', \'Post Products Settings\', \'administrator\', \'pp_settings\', \'pp_settings_page\'); 无论如何,我可以得到在第一个参数中指定的内容,以便在我的页眉中使用?我知道我可以硬编码,但只是好奇