File "menu-settings.php"

Full Path: /home/mba/public_html/wp-content-20250807152928/plugins/user-menus/includes/classes/admin/menu-settings.php
File size: 7.32 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * Menu settings class.
 *
 * @package User Menus
 */

namespace JP\UM\Admin;

use JP\UM\Menu\Item;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class JP\UM\Admin\Menu_Settings
 */
class Menu_Settings {

	/**
	 * Init
	 */
	public static function init() {
		add_action( 'wp_nav_menu_item_custom_fields', [ __CLASS__, 'fields' ], 10, 4 );
		add_action( 'wp_update_nav_menu_item', [ __CLASS__, 'save' ], 10, 2 );
	}

	/**
	 * Render fields for each menu item.
	 *
	 * @param int    $item_id Item ID.
	 * @param object $item Item object.
	 * @param int    $depth Current menu item depth.
	 * @param array  $args Additional array of arguments.
	 */
	public static function fields( $item_id, $item, $depth, $args ) {
		$allowed_user_roles = static::allowed_user_roles();

		wp_nonce_field( 'jpum-menu-editor-nonce', 'jpum-menu-editor-nonce' ); ?>

		<p class="nav_item_options-avatar_size  description  description-wide">

			<label for="jp_nav_item_options-avatar_size-<?php echo esc_attr( $item->ID ); ?>">

					<?php echo esc_html( __( 'Avatar Size', 'user-menus' ) ); ?><br />

				<input type="number" min="0" step="1" name="jp_nav_item_options[<?php echo esc_attr( $item->ID ); ?>][avatar_size]" id="jp_nav_item_options-avatar_size-<?php echo esc_attr( $item->ID ); ?>" value="<?php echo esc_attr( $item->avatar_size ); ?>" class="widefat  code" />

			</label>

		</p>


		<?php

		$which_users_options = [
			''           => __( 'Everyone', 'user-menus' ),
			'logged_out' => __( 'Logged Out Users', 'user-menus' ),
			'logged_in'  => __( 'Logged In Users', 'user-menus' ),
		];

		if ( in_array( $item->object, [ 'login', 'register', 'logout' ], true ) ) :
			$redirect_types = [
				'current' => __( 'Current Page', 'user-menus' ),
				'home'    => __( 'Home Page', 'user-menus' ),
				'custom'  => __( 'Custom URL', 'user-menus' ),
			];
			?>

			<p class="nav_item_options-redirect_type  description  description-wide">

				<label for="jp_nav_item_options-redirect_type-<?php echo esc_attr( $item->ID ); ?>">

					<?php echo esc_html( __( 'Where should users be taken afterwards?', 'user-menus' ) ); ?><br />

					<select name="jp_nav_item_options[<?php echo esc_attr( $item->ID ); ?>][redirect_type]" id="jp_nav_item_options-redirect_type-<?php echo esc_attr( $item->ID ); ?>" class="widefat">
						<?php foreach ( $redirect_types as $option => $label ) : ?>
							<option value="<?php echo $option; ?>" <?php /*phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped */ selected( $option, $item->redirect_type ); ?>>
								<?php echo esc_html( $label ); ?>
							</option>
						<?php endforeach; ?>
					</select>

				</label>

			</p>

			<p class="nav_item_options-redirect_url  description  description-wide">

				<label for="jp_nav_item_options-redirect_url-<?php echo esc_attr( $item->ID ); ?>">

					<?php echo esc_html( __( 'Enter a url user should be redirected to', 'user-menus' ) ); ?><br />

					<input type="text" name="jp_nav_item_options[<?php echo esc_attr( $item->ID ); ?>][redirect_url]" id="jp_nav_item_options-redirect_url-<?php echo esc_attr( $item->ID ); ?>" value="<?php echo esc_attr( $item->redirect_url ); ?>" class="widefat  code" />

				</label>

			</p>

			<p class="nav_item_options-which_users  description  description-wide">

				<label for="jp_nav_item_options-which_users-<?php echo esc_attr( $item->ID ); ?>">

					<?php echo esc_html( __( 'Who can see this link?', 'user-menus' ) ); ?>

				</label>

				<select n id="jp_nav_item_options-which_users-<?php echo esc_attr( $item->ID ); ?>" class="widefat" disabled="disabled">
					<option>
					<?php
					if ( 'logout' === $item->object ) {
						echo esc_html( $which_users_options['logged_in'] );
					} else {
						echo esc_html( $which_users_options['logged_out'] );
					}
					?>
					</option>
				</select>

			</p>

		<?php else : ?>

			<p class="nav_item_options-which_users  description  description-wide">

				<label for="jp_nav_item_options-which_users-<?php echo esc_attr( $item->ID ); ?>">

					<?php echo esc_html( __( 'Who can see this link?', 'user-menus' ) ); ?><br />

					<select name="jp_nav_item_options[<?php echo esc_attr( $item->ID ); ?>][which_users]" id="jp_nav_item_options-which_users-<?php echo esc_attr( $item->ID ); ?>" class="widefat">
							<?php foreach ( $which_users_options as $option => $label ) : ?>
							<option value="<?php echo $option; ?>" <?php /*phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped */ selected( $option, $item->which_users ); ?>>
									<?php echo esc_html( $label ); ?>
							</option>
						<?php endforeach; ?>
					</select>

				</label>

			</p>

			<p class="nav_item_options-can_see  description  description-wide">

				<label>
					<input type="radio" name="jp_nav_item_options[<?php echo esc_attr( $item->ID ); ?>][can_see]" value="yes" <?php checked( $item->can_see, 'yes' ); ?>/>
								<?php echo esc_html( __( 'Choose which roles can see this link', 'user-menus' ) ); ?>
				</label>

				<br />

				<label>
					<input type="radio" name="jp_nav_item_options[<?php echo esc_attr( $item->ID ); ?>][can_see]" value="no" <?php checked( $item->can_see, 'no' ); ?>/>
								<?php echo esc_html( __( 'Choose which roles won\'t see this link', 'user-menus' ) ); ?>
				</label>

			</p>

			<p class="nav_item_options-roles  description  description-wide">

				<?php foreach ( $allowed_user_roles as $option => $label ) : ?>
					<label> <input type="checkbox" name="jp_nav_item_options[<?php echo esc_attr( $item->ID ); ?>][roles][]" value="<?php echo $option; ?>" <?php /*phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped */ checked( in_array( esc_attr( $option ), $item->roles, true ), true ); ?>/>
						<?php echo esc_html( $label ); ?>
					</label>
				<?php endforeach; ?>

			</p>

			<?php
		endif;
	}

