問題描述
我試圖在視窗小工具中使用 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
}
有任何想法嗎?如果您需要其他任何資訊,請通知我。
謝謝 :)
最佳解決方案
問題是要使視窗小工具類的 update
方法工作,form
方法上的名稱輸入應透過 $this->get_get_field_name('name_of_the_field');
設定,但 wp_category_checklist
沒有引數來設定輸入的名稱 (核取方塊) 。
但是,wp_category_checklist
使用 walker 類列印核取方塊並允許自定義。預設情況下,使用的類是 Walker_Category_Checklist
,列印核取方塊的方法是 start_el
。
該方法沒有允許編輯輸入名稱的過濾器,但是我們可以建立一個自定義步行器,接受引數來設定名稱。如果這個 Walker 擴充套件了 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>';
}
}
現在,可能在同一個檔案中我們可以編寫小工具類:
/**
* 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' );
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。