Персональный разработчик Вашего сайта.
Модули. Скрипты. Плагины.

Check Menu WP

Скрипт присвоения отдельного дополнительного меню для определённой страницы WordPress. Позволяет присвоить одно или несколько уникальных меню каждой отдельной странице.

Порой бывает необходимо создать дополнительное меню в WP и вывести его на отдельных страницах.

Можно поступить грубо и вывести меню на определенные страницы при условии:

<?php
if ($_SERVER["REQUEST_URI"] == "/name_page.html") {
	echo "<div class='dop_menu'>".(wp_nav_menu($dop_menu))."</div>"
}
?>

Однако этот метод подходит только тем, кто хоть немного знает PHP. Да и неудобно каждый раз открывать код и напрямую добавлять условие по url для каждой новой страницы. А если таких меню несколько? Подобный код может растянуться на несколько метров. Грубо, неудобно и малоэффективно и требует определённых знаний php и функций Wordpress.

Другой вариант - плагины. Однако, они тоже громоздки, требуют постоянного обновления.

Предлагаю следующий лёгкий скрипт добавления меню на определенные страницы.

<?php
// Инструкция:
// копируете код от //----menu check---// до //----menu check end---//
// и вставляете его в самый низ кода в functions.php текущего шаблона
// сохраняете
// Далее вставляете следующий код в файлы шаблона page.php - страница, archive.php - рубрика, single.php - запись
// туда, где нужно вывести дополнительное меню

/*

Вывод дополнительного меню внутри шаблонов:

Для категорий/рубрик:

<?
 
$cat_id = get_query_var('cat'); 
$cat_data = get_option("category_$cat_id");

$check_menu = $cat_data['menu_check'];

if (!isset($check_menu) || $check_menu == '') { } 
else if ((isset($check_menu)) and ($check_menu != '')) {
	echo '<div class="dop_menu" id="menu">'.(wp_nav_menu($check_menu)).'</div>';
} 

?>


Для записей/постов и страниц

<?

$check_menu = get_post_meta($post->ID, 'menu_check', 1);

if (!isset($check_menu) || $check_menu == '') { } 
else if ((isset($check_menu)) and ($check_menu != '')) {
	echo '<div class="dop_menu" id="menu">'.(wp_nav_menu($check_menu)).'</div>';
} 

?>

*/


//------------------------------------------menu check-------------------------------------------------//

// подключаем функцию активации my_extra_fields
add_action('add_meta_boxes', 'my_extra_fields', 1);

function my_extra_fields() {
	add_meta_box( 'extra_fields', 'Выберите одно дополнительное меню', 'extra_fields_box_func', 'post', 'side', 'default'  );
add_meta_box( 'extra_fields', 'Выберите одно дополнительное меню', 'extra_fields_box_func', 'page', 'side', 'default'  );
add_meta_box( 'extra_fields', 'Выберите одно дополнительное меню', 'extra_fields_box_func', 'term', 'side', 'default'  );
}

// код блока
function extra_fields_box_func( $post ){
$args = array( 'hide_empty' => false, 'orderby' => 'name' );
$menus = wp_get_nav_menus( $args );
	$html .= '<input type="hidden" name="extra[menu_check]" value="" />';
foreach( $menus as $menu => $n){
	$html .= '<label><input type="checkbox" name="extra[menu_check]" value="'.$n->name.'"';
	$html .= (get_post_meta($post->ID, 'menu_check', 1) == $n->name) ? ' checked="checked"' : '';
	$html .= ' /> '.$n->name.'</label><br />';
}
echo $html.'<input type="hidden" name="extra_fields_nonce" value="'.wp_create_nonce(__FILE__).'" />';
}

// включаем обновление полей при сохранении
add_action('save_post', 'my_extra_fields_update', 0);

/* Сохраняем данные, при сохранении поста */
function my_extra_fields_update( $post_id ){
	if ( !isset($_POST['extra_fields_nonce']) || !wp_verify_nonce($_POST['extra_fields_nonce'], __FILE__) ) return false; // проверка
	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE  ) return false; // если это автосохранение
	if ( !current_user_can('edit_post', $post_id) ) return false; // если у пользователя нет права редактирования

	if( !isset($_POST['extra']) ) return false; 

	// сохранить/удалить данные
	$_POST['extra'] = array_map('trim', $_POST['extra']);
	foreach( $_POST['extra'] as $key=>$value ){
		if( empty($value) ){
			delete_post_meta($post_id, $key); // удаляем поле если значение пустое
			continue;
		}

		update_post_meta($post_id, $key, $value); // работает автоматически
	}
	return $post_id;
}

add_action('admin_init', 'category_custom_fields', 1);
// функция расширения функционала административного раздела
function category_custom_fields()
    {
        // добавления действия после отображения формы ввода параметров категории
        add_action('edit_category_form_fields', 'category_custom_fields_form');
        // добавления действия при сохранении формы ввода параметров категории
        add_action('edited_category', 'category_custom_fields_save');
    }

function category_custom_fields_form($tag)
    {
        $t_id = $tag->term_id;
        $cat_extra = get_option("category_$t_id");
		
$args = array( 'hide_empty' => false, 'orderby' => 'name' );
$menus = wp_get_nav_menus( $args );
	$html = '<tr><td><span style="font-weight: bold;">Выберите одно дополнительное меню</span></td><td>';
	$html .= '<input type="hidden" name="cat_extra[menu_check]" value="" />';
foreach( $menus as $menu => $n){
	$html .= '<label><input type="checkbox" name="cat_extra[menu_check]" value="'.$n->name.'"';
	$html .= ($cat_extra[menu_check] == $n->name) ? ' checked="checked"' : '';
	$html .= ' /> '.$n->name.'</label><br />';
}
	$html .= '</td></tr>';
	echo $html;
	echo '<input type="hidden" name="menu_checkbox_nonce" value="'.wp_create_nonce(__FILE__).'" />';
    }
    
function category_custom_fields_save($term_id)
    {
        if (isset($_POST['cat_extra'])) {
            $t_id = $term_id;
            $cat_extra = get_option("category_$t_id");
            $cat_keys = (array_keys($_POST['cat_extra']));
            foreach ($cat_keys as $key) {
                if (isset($_POST['cat_extra'][$key])) {
                    $cat_extra[$key] = stripslashes($_POST['cat_extra'][$key]);
                }
            }
            //save the option array
            update_option("category_$t_id", $cat_extra);
        }
    }

//------------------------------------------menu check end---------------------------------------------//

?>

Преимущества?

В самой "админке", при редактировании страницы/поста/рубрики, данный скрипт выводит отдельный блок, в котором списком выведены названия всех созданных меню рядом с чекбоксами.

Запись/Пост

Страница

Категория/Рубрика

Код в functions.php

Достаточно просто отметить галочкой нужное меню и сохранить страницу - дополнительное меню тут же отобразится на данной странице.

Без дополнительного меню

С дополнительным меню

Создавать меню нужно, как обычно, в разделе меню. Дизайн и положение такого меню на сайте ограничено только Вашей фантазией.

Если появились вопросы - пишите на почту pl.web-master@yandex.ru или воспользуйтесь контактной формой ниже.

Разработанные мной скрипты, модули и CMS
Портфолио

Смотреть все статьи