wp_page_menu()WP 2.7.0

Выводит список постоянных страниц блога в виде ссылок на соответствующие страницы. Аналог wp_list_pages(), только есть возможность добавить ссылку "на главную" в начало.

Функция обычно используется в шапке и боковой панели, для вывода меню постоянных страниц. Однако, так же может использоваться в других местах шаблона.

Работает на основе: wp_list_pages()
Хуки из функции

Возвращает

null|Строку. Выводит на экран HTML код меню. Если echo параметр поставлен в false, то возвращает строку.

Использование

wp_page_menu( $args );

Аргументы параметра $args

Полный список аргументов смотрите в описании функции wp_list_pages(). Ниже некоторые из них:

show_home(логический)
Ссылка "На главную" в начале списка страниц. 0 (false) - не показывать ссылку; 1 (true) - добавить ссылку.
По умолчанию: false
depth(число)

Этот параметр контролирует уровень вложенности дочерних страниц, которые будут включены в список. По умолчанию 0 (показать все дочерние страницы, включая двойную и более вложенность).

  • 0 (по умолчанию) Включать в список все уровни вложенных страницы и показывать их в древовидном виде.

  • -1 Включить в список все уровни вложенных страниц, но не показывать вложенность (древовидное отображение списка отключается, список будет показан как общий).

  • 1 Показать только первые вложенные страницы, т.е. дочерние страницы первого уровня.

  • 2, 3 и т.д. Включить в список дочерние страницы 2, 3 и т.д. уровня…
sort_column(строка)

Сортировать список по указанным полям. По умолчанию список сортируется по порядковому номеру указанному при публикации страницы (menu order) и по заголовкам (post_title), в алфавитном порядке. Для сортировки можно использовать любое значение столбца таблицы wp_post. Можно указывать несколько параметров через запятую, в соответствии с которыми потом будет отсортирован список. Некоторые популярные поля сортировки:

  • post_title - сортировать по заголовку (в алфавитном порядке);
  • menu_order - сортировать по порядку, который указывается на админ-панели на странице редактирования "постоянной страницы";
  • post_date - сортировать по дате создания "постоянной страницы";
  • post_modified - сортировать по дате изменения страницы;
  • ID - сортировать по идентификатору записи в Базе Данных (по ID);
  • post_author - сортировать по ID авторов;
  • post_name - сортировать в алфавитом порядке по альтернативному имени поста (обычно транслитерация заголовка).

По умолчанию: 'menu_order, post_title'

menu_class(строка)
Название css класса для оборачивающего меню HTML тега DIV (class="menu").
По умолчанию: 'menu'
menu_id(строка)
ID для тега <div>. С версии 4.4.
По умолчанию: ''
container(строка)
Элемент который будет содержать в себе список страниц. С версии 4.4.
По умолчанию: 'div'
include(строка)
Показать в списке только указанные страницы. В параметре, через запятую, нужно указать ID постоянных страниц, которые нужно вывести в списке.
Этот параметр отменяет параметры относящиеся к формированию списка, так как он создает список только из тех страниц которые указаны. Отменяются параметры: exclude, child_of, depth, meta_key, meta_value, authors.
По умолчанию: ''
exclude(строка)
В этом параметре указываем через запятую ID тех страниц, которые мы не хотим, чтобы попали в список, например: exclude=3,7,31.
По умолчанию: ''
exclude_tree(строка)
Укажите через запятую ID родительский страниц, которые вы хотите исключить из списка. Так же будут исключены все вложенные (дочерние страницы) указанных ID. Т.е. этот параметр исключает из списка все дерево страниц.
Добавлен в версии 2.7.
По умолчанию: ''
echo(логический)
Выводить результат на экран (true) или возвращать для обработки (false).
По умолчанию: true
link_before(строка)
Укажите здесь текст или HTML код, который будет вставлен перед текстом ссылки (внутри тега <a>). Добавлен в версии 2.7.
По умолчанию: ""
link_after(строка)
Укажите здесь текст или HTML код, который будет вставлен после текста ссылки (внутри тега <a>). Добавлен в версии 2.7.
По умолчанию: ""
before(строка)
HTML или текст, который расположить перед меню. С версии 4.4.
По умолчанию: '<ul>'
after(строка)
HTML или текст, который расположить после меню. С версии 4.4.
По умолчанию: '</ul>'
item_spacing(строка)
Оставлять или нет переносы строк в HTML коде меню. Может быть: preserve или discard. C WP 4.7.
По умолчанию: 'preserve'
walker(Walker)
Экземпляр объекта Walker, который будет строить меню. С версии 4.4.
По умолчанию: пусто (Walker_Page)

Примеры

1

#1 Ссылка на главную

Добавим в список ссылку на главную страницу сайта (show_home=1). Также, исключим страницы (exclude=5,9,23), добавим свой класс к оборачивающему div (menu_class=page-navi) и упорядочим ссылки по колонке (sort_column=menu_order):

<h2>Меню страниц</h2>
<?php wp_page_menu('show_home=1&exclude=5,9,23&menu_class=page-navi&sort_column=menu_order'); ?>
0