	/**
	 * Get array of allowed user roles.
	 *
	 * @return array
	 */
	public static function allowed_user_roles() {
		global $wp_roles;

		static $roles;

		if ( ! isset( $roles ) ) {
			$roles = apply_filters( 'jpum_user_roles', $wp_roles->role_names );

			if ( ! is_array( $roles ) || empty( $roles ) ) {
				$roles = [];
			}
		}

		return $roles;
	}

	/**
	 * Save menu item data.
	 *
	 * @param int $menu_id Menu ID.
	 * @param int $item_id Item ID.
	 */
	public static function save( $menu_id, $item_id ) {
		$allowed_roles = static::allowed_user_roles();

		if ( empty( $_POST['jp_nav_item_options'][ $item_id ] ) || ! isset( $_POST['jpum-menu-editor-nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['jpum-menu-editor-nonce'] ) ), 'jpum-menu-editor-nonce' ) ) {
			return;
		}

		/* phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized */
		$item_options = Item::parse_options( wp_unslash( $_POST['jp_nav_item_options'][ $item_id ] ) );

		if ( 'logged_in' === $item_options['which_users'] ) {
			// Validate chosen roles and remove non-allowed roles.
			foreach ( (array) $item_options['roles'] as $key => $role ) {
				if ( ! array_key_exists( $role, $allowed_roles ) ) {
					unset( $item_options['roles'][ $key ] );
				}
			}
		} else {
			unset( $item_options['roles'] );
		}

		// Remove empty options to save space.
		$item_options = array_filter( $item_options );

		if ( ! empty( $item_options ) ) {
			update_post_meta( $item_id, '_jp_nav_item_options', $item_options );
		} else {
			delete_post_meta( $item_id, '_jp_nav_item_options' );
		}
	}
}

Menu_Settings::init();