Вывод меню WordPress «вручную»

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

Заставлять менеджеров сайта выставлять весовые коэффициенты для автоматизации вывода списка, особенно если часть пунктов временами необходимо скрыть — бесчеловечно.

На помощь в данном случае приходят стандартные меню 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);

 

Добавить комментарий