azerphoenix
@azerphoenix
Java Software Engineer

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

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

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

Войти через центр авторизации
Похожие вопросы