在小部件中使用wp_ategory_check list

时间:2013-11-28 作者:Rhys Wynne

我正在尝试在小部件中使用wp\\U category\\U checklist来显示复选框列表,保存后,这些复选框仍保持勾选状态。目前,我很难让他们保存,据我所知,这并没有保存(复选框仍然没有勾选):-

这是我目前编辑的代码。

function update($new_instance, $old_instance) {
    $instance = $old_instance;
    $instance[\'widget_categories\'] = $new_instance[\'post_category\'];
return $instance;
}


function form($instance) {
    $instance = wp_parse_args( (array) $instance, $default );
    $categories = get_categories();     

    $category_array = $instance[\'widget_categories\'];

    if (!$category_array)
    {
        $category_array = array();
    }
    ?>
    <ul class="categorychecklist">
    <?php wp_category_checklist(0,0, $category_array,false, NULL , false);?>
    </ul>
    <?php
}
有什么想法吗?如果你还需要什么,请告诉我。

谢谢:)

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

问题是update widget类工作的方法,在form 方法应通过设置$this->get_get_field_name(\'name_of_the_field\'); 但是wp_category_checklist 没有设置输入名称的参数(复选框)。

然而wp_category_checklist 使用walker类打印复选框并允许对其进行自定义。默认情况下,使用的类为Walker_Category_Checklist, 打印复选框的方法是start_el.

该方法没有允许编辑输入名称的过滤器,但我们可以创建一个自定义的walker,它接受params来设置名称。如果这个助行器伸出Walker_Category_Checklist, 我们只需要覆盖start_el 方法(主要是从原件复制)。

代码:

// This is required to be sure Walker_Category_Checklist class is available
require_once ABSPATH . \'wp-admin/includes/template.php\';
/**
 * Custom walker to print category checkboxes for widget forms
 */
class Walker_Category_Checklist_Widget extends Walker_Category_Checklist {

    private $name;
    private $id;

    function __construct( $name = \'\', $id = \'\' ) {
        $this->name = $name;
        $this->id = $id;
    }

    function start_el( &$output, $cat, $depth = 0, $args = array(), $id = 0 ) {
        extract( $args );
        if ( empty( $taxonomy ) ) $taxonomy = \'category\';
        $class = in_array( $cat->term_id, $popular_cats ) ? \' class="popular-category"\' : \'\';
        $id = $this->id . \'-\' . $cat->term_id;
        $checked = checked( in_array( $cat->term_id, $selected_cats ), true, false );
        $output .= "\\n<li id=\'{$taxonomy}-{$cat->term_id}\'$class>" 
            . \'<label class="selectit"><input value="\' 
            . $cat->term_id . \'" type="checkbox" name="\' . $this->name 
            . \'[]" id="in-\'. $id . \'"\' . $checked 
            . disabled( empty( $args[\'disabled\'] ), false, false ) . \' /> \' 
            . esc_html( apply_filters( \'the_category\', $cat->name ) ) 
            . \'</label>\';
      }
}
现在,我们可以在同一个文件中编写widget类:

/**
 * An example of widget using wp_category_checklist on form
 */
class TestCategoryWidget extends WP_Widget {

    function __construct(){
        parent::__construct( false, \'TestWidget\');
    }

    function widget( $args, $instance ) { 
        // Displays the widget on frontend 
    }

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance[\'widget_categories\'] = $new_instance[\'widget_categories\'];
        return $instance;
    }

    function form( $instance ) {
        $defaults = array( \'widget_categories\' => array() );
        $instance = wp_parse_args( (array) $instance, $defaults );    
        // Instantiate the walker passing name and id as arguments to constructor
        $walker = new Walker_Category_Checklist_Widget(
            $this->get_field_name( \'widget_categories\' ), 
            $this->get_field_id( \'widget_categories\' )
        );
        echo \'<ul class="categorychecklist">\';
        wp_category_checklist( 0, 0, $instance[\'widget_categories\'], FALSE, $walker, FALSE );
        echo \'</ul>\';
    }

}
最后,注册小部件:

function TestCategoryWidgetInit() {
    register_widget( \'TestCategoryWidget\' );
}

add_action( \'widgets_init\', \'TestCategoryWidgetInit\' );

结束

相关推荐

"Widgets" menu doesn't appear

我正在开发一个WordPress主题,它在我的本地主机和一个live server上运行得很好,但在我的另一个live server上,小部件菜单(从外观)不会出现。是的,所有3台服务器都有相同的3.6.1 WordPress版本,主题文件也相同。知道这是什么原因吗?这是functions.php 注册小部件区域:if (function_exists(\'register_sidebar\')) { register_sidebar(array( \'name\' => \