diff --git a/includes/admin/assets/js/um-admin-nav-menu.js b/includes/admin/assets/js/um-admin-nav-menu.js new file mode 100644 index 00000000..8450a0ef --- /dev/null +++ b/includes/admin/assets/js/um-admin-nav-menu.js @@ -0,0 +1,36 @@ +jQuery(document).ready(function ($) { + var template = wp.template( 'um-nav-menus-fields' ); + + $( document ).on( 'menu-item-added', function ( e, $menuMarkup ) { + var id = $( $menuMarkup ).attr('id').substr(10); + + var template_content = template({ + menuItemID: id, + restriction_data:{ + um_nav_public:0, + um_nav_roles:[] + } + }); + + if ( $( $menuMarkup ).find( 'fieldset.field-move' ).length > 0 ) { + $( $menuMarkup ).find( 'fieldset.field-move' ).before( template_content ); + } else { + $( $menuMarkup ).find( '.menu-item-actions' ).before( template_content ); + } + }); + + + $( 'ul#menu-to-edit > li' ).each( function(){ + var id = $(this).attr('id').substr(10); + var template_content = template({ + menuItemID: id, + restriction_data: um_menu_restriction_data[ id ] + }); + + if ( $( this ).find( 'fieldset.field-move' ).length > 0 ) { + $( this ).find( 'fieldset.field-move' ).before( template_content ); + } else { + $( this ).find( '.menu-item-actions' ).before( template_content ); + } + }); +}); \ No newline at end of file diff --git a/includes/admin/core/class-admin-enqueue.php b/includes/admin/core/class-admin-enqueue.php index e26be8e7..74e818ce 100644 --- a/includes/admin/core/class-admin-enqueue.php +++ b/includes/admin/core/class-admin-enqueue.php @@ -339,6 +339,15 @@ if ( ! class_exists( 'Admin_Enqueue' ) ) { } + /*** + *** @Load jQuery custom code + ***/ + function load_nav_manus_scripts() { + + wp_register_script( 'um_admin_nav_manus', $this->js_url . 'um-admin-nav-menu.js', array('jquery','wp-util'), '', true ); + wp_enqueue_script( 'um_admin_nav_manus' ); + + } /*** *** @Load AJAX diff --git a/includes/core/um-navmenu-walker-edit.php b/includes/core/um-navmenu-walker-edit.php deleted file mode 100644 index c48c9010..00000000 --- a/includes/core/um-navmenu-walker-edit.php +++ /dev/null @@ -1,160 +0,0 @@ - __( 'Display Mode'), - 'um_nav_roles' => __('By Role') - - ); - } - - - public static function _save( $menu_id, $menu_item_db_id, $menu_item_args ) { - if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { - return; - } - - foreach ( self::$fields as $_key => $label ) { - - if( $_key == 'um_nav_roles' ){ - - $key = sprintf( 'menu-item-%s', $_key ); - - // Sanitize - if ( ! empty( $_POST[ $key ][ $menu_item_db_id ] ) ) { - // Do some checks here... - $value = $_POST[ $key ][ $menu_item_db_id ]; - } - else { - $value = null; - } - - }else{ - - $key = sprintf( 'menu-item-%s', $_key ); - - // Sanitize - if ( ! empty( $_POST[ $key ][ $menu_item_db_id ] ) ) { - // Do some checks here... - $value = $_POST[ $key ][ $menu_item_db_id ]; - } - else { - $value = null; - } - } - - // Update - if ( ! is_null( $value ) ) { - update_post_meta( $menu_item_db_id, $key, $value ); - } - else { - delete_post_meta( $menu_item_db_id, $key ); - } - } - } - - public static function _fields( $id, $item, $depth, $args ) { - ?> - -
- -
- -

- - $label ) { - $key = sprintf('menu-item-%s', $_key); - $id = sprintf('edit-%s-%s', $key, $item->ID); - $name = sprintf('%s[%s]', $key, $item->ID); - $value = get_post_meta($item->ID, $key, true); - $role_name = sprintf('%s[%s][]', $key, $item->ID); - $class = sprintf('field-%s', $_key); ?> - - - -

- -

- - - -

-
- - roles()->get_roles(); - $i = 0; - $html = ''; - $columns = 2; - while ( $i < $columns ) { - $per_page = ceil( count( $options ) / $columns ); - $section_fields_per_page = array_slice( $options, $i*$per_page, $per_page ); - $html .= ''; - - foreach ( $section_fields_per_page as $k => $title ) { - $id_attr = ' id="' . $id . '_' . $k . '" '; - $for_attr = ' for="' . $id . '_' . $k . '" '; - $name_attr = ' name="' . $role_name . '" '; - - $html .= ""; - } - - $html .= ''; - $i++; - } - - echo $html; ?> -

- - -
- -
- - get_fields( $item, $depth, $args, $id ) ){ - //$item_output = preg_replace('/(?=]+class="[^"]*submitbox)/', $new_fields, $item_output); - $item_output = preg_replace('/(?=<(fieldset|p)[^>]+class="[^"]*field-move)/', $new_fields, $item_output); - } - - $output .= $item_output; - - } - - public function get_fields( $item, $depth, $args = array(), $id = 0 ) { - ob_start(); - - if( isset( $item->ID ) ){ - $id = esc_attr( $item->ID ); - } - - do_action( 'wp_nav_menu_item_custom_fields', $id, $item, $depth, $args ); - - return ob_get_clean(); - } -} - -endif; \ No newline at end of file diff --git a/includes/core/um-navmenu-walker.php b/includes/core/um-navmenu-walker.php deleted file mode 100644 index 98e2f40b..00000000 --- a/includes/core/um-navmenu-walker.php +++ /dev/null @@ -1,34 +0,0 @@ -get_fields( $item, $depth, $args, $id ) ){ - //$item_output = preg_replace('/(?=]+class="[^"]*submitbox)/', $new_fields, $item_output); - $item_output = preg_replace('/(?=<(fieldset|p)[^>]+class="[^"]*field-move)/', $new_fields, $item_output); - } - - $output .= $item_output; - - } - - public function get_fields( $item, $depth, $args = array(), $id = 0 ) { - ob_start(); - - if( isset( $item->ID ) ){ - $id = esc_attr( $item->ID ); - } - - do_action( 'wp_nav_menu_item_custom_fields', $id, $item, $depth, $args ); - - return ob_get_clean(); - } -} - -endif; \ No newline at end of file diff --git a/includes/core/um-navmenu.php b/includes/core/um-navmenu.php index e474e9bc..38344277 100644 --- a/includes/core/um-navmenu.php +++ b/includes/core/um-navmenu.php @@ -1,58 +1,196 @@ options()->get( 'menu_item_workaround' ) ) { - //hard rewrite workaround with conflicted themes/plugins - $walker = 'Walker_Nav_Menu_Edit'; - } - - $walker_filename = dirname( __FILE__ ) . '/um-navmenu-walker.php'; - $walker_template = file_get_contents( dirname( __FILE__ ) . '/um-navmenu-walker-template.php' ); - - $current_walker_content = file_get_contents( $walker_filename ); - if ( strpos( $current_walker_content, $um_walker ) === false || - strpos( $current_walker_content, $walker ) === false ) { - - $walker_template = str_replace( - array( - '{{{%um_navmenu_walker%}}}', - '{{{%parent_walker%}}}' - ), - array( - $um_walker, - $walker - ), - $walker_template + self::$fields = array( + 'um_nav_public' => __( 'Display Mode' ), + 'um_nav_roles' => __( 'By Role' ) ); - $fp = fopen( $walker_filename, 'w+' ); - fwrite( $fp, $walker_template ); - fclose( $fp ); + add_action( 'wp_update_nav_menu_item', array( __CLASS__, '_save' ), 10, 3 ); + //add_filter( 'manage_nav-menus_columns', array( __CLASS__, '_columns' ), 99 ); + + add_action( 'load-nav-menus.php', array( __CLASS__, 'enqueue_nav_menus_scripts' ) ); + add_action( 'admin_footer-nav-menus.php', array( __CLASS__, '_wp_template' ) ); } - require_once $walker_filename; - return $um_walker; + + + /** + * @param $menu_id + * @param $menu_item_db_id + * @param $menu_item_args + */ + public static function _save( $menu_id, $menu_item_db_id, $menu_item_args ) { + if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { + return; + } + + foreach ( self::$fields as $_key => $label ) { + + if ( $_key == 'um_nav_roles' ) { + + $key = sprintf( 'menu-item-%s', $_key ); + + // Sanitize + if ( ! empty( $_POST[ $key ][ $menu_item_db_id ] ) ) { + // Do some checks here... + $value = $_POST[ $key ][ $menu_item_db_id ]; + } else { + $value = null; + } + + } else { + + $key = sprintf( 'menu-item-%s', $_key ); + + // Sanitize + if ( ! empty( $_POST[ $key ][ $menu_item_db_id ] ) ) { + // Do some checks here... + $value = $_POST[ $key ][ $menu_item_db_id ]; + } else { + $value = null; + } + } + + // Update + if ( ! is_null( $value ) ) { + update_post_meta( $menu_item_db_id, $key, $value ); + } else { + delete_post_meta( $menu_item_db_id, $key ); + } + } + } + + + /** + * @param $columns + * + * @return array + */ + public static function _columns( $columns ) { + $columns = array_merge( $columns, self::$fields ); + + return $columns; + } + + + /** + * + */ + public static function enqueue_nav_menus_scripts() { + add_action( 'admin_enqueue_scripts', array( __CLASS__, 'admin_enqueue_scripts' ) ); + } + + + /** + * + */ + public static function admin_enqueue_scripts() { + UM()->admin_enqueue()->load_nav_manus_scripts(); + + $menus = get_posts( 'post_type=nav_menu_item&numberposts=-1' ); + $menu_restriction_data = array(); + + foreach ( $menus as $data ) { + $_nav_roles_meta = get_post_meta( $data->ID, 'menu-item-um_nav_roles', true ); + + $um_nav_roles = array(); + if ( $_nav_roles_meta ) { + foreach ( $_nav_roles_meta as $key => $value ) { + if ( is_int( $key ) ) { + $um_nav_roles[] = $value; + } + } + } + + $menu_restriction_data[ $data->ID ] = array( + 'um_nav_public' => get_post_meta( $data->ID, 'menu-item-um_nav_public', true ), + 'um_nav_roles' => $um_nav_roles, + ); + } + wp_localize_script( 'um_admin_nav_manus', 'um_menu_restriction_data', $menu_restriction_data ); + } + + + /** + * + */ + public static function _wp_template() { + ?> + +