WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Не сохраняется выбранный чекбокс в настройках виджета

Пишу не большой виджет типа (акардион)

Идея проста как 3 копейки, виджет повторяет полностью стандартный виджет рубрик, но как только ставишь checkbox Отображать иерархию. Сразу включается тот самый акардион!

Проблема в том, что когда ставишь check в админке при сохранении он не сохраняется.

<?php
/* Виджет WPSchool Widget */
class wpschool_example_widget extends WP_Widget {

	// Установка идентификатора, заголовка, имени класса и описания для виджета.
	public function __construct() {
		$widget_options = array(
			'classname' => 'wpschool',
			'description' => 'Виджет категорий темы Root',
		);
		parent::__construct( 'wpschool_widget', 'WPSchool Widget', $widget_options );
	}

	// Вывод виджета в области виджетов на сайте.
	public function widget( $args, $instance ) {
		$title = apply_filters( 'widget_title', $instance[ 'title' ] );
		$blog_title = get_bloginfo( 'name' );
		$tagline = get_bloginfo( 'description' );

		echo $args['before_widget'] . $args['before_title'] . $title . $args['after_title']; 
?>
<nav class="nsb-menu">
<ul>

<?

$categories = get_categories( [
	'taxonomy'     => 'category',
	'type'         => 'post',
	'child_of'     => 0,
	'parent'       => '',
	'orderby'      => 'name',
	'order'        => 'ASC',
	'hide_empty'   => 1,
	'hierarchical' => 1,
	'exclude'      => '',
	'include'      => '',
	'number'       => 0,
	'pad_counts'   => false,
	// полный список параметров смотрите в описании функции http://wp-kama.ru/function/get_terms
] );

  if( $categories ){
	foreach( $categories as $cat ){

	  echo "<li class='nsb-menu-list' id='nsb$cat->slug'>
	<a>slug' class='nsb-menu-link'><i class='fa fa-check' aria-hidden='true'></i> $cat->name <span class='nsbcout-post-display'>$cat->count</span></a>

	<div class='nsb-submenu'>
	<a>slug' class='nsb-submenu-link'>$cat->description <span class='nsbcout-post-display'>$cat->count</span></a>
	</div>
	</li>";

	}
}    

?>
 </ul>
	</nav>       

		<?php echo $args['after_widget'];
	}

	// Параметры виджета, отображаемые в области администрирования WordPress.
	public function form( $instance ) {
		$title = ! empty( $instance['title'] ) ? $instance['title'] : ''; 

?>
		<p>
		<label for="<?php echo $this->get_field_id( 'title' ); ?>">Заголовок:</label>
		<input type="text" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo esc_attr( $title ); ?>" class="widefat" />
		</p>
		<p>

			<input type="checkbox" checked="" class="checkbox" id="<?php echo $this->get_field_id( 'widget-categories-count' ); ?>" name="<?php echo $this->get_field_name( 'widget-categories[3][hierarchical]' ); ?>">
			<label for="widget-categories-4-count">Отображать число записей</label>
			<br>

			<input type="checkbox" class="checkbox" id="widget-categories-4-hierarchical" name="widget-categories[4][hierarchical]">
			<label for="widget-categories-4-hierarchical">Отображать иерархию</label>
		</p>

<?php
	}

	// Обновление настроек виджета в админ-панели.
	public function update( $new_instance, $old_instance ) {
		$instance = $old_instance;
		$instance[ 'title' ] = strip_tags( $new_instance[ 'title' ]); 
		$instance[ 'widget-categories' ] = $new_instance[ 'widget-categories' ];
		return $instance;
	}

}

// Регистрация и активация виджета.
function wpschool_register_widget() {
	register_widget( 'wpschool_example_widget' );
}
add_action( 'widgets_init', 'wpschool_register_widget' ); 

и еще один вопрос как можно добавить пару полей в добавления и редактирования рубрик?

0
Nikson
3.3 года назад
  • 2
    stepan2278 www.weblancer.net/users/stepanko/?affili...
    public function update( $new_instance, $old_instance ) {
    	$instance = $old_instance;
    	$instance[ 'title' ] = strip_tags( $new_instance[ 'title' ]); 
    	$instance[ 'widget-categories' ] = $new_instance[ 'widget-categories' ];
    	return $instance;
    }

    вот здесь и нужно добавить сохранение чекбокса.
    Вы же там title сохран - вот и чекбокс также сохранить нужно

    только он будет 1 или 0

    Nikson 3.3 года назад

    Сделал как вы сказали, на скриншоте видно что галочка стоит.

    как нажимаю кнопку "Сохранить" чек пропадает

    если добавляю

    checked="<?php echo $this->get_field_name( 'widget-categories' ); ?>"

    то чекбокс постоянно выбран

    name="<?php echo $this->get_field_name( 'widget-categories' ); ?>">
     // Обновление настроек виджета в админ-панели.
    	public function update( $new_instance, $old_instance ) {
    		$instance = $old_instance;
    		$instance[ 'title' ] = strip_tags( $new_instance[ 'title' ]); 
    		$instance[ 'widget-categories' ] = $new_instance[ 'widget-categories' ];
    
    		return $instance;
    	}
    stepan 3.3 года назад

    Смотрите файл wp-includes/widgets/class-wp-widget-categories.php

    Вот так обновляется чекбокс:

    public function update( $new_instance, $old_instance ) {
    	$instance                 = $old_instance;
    	$instance['title']        = sanitize_text_field( $new_instance['title'] );
    	$instance['count']        = ! empty( $new_instance['count'] ) ? 1 : 0;
    	$instance['hierarchical'] = ! empty( $new_instance['hierarchical'] ) ? 1 : 0;
    	$instance['dropdown']     = ! empty( $new_instance['dropdown'] ) ? 1 : 0;
    
    	return $instance;
    }

    А вот вывод самого чекбокса:

    <input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id( 'hierarchical' ); ?>" name="<?php echo $this->get_field_name( 'hierarchical' ); ?>"<?php checked( $hierarchical ); ?> />
    <label for="<?php echo $this->get_field_id( 'hierarchical' ); ?>"><?php _e( 'Show hierarchy' ); ?></label>

    Вот скрин еще:

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация