Здравствуйте!
Появилась необходимость добавить условную логику к пунктам меню.
Плагин If Menu отпадает по той причине, что при его использовании он модифицирует пункты меню и мои правки с ACF для добавления иконок перестают работать.
Выход - добавить доп. поле при помощи ACF к пунктам меню. Для этого использую поле True / False
Некоторые пункты меню хочу отображать только авторизованным пользователям ( is_user_logged_in() )
На сайте использую кастомный walker
<?php # -*- coding: utf-8 -*-
/**
* Create a nav menu with very basic markup.
*
* @author Thomas Scholz http://toscho.de
* @version 1.0
*/
class menu_walker extends Walker_Nav_Menu
{
/**
* Start the element output.
*
* @param string $output Passed by reference. Used to append additional content.
* @param object $item Menu item data object.
* @param int $depth Depth of menu item. May be used for padding.
* @param array $args Additional strings.
* @return void
*/
//public function start_el( &$output, $item, $depth, $args )
public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 )
{
$output .= '<li>';
$attributes = 'class="app-menu__item"';
// if ( $args->has_children ) {
// $attributes = 'class="app-menu__item" data-toggle="treeview"';
// } else {
// $attributes = 'class="app-menu__item"';
// }
! empty ( $item->attr_title )
// Avoid redundant titles
and $item->attr_title !== $item->title
and $attributes .= ' title="' . esc_attr( $item->attr_title ) .'"';
! empty ( $item->url )
and $attributes .= ' href="' . esc_attr( $item->url ) .'"';
$attributes = trim( $attributes );
$title = apply_filters( 'the_title', $item->title, $item->ID );
$font_awesome = get_field('font_awesome', $item);
// $item_output = "$args->before<a $attributes>$args->link_before$title</a>"
// . "$args->link_after$args->after";
$item_output = "$args->before"
. "<a $attributes>"
. "<i class='app-menu__icon " . $font_awesome ."'></i>"
. "$args->link_before"
. "$title"
. "$args->link_after"
. "</a>"
. "$args->after";
// Since $output is called by reference we don't need to return anything.
$output .= apply_filters(
'walker_nav_menu_start_el'
, $item_output
, $item
, $depth
, $args
);
}
/**
* @see Walker::start_lvl()
*
* @param string $output Passed by reference. Used to append additional content.
* @return void
*/
// public function start_lvl( &$output )
public function start_lvl( &$output, $depth = 0, $args = array() )
{
$output .= '<ul class="treeview-menu">';
}
/**
* @see Walker::end_lvl()
*
* @param string $output Passed by reference. Used to append additional content.
* @return void
*/
// public function end_lvl( &$output )
public function end_lvl( &$output, $depth = 0, $args = array() )
{
$output .= '</ul>';
}
/**
* @see Walker::end_el()
*
* @param string $output Passed by reference. Used to append additional content.
* @return void
*/
//function end_el( &$output )
function end_el( &$output, $item, $depth = 0, $args = array() )
{
$output .= '</li>';
}
}
Если использовать конструкцию вида:
if (is_user_logged_in() && get_field('display_for_logged_in_users', $item)) {
......
} else {
......
}
или
if (is_user_logged_in() && get_field('display_for_logged_in_users', $item)) {
......
} else if (!is_user_logged_in() && get_field('display_for_logged_in_users', $item)) {
......
}
то он либо отображает ВСЕ пункты меню при совпадении условий или же наоборот не отображает.
Как сделать, чтобы только 1 пункт меню отображался или скрывался в зависимости от выбранной опции.
Скриншоты -
https://screenshots.firefox.com/JNeU3lMH4HqmWN0o/m...
https://screenshots.firefox.com/3aQQ0SiaMx4pW8eO/m...