Публикация в группе: Полезное для WordPress

Произвольные меню вордпресс - очень удобная штука. Можно очень быстро построить нужное по структуре и вложенности меню не прибегая к каким то ухищрениям. Но если вы сталкивались с необходимостью создания меню с большим количеством пунктов и подпунктов, то знаете о существующей проблеме, которая может помешать вашей задумке. Когда число пунктов переваливает определенный рубеж, то после нажатия на кнопку "Сохранить" вы вполне можете увидеть, что WordPress безжалостно обрезал ваше грандиозное меню, оставив только часть его и не давая таким образом шанса увеличить меню еще хоть на сколько нибудь. Лично я сталкивался с такой ситуацией, когда у меня не получалось сделать произвольное меню с числом пунктов более 90, а мне было это очень надо, тк другого нормального способа сделать единое меню я не видел. Кроме того, большие меню очень неудобно редактировать, они долго грузяться и сохраняются в админке.

Решая подобную проблему на одном сайте я попробовал пойти немного другим путем. Мне надо было сделать очень большое по своей структуре меню и я предложил разбить его на несколько более мелких. Небольшие меню гораздо проще редактировать, но как их вывести на сайте как единое целое? Для этого я написал виджет, который помог решить данную проблему. А именно вывести несколько маленьких меню как единое целое в сайдбаре сайта. Выкладываю сразу рабочий код виджета:

 add_action( 'widgets_init', 'custom_wp_nav_menu_widget' );

function custom_wp_nav_menu_widget() {
	register_widget( 'Custom_WP_Nav_Menu_Widget' );
}

 class Custom_WP_Nav_Menu_Widget extends WP_Widget {

	function __construct() {
		$widget_ops = array( 'description' => __('Объединение вывода нескольких произвольных меню в одно') );
		parent::__construct( 'custom_nav_menu', __('Объединенные меню'), $widget_ops );
	}

	function widget($args, $instance) {

		$count_menu = count($instance['custom_nav_menu']);

		if ( $count_menu==0 )
			return;

		$instance['title'] = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );

		echo $args['before_widget'];

		if ( !empty($instance['title']) )
			echo $args['before_title'] . $instance['title'] . $args['after_title'];

		if(!empty($instance['number'])){
			$number = explode(',',$instance['number']);
			$count_number = count($number);
			for($a=0;$a<$count_number;$a++){			
				$custom_nav_menu = ! empty( $number[$a] ) ? wp_get_nav_menu_object( $number[$a] ) : false;
				wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $custom_nav_menu ) );
			}
		}else{
			foreach($instance['custom_nav_menu'] as $nav){			
				$custom_nav_menu = ! empty( $nav ) ? wp_get_nav_menu_object( $nav ) : false;
				wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $custom_nav_menu ) );
			}
		}		

		echo $args['after_widget'];
	}

	function update( $new_instance, $old_instance ) {
		$instance['title'] = strip_tags( stripslashes($new_instance['title']) );
		$instance['number'] = $new_instance['number'];
		$instance['custom_nav_menu'] = (array)$new_instance['custom_nav_menu'];
		return $instance;
	}

	function form( $instance ) {
		$title = isset( $instance['title'] ) ? $instance['title'] : '';
		$number = isset( $instance['number'] ) ? $instance['number'] : '';
		$custom_nav_menu = isset( $instance['custom_nav_menu'] ) ? $instance['custom_nav_menu'] : '';

		$menus = get_terms( 'nav_menu', array( 'hide_empty' => false, 'order' => 'ASC', 'orderby' => 'id' ) );

		if ( !$menus ) {
			echo '<p>'. sprintf( __('No menus have been created yet. <a href="%s">Create some</a>.'), admin_url('nav-menus.php') ) .'</p>';
			return;
		}
		?>
		<p>
			<label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:') ?></label>
			<input type="text" class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" value="<?php echo $title; ?>" />
		</p>
		<p>
			<label for="<?php echo $this->get_field_id('custom_nav_menu'); ?>"><?php _e('Select Menu:'); ?></label><br>			
		<?php
			foreach ( $menus as $menu ) {
				echo '<input type="checkbox" name="'.$this->get_field_name('custom_nav_menu').'[' . $menu->term_id . ']" value="' . $menu->term_id . '"'
					. checked( $custom_nav_menu[$menu->term_id], $menu->term_id, false )
					. '> (' . $menu->term_id . ') '. $menu->name .'<br>' ;
			}
		?>			
		</p>
		<p>
			<label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Порядок вывода:') ?></label>
			<input type="text" class="widefat" id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" value="<?php echo $number; ?>" /><small>через запятую</small>
		</p>
		<?php
	}
}

09.04

После того как вы поместите данный код в файл functions.php используемого шаблона, то в разделе "Виджеты" у вас появится новый виджет "Объедененные меню".
Разместите его в том месте, где вы хотите вывести объедененные меню. Укажите заголовок для вашего меню. Отметьте нужные к выводу меню галочкой и укажите порядок их вывода в
соответствующем поле виджета, просто указав ID меню в нужном порядке через запятую. В каком порядке укажите в таком они и выведутся в общем меню.
Вот и все. Общее меню выводится на вашем сайте так, словно это единое меню, а не собранное из меню поменьше.
Стиль меню нужен был дефолтный, поэтому он соответствует стилю вывода виджета "Произвольные меню", но при определенной сноровке всегда это можно изменить под себя)

21

Автор публикации

не в сети 5 дней

Андрей CS

12K
занят
Комментарии: 2729Публикации: 481Регистрация: 30-11--0001Продаж/Покупок: 0/0