@azerphoenix

Как при помощи ACF добавить условную логику к пунктам меню?

Здравствуйте!
Появилась необходимость добавить условную логику к пунктам меню.
Плагин 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...
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
HeadOnFire
@HeadOnFire
WordPress Evangelist
У вас вокер работает с каждым элементом по очереди, а сам элемент доступен в $item. Проверяйте еще его имя / слаг / ID. Получится 3 проверки:

- нужный $item
- пользователь авторизован
- и только тогда смотрим значение поля
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
AwardWallet Пермь
от 45 000 до 60 000 руб.
While Web Production Киев
от 5 000 до 15 000 грн.
Dart Simple Санкт-Петербург
от 120 000 до 150 000 руб.
20 авг. 2018, в 19:05
3000 руб./за проект
20 авг. 2018, в 18:36
500 руб./в час
20 авг. 2018, в 18:25
10000 руб./за проект