Некоторые списки отображения не могут быть упорядочены автоматически. Это касается периодически обновляемых списков категорий товара, порядок в которых зависит от конъюнктуры.
Заставлять менеджеров сайта выставлять весовые коэффициенты для автоматизации вывода списка, особенно если часть пунктов временами необходимо скрыть — бесчеловечно.
На помощь в данном случае приходят стандартные меню WordPress.
Общая идея решения — менеджер сайта создает меню и вручную выставляет порядок пунктов. Так можно подготовить варианты списков для каждого праздника, в том числе — вариант «по умолчанию», который может легко меняться вручную чуть ли не каждую минуту.
Наша задача — отобразить то, на что ссылаются пункты меню.
Программное решение будет состоять из двух частей — стандартная регистрация меню, и код, который выводит «меню» на странице.
1. Регистрация меню
Это самое простое:
function register_my_menus() { register_nav_menus( array( 'custom-menu' => "Порядок товаров на странице \"XYZ\"" ) ); } add_action( 'init', 'register_my_menus' );
Как правило, тема оформления уже содержит одно или несколько определений меню. В таком случае, наш пример будет выглядеть так (также добавим локализацию):
function register_my_menus() { register_nav_menus( array( 'first-menu' => __("First Menu"), 'second-menu' => __("Second Menu"), 'custom-menu' => __("Items on XYZ page") ) ); } add_action( 'init', 'register_my_menus' );
2. Вывод меню
Прежде всего, необходимо получить список зарегистрированных меню, выбрать из них нужное:
$locations = get_nav_menu_locations(); $menu = wp_get_nav_menu_object($locations['custom-menu']);
Далее — получаем список пунктов меню и в цикле перебираем их:
$menu_items = wp_get_nav_menu_items($menu->term_id); foreach ( (array) $menu_items as $key => $menu_item ) { // ... }
Следует отметить, что объект $menu_item на каждой итерации содержит ссылку на соответствующую запись, помещенную в меню. Из всех элементов объекта нас будут интересовать:
- $menu_item->url — адрес страницы, добавленной в меню
- $menu_item->title — заголовок пункта меню (по умолчанию совпадает с заголовком страницы)
- $menu_item->object_id — идентификатор страницы. Этот идентификатор можно использовать для получения связанного со страницей изображения, метаданных страницы и т.п.
В нашем примере покажем вставку ссылки на страницу, укажем заголовок из меню и добавим миниатюру записи.
Готовый фрагмент кода будет выглядеть так:
$out = array(); $locations = get_nav_menu_locations(); $menu = wp_get_nav_menu_object($locations['custom-menu']); $menu_items = wp_get_nav_menu_items($menu->term_id); $out[] = "<h1>Акционный товар</h1>\n"; foreach ( (array) $menu_items as $key => $menu_item ) { $out[] = "<div><!--товар-->\n"; $out[] = " <a href=\"".$menu_item->url."\" title=\"".$menu_item->title."\"><img src=\"".wp_get_attachment_url( get_post_thumbnail_id($menu_item->object_id) )."\" alt=\"\" /></a>\n"; $out[] = " <div class=\"details\">\n"; $out[] = " <h2>".$menu_item->title."</h2>\n"; $out[] = " <a href=\"".$menu_item->url."\" title=\"Подробнее\">Подробнее</a>\n"; $out[] = " </div>\n"; $out[] = "</div><!--//товар-->\n"; } echo join($out);