#2 Укажем название ссылки на главную страницу (анкор):

<?php wp_page_menu( 'show_home=Домашняя страница' ); ?>

или так

<?php wp_page_menu( array( 'show_home' => 'Домашняя страница' ) ); ?>
0

#3 Выведем только ссылку на главную страницу:

wp_page_menu('show_home=1&include=9999');

CSS классы используемые в меню

CSS классы добавляемые в <li> элементы меню к каждой ссылке, в зависимости от её значения в меню.

.page_item - ко всем элементам списка, которые ведут на статическую страницу. Так, для главной страницы этот класс не указывается.

.page-item-$ID - ко всем элементам списка. $ID - это ID страницы.

.current_page_item - для страницы, которая просматривается в текущий момент.

.current_page_parent - для родительской страницы страницы, которая просматривается в текущий момент (текущая страница будет дочерней).

.current_page_ancestor - для всех страниц, которые находятся на одном уровне с просматриваемой страницей.

Список изменений

С версии 2.7.0 Введена.
С версии 4.4.0 Added menu_id, container, before, after, and walker arguments.
С версии 4.7.0 Added the item_spacing argument.

Код wp_page_menu() WP 6.4.3

function wp_page_menu( $args = array() ) {
	$defaults = array(
		'sort_column'  => 'menu_order, post_title',
		'menu_id'      => '',
		'menu_class'   => 'menu',
		'container'    => 'div',
		'echo'         => true,
		'link_before'  => '',
		'link_after'   => '',
		'before'       => '<ul>',
		'after'        => '</ul>',
		'item_spacing' => 'discard',
		'walker'       => '',
	);
	$args     = wp_parse_args( $args, $defaults );

	if ( ! in_array( $args['item_spacing'], array( 'preserve', 'discard' ), true ) ) {
		// Invalid value, fall back to default.
		$args['item_spacing'] = $defaults['item_spacing'];
	}

	if ( 'preserve' === $args['item_spacing'] ) {
		$t = "\t";
		$n = "\n";
	} else {
		$t = '';
		$n = '';
	}

	/**
	 * Filters the arguments used to generate a page-based menu.
	 *
	 * @since 2.7.0
	 *
	 * @see wp_page_menu()
	 *
	 * @param array $args An array of page menu arguments. See wp_page_menu()
	 *                    for information on accepted arguments.
	 */
	$args = apply_filters( 'wp_page_menu_args', $args );

	$menu = '';

	$list_args = $args;

	// Show Home in the menu.
	if ( ! empty( $args['show_home'] ) ) {
		if ( true === $args['show_home'] || '1' === $args['show_home'] || 1 === $args['show_home'] ) {
			$text = __( 'Home' );
		} else {
			$text = $args['show_home'];
		}
		$class = '';
		if ( is_front_page() && ! is_paged() ) {
			$class = 'class="current_page_item"';
		}
		$menu .= '<li ' . $class . '><a href="' . esc_url( home_url( '/' ) ) . '">' . $args['link_before'] . $text . $args['link_after'] . '</a></li>';
		// If the front page is a page, add it to the exclude list.
		if ( 'page' === get_option( 'show_on_front' ) ) {
			if ( ! empty( $list_args['exclude'] ) ) {
				$list_args['exclude'] .= ',';
			} else {
				$list_args['exclude'] = '';
			}
			$list_args['exclude'] .= get_option( 'page_on_front' );
		}
	}

	$list_args['echo']     = false;
	$list_args['title_li'] = '';
	$menu                 .= wp_list_pages( $list_args );

	$container = sanitize_text_field( $args['container'] );

	// Fallback in case `wp_nav_menu()` was called without a container.
	if ( empty( $container ) ) {
		$container = 'div';
	}

	if ( $menu ) {

		// wp_nav_menu() doesn't set before and after.
		if ( isset( $args['fallback_cb'] ) &&
			'wp_page_menu' === $args['fallback_cb'] &&
			'ul' !== $container ) {
			$args['before'] = "<ul>{$n}";
			$args['after']  = '</ul>';
		}

		$menu = $args['before'] . $menu . $args['after'];
	}

	$attrs = '';
	if ( ! empty( $args['menu_id'] ) ) {
		$attrs .= ' id="' . esc_attr( $args['menu_id'] ) . '"';
	}

	if ( ! empty( $args['menu_class'] ) ) {
		$attrs .= ' class="' . esc_attr( $args['menu_class'] ) . '"';
	}

	$menu = "<{$container}{$attrs}>" . $menu . "</{$container}>{$n}";

	/**
	 * Filters the HTML output of a page-based menu.
	 *
	 * @since 2.7.0
	 *
	 * @see wp_page_menu()
	 *
	 * @param string $menu The HTML output.
	 * @param array  $args An array of arguments. See wp_page_menu()
	 *                     for information on accepted arguments.
	 */
	$menu = apply_filters( 'wp_page_menu', $menu, $args );

	if ( $args['echo'] ) {
		echo $menu;
	} else {
		return $menu;
	}
}