/home/arranoyd/telegastro/wp-content/plugins/restrict-user-access/admin/nav-menu.php
<?php
/**
 * @package Restrict User Access
 * @author Joachim Jensen <joachim@dev.institute>
 * @license GPLv3
 * @copyright 2020 by Joachim Jensen
 */

defined('ABSPATH') || exit;

final class RUA_Nav_Menu
{
    public function __construct()
    {
        $enabled = apply_filters('rua/module/nav_menu', true);

        if (!$enabled) {
            return;
        }

        if (is_admin()) {
            add_action(
                'wp_update_nav_menu_item',
                array($this,'update_item'),
                10,
                3
            );
            add_action(
                'wp_nav_menu_item_custom_fields',
                array($this,'render_level_option'),
                99,
                4
            );

            //filter added in wp5.4
            if (version_compare(get_bloginfo('version'), '5.4', '<')) {
                add_filter(
                    'wp_edit_nav_menu_walker',
                    array($this,'set_edit_walker'),
                    999
                );
            }
        } else {
            // 	add_action( 'pre_get_posts',
            // 		array($this,'filter_nav_menus_query'));

            add_filter(
                'wp_get_nav_menu_items',
                array($this,'filter_nav_menus'),
                10,
                3
            );
        }
    }

    /**
    * Filter navigation menu items by level
    *
    * @since  1.0
    * @param  array   $items
    * @param  string  $menu
    * @param  array   $args
    * @return array
    */
    public function filter_nav_menus($items, $menu, $args)
    {
        $user = rua_get_user();
        if (!$user->has_global_access()) {
            $user_levels = array_flip($user->get_level_ids());
            foreach ($items as $key => $item) {
                $menu_levels = get_post_meta($item->ID, '_menu_item_level', false);
                if ($menu_levels && !array_intersect_key($user_levels, array_flip($menu_levels))) {
                    unset($items[$key]);
                }
            }
        }
        return $items;
    }

    /**
     * Filter navigation menu items by level
     * using query
     * Might have better performance
     *
     * @since  1.0
     * @param  WP_Query  $query
     * @return void
     */
    public function filter_nav_menus_query($query)
    {
        if (isset($query->query['post_type'],$query->query['include']) && $query->query['post_type'] == 'nav_menu_item' && $query->query['include']) {
            $levels = rua_get_user()->get_level_ids();
            $meta_query = array();
            $meta_query[] = array(
                'key'     => '_menu_item_level',
                'value'   => 'wpbug',
                'compare' => 'NOT EXISTS'
            );
            if ($levels) {
                $meta_query['relation'] = 'OR';
                $meta_query[] = array(
                        'key'     => '_menu_item_level',
                        'value'   => $levels,
                        'compare' => 'IN'
                    );
            }
            $query->set('meta_query', $meta_query);
        }
    }

    /**
     * Update menu item
     *
     * @since  0.11
     * @param  int    $menu_id
     * @param  int    $menu_item_db_id
     * @param  array  $args
     * @return void
     */
    public function update_item($menu_id, $menu_item_db_id, $args)
    {
        if (!current_user_can(RUA_App::CAPABILITY)) {
            return false;
        }

        $key = '_menu_item_level';
        $request_key = 'menu-item-access-levels';

        $new_levels = isset($_POST[$request_key][$menu_item_db_id]) ? $_POST[$request_key][$menu_item_db_id] : array();

        //weird empty key.
        //possible bug if WP uses nav-menu-data json to mimic $_POST
        unset($new_levels['']);

        $menu_levels = array_flip(get_post_meta($menu_item_db_id, $key, false));

        foreach ($new_levels as $level) {
            if (isset($menu_levels[$level])) {
                unset($menu_levels[$level]);
            } else {
                add_post_meta($menu_item_db_id, $key, $level);
            }
        }
        foreach ($menu_levels as $level => $value) {
            delete_post_meta($menu_item_db_id, $key, $level);
        }
    }

    /**
     * Set menu items walker for edit
     *
     * @since 0.11
     */
    public function set_edit_walker()
    {
        // Guard for plugins using wp_edit_nav_menu_walker wrong
        if (!class_exists('Walker_Nav_Menu_Edit')) {
            require_once(ABSPATH . 'wp-admin/includes/class-walker-nav-menu-edit.php');
        }
        require_once(dirname(__FILE__) . '/walker-nav-menu.php');
        return 'RUA_Walker_Nav_Menu_Edit';
    }

    /**
     * Render level option on menu item
     *
     * @since  0.11
     * @param  int    $id
     * @param  [type] $item
     * @param  int    $depth
     * @param  array  $args
     * @return void
     */
    public function render_level_option($id, $item, $depth, $args)
    {
        if (!current_user_can(RUA_App::CAPABILITY)) {
            return false;
        }

        /**
         * Compat if a similar menu walker from an other plugin is used
         * @see walder-nav-menu.php
         */
        if (empty($id)) {
            $id = (int) $item->ID;
        }

        $levels = (array) get_post_meta($id, '_menu_item_level', false); ?>
<p class="field-access-levels description description-wide">
    <label for="edit-menu-item-access-levels-<?php echo $id; ?>">
        <?php _e('Access Levels', 'restrict-user-access'); ?>:

        <select style="width:100%;" class="js-rua-levels" multiple="multiple"
            id="edit-menu-item-access-levels-<?php echo $id; ?>"
            name="menu-item-access-levels[<?php echo $id; ?>][]"
            data-value="<?php echo esc_html(implode(',', $levels)); ?>">
        </select>
        <span class="description"><?php _e('Restrict menu item to users with these levels or higher.', 'restrict-user-access'); ?></span>
    </label>
</p>
<?php
    }
}