从类方法保存小部件选项

时间:2012-12-15 作者:Francesco

我有一个widget类(派生自WP\\u widget),它有一个方法(通过ajax调用)来更新其部分选项(元素顺序),而无需用户单击“保存”,即可设置我从构造函数中执行的处理程序:

add_action(\'wp_ajax_bgw_update_order\', array(&$this, \'update_order\'));
Theupdate_order 方法的作用类似于this 问题,但它不会保存新选项。我的代码:

public function update_order() {
    if (!is_admin()) die(\'Not an admin\');
    if (!isset($_REQUEST[\'nonce\']) ||
        !wp_verify_nonce($_REQUEST[\'nonce\'], \'section-order-nonce\')) 
        die(\'Invalid Nonce\');
    $sections = $this->sections;
    $new_order = $_POST[\'section\'];
    $new_sections = array();

    foreach($new_order as $v) {
        if (isset($sections[$v])) {
            $new_sections[$v] = $sections[$v];
        }
    }
    $this->sections = $new_sections;
    $settings = $this->get_settings();
    $settings[$this->number][\'sections_order\'] = $new_sections;
    $this->save_settings($settings);
    print_r($this->get_settings());
    die();
}
我的update 函数执行常规操作:

public function update( $new_instance, $old_instance ) {
    $instance = array();
    $instance[\'username\'] = strip_tags($new_instance[\'username\']);
    $instance[\'count\'] = strip_tags($new_instance[\'count\']);
    // [...]
    return $instance;
}
当我登录时$settings 从…起update_order 它具有正确的值:

Array
(
    [3] => Array
        (
            [username] => username
            [count] => 0
            [title] => GitHub
            [skip_forks] => 1
            [show_octocat] => 1
            [sections_order] => Array
                (
                    [1] => Activity
                    [0] => Repositories
                )

        )

)
Theupdate 方法不会被调用,当我点击“保存”按钮时$instance (从form 方法)没有sections_order 钥匙

我得出的结论是save_settings 不会像我想的那样。

如何保存update_order 方法我要做的是节约sections_order 无需用户单击“保存”按钮。

1 个回复
SO网友:chrisguitarguy

为什么要为小部件编写自己的保存处理程序?这个update 方法您的widget类将处理此问题。您正在保存每个小部件的设置,这正是小部件API的设计目的。

<?php
class WPSE76224_Widget extends WP_Widget
{
    public function __construct()
    {
        // Create the widget options and such here, then call
        // $this->WP_Widget to let wordpress know about it.
    }

    public function widget($args, $instance)
    {
        // display the widget on the front end.
    }

    public function form($instance)
    {
        // The widget form in the admin area.
    }

    public function update($new, $old)
    {
        // Saves your data, called via AJAX. But your saving logic here.
    }
}
由于WordPress“加载”小部件类(您只需在register_widget). 很有可能,widget类的一个实例并没有在您认为的情况下创建,例如在ajax请求上。如果您确实想编写ajax处理程序,那么可能必须将该功能移到widget类之外。

进一步阅读:

  1. http://codex.wordpress.org/Widgets_API
  2. http://pmg.co/how-to-build-your-own-wordpress-widgets 这是我写的一个旧教程。由于推特的变化,“获取推特”部分不再工作

结束