ウィジェットでwp_category_checklistを使用する


8

ウィジェットでwp_category_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
}

何か案は?他に必要な場合はお知らせください。

ありがとう:)

回答:


9

問題はupdate、ウィジェットクラスのメソッドを機能させるために、メソッドの名前入力をform介して設定する必要$this->get_get_field_name('name_of_the_field');wp_category_checklistありますが、入力(チェックボックス)の名前を設定する引数がありません。

ただし、wp_category_checklistウォーカークラスを使用してチェックボックスを印刷し、カスタマイズできるようにします。デフォルトで使用されるクラスはWalker_Category_Checklistで、チェックボックスを出力するメソッドはstart_elです。

このメソッドには、入力名の編集を可能にするフィルターがありませんが、パラメーターを受け入れて名前を設定するカスタムウォーカーを作成できます。このウォーカーがを拡張する場合はWalker_Category_Checkliststart_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>';
      }
}

さて、おそらく同じファイルでウィジェットクラスを書くことができます:

/**
 * 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' );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.