/** * Ajax handler for adding a menu item. * * @since 3.1.0 */ function wp_ajax_add_menu_item() { check_ajax_referer('add-menu_item', 'menu-settings-column-nonce'); if (!current_user_can('edit_theme_options')) { wp_die(-1); } require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; // For performance reasons, we omit some object properties from the checklist. // The following is a hacky way to restore them when adding non-custom items. $menu_items_data = array(); foreach ((array) $_POST['menu-item'] as $menu_item_data) { if (!empty($menu_item_data['menu-item-type']) && 'custom' != $menu_item_data['menu-item-type'] && !empty($menu_item_data['menu-item-object-id'])) { switch ($menu_item_data['menu-item-type']) { case 'post_type': $_object = get_post($menu_item_data['menu-item-object-id']); break; case 'post_type_archive': $_object = get_post_type_object($menu_item_data['menu-item-object']); break; case 'taxonomy': $_object = get_term($menu_item_data['menu-item-object-id'], $menu_item_data['menu-item-object']); break; } $_menu_items = array_map('wp_setup_nav_menu_item', array($_object)); $_menu_item = reset($_menu_items); // Restore the missing menu item properties $menu_item_data['menu-item-description'] = $_menu_item->description; } $menu_items_data[] = $menu_item_data; } $item_ids = wp_save_nav_menu_items(0, $menu_items_data); if (is_wp_error($item_ids)) { wp_die(0); } $menu_items = array(); foreach ((array) $item_ids as $menu_item_id) { $menu_obj = get_post($menu_item_id); if (!empty($menu_obj->ID)) { $menu_obj = wp_setup_nav_menu_item($menu_obj); $menu_obj->label = $menu_obj->title; // don't show "(pending)" in ajax-added items $menu_items[] = $menu_obj; } } /** This filter is documented in wp-admin/includes/nav-menu.php */ $walker_class_name = apply_filters('wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $_POST['menu']); if (!class_exists($walker_class_name, false)) { wp_die(0); } if (!empty($menu_items)) { $args = array('after' => '', 'before' => '', 'link_after' => '', 'link_before' => '', 'walker' => new $walker_class_name()); echo walk_nav_menu_tree($menu_items, 0, (object) $args); } wp_die(); }
wp_enqueue_script('postbox'); // Container for any messages displayed to the user $messages = array(); // Container that stores the name of the active menu $nav_menu_selected_title = ''; // The menu id of the current menu being edited $nav_menu_selected_id = isset($_REQUEST['menu']) ? (int) $_REQUEST['menu'] : 0; // Allowed actions: add, update, delete $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'edit'; switch ($action) { case 'add-menu-item': check_admin_referer('add-menu_item', 'menu-settings-column-nonce'); if (isset($_REQUEST['nav-menu-locations'])) { set_theme_mod('nav_menu_locations', array_map('absint', $_REQUEST['menu-locations'])); } elseif (isset($_REQUEST['menu-item'])) { wp_save_nav_menu_items($nav_menu_selected_id, $_REQUEST['menu-item']); } break; case 'move-down-menu-item': // moving down a menu item is the same as moving up the next in order check_admin_referer('move-menu_item'); $menu_item_id = isset($_REQUEST['menu-item']) ? (int) $_REQUEST['menu-item'] : 0; if (is_nav_menu_item($menu_item_id)) { $menus = isset($_REQUEST['menu']) ? array((int) $_REQUEST['menu']) : wp_get_object_terms($menu_item_id, 'nav_menu', array('fields' => 'ids')); if (!is_wp_error($menus) && !empty($menus[0])) { $menu_id = (int) $menus[0]; $ordered_menu_items = wp_get_nav_menu_items($menu_id); $menu_item_data = (array) wp_setup_nav_menu_item(get_post($menu_item_id)); // set up the data we need in one pass through the array of menu items $dbids_to_orders = array(); $orders_to_dbids = array();
} // Set menu locations set_theme_mod('nav_menu_locations', $menu_locations); // Add Menu if (0 == $nav_menu_selected_id) { $new_menu_title = trim(esc_html($_POST['menu-name'])); if ($new_menu_title) { $_nav_menu_selected_id = wp_update_nav_menu_object(0, array('menu-name' => $new_menu_title)); if (is_wp_error($_nav_menu_selected_id)) { $messages[] = '<div id="message" class="error"><p>' . $_nav_menu_selected_id->get_error_message() . '</p></div>'; } else { $_menu_object = wp_get_nav_menu_object($_nav_menu_selected_id); $nav_menu_selected_id = $_nav_menu_selected_id; $nav_menu_selected_title = $_menu_object->name; if (isset($_REQUEST['menu-item'])) { wp_save_nav_menu_items($nav_menu_selected_id, absint($_REQUEST['menu-item'])); } if (isset($_REQUEST['zero-menu-state'])) { // If there are menu items, add them wp_nav_menu_update_menu_items($nav_menu_selected_id, $nav_menu_selected_title); // Auto-save nav_menu_locations $locations = get_nav_menu_locations(); foreach ($locations as $location => $menu_id) { $locations[$location] = $nav_menu_selected_id; break; // There should only be 1 } set_theme_mod('nav_menu_locations', $locations); } if (isset($_REQUEST['use-location'])) { $locations = get_registered_nav_menus();
function avia_ajax_switch_menu_walker() { if (!current_user_can('edit_theme_options')) { die('-1'); } check_ajax_referer('add-menu_item', 'menu-settings-column-nonce'); require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; $item_ids = wp_save_nav_menu_items(0, $_POST['menu-item']); if (is_wp_error($item_ids)) { die('-1'); } foreach ((array) $item_ids as $menu_item_id) { $menu_obj = get_post($menu_item_id); if (!empty($menu_obj->ID)) { $menu_obj = wp_setup_nav_menu_item($menu_obj); $menu_obj->label = $menu_obj->title; // don't show "(pending)" in ajax-added items $menu_items[] = $menu_obj; } } if (!empty($menu_items)) { $args = array('after' => '', 'before' => '', 'link_after' => '', 'link_before' => '', 'walker' => new avia_backend_walker()); echo walk_nav_menu_tree($menu_items, 0, (object) $args); } die('end'); }
switch ($menu_item_data['menu-item-type']) { case 'post_type': $_object = get_post($menu_item_data['menu-item-object-id']); break; case 'taxonomy': $_object = get_term($menu_item_data['menu-item-object-id'], $menu_item_data['menu-item-object']); break; } $_menu_items = array_map('wp_setup_nav_menu_item', array($_object)); $_menu_item = array_shift($_menu_items); // Restore the missing menu item properties $menu_item_data['menu-item-description'] = $_menu_item->description; } $menu_items_data[] = $menu_item_data; } $item_ids = wp_save_nav_menu_items(0, $menu_items_data); if (is_wp_error($item_ids)) { die('-1'); } foreach ((array) $item_ids as $menu_item_id) { $menu_obj = get_post($menu_item_id); if (!empty($menu_obj->ID)) { $menu_obj = wp_setup_nav_menu_item($menu_obj); $menu_obj->label = $menu_obj->title; // don't show "(pending)" in ajax-added items $menu_items[] = $menu_obj; } } if (!empty($menu_items)) { $args = array('after' => '', 'before' => '', 'link_after' => '', 'link_before' => '', 'walker' => new Walker_Nav_Menu_Edit()); echo walk_nav_menu_tree($menu_items, 0, (object) $args);
/** * Saves wordpress menu using ajax calls * * @return json messages from nav-menus.php * @author **/ public function wp_ajax_oxy_save_menu() { @error_reporting(0); // Don't break the JSON result // parse variables sent from $.serialize into an array $oxy_menu_to_save = json_decode(stripslashes($_POST['menu']), true); // set request and post to parsed menu data to fake the request $_REQUEST = $oxy_menu_to_save; $_POST = $oxy_menu_to_save; require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; // Container for any messages displayed to the user $messages = array(); // Container that stores the name of the active menu $nav_menu_selected_title = ''; // The menu id of the current menu being edited $nav_menu_selected_id = isset($_REQUEST['menu']) ? (int) $_REQUEST['menu'] : 0; // Get existing menu locations assignments $locations = get_registered_nav_menus(); $menu_locations = get_nav_menu_locations(); $num_locations = count(array_keys($locations)); check_admin_referer('update-nav_menu', 'update-nav-menu-nonce'); // Remove menu locations that have been unchecked foreach ($locations as $location => $description) { if ((empty($_POST['menu-locations']) || empty($_POST['menu-locations'][$location])) && isset($menu_locations[$location]) && $menu_locations[$location] == $nav_menu_selected_id) { unset($menu_locations[$location]); } } // Merge new and existing menu locations if any new ones are set if (isset($_POST['menu-locations'])) { $new_menu_locations = array_map('absint', $_POST['menu-locations']); $menu_locations = array_merge($menu_locations, $new_menu_locations); } // Set menu locations set_theme_mod('nav_menu_locations', $menu_locations); // Add Menu if (0 == $nav_menu_selected_id) { $new_menu_title = trim(esc_html($_POST['menu-name'])); if ($new_menu_title) { $_nav_menu_selected_id = wp_update_nav_menu_object(0, array('menu-name' => $new_menu_title)); if (is_wp_error($_nav_menu_selected_id)) { $messages[] = '<div id="message" class="error"><p>' . $_nav_menu_selected_id->get_error_message() . '</p></div>'; } else { $_menu_object = wp_get_nav_menu_object($_nav_menu_selected_id); $nav_menu_selected_id = $_nav_menu_selected_id; $nav_menu_selected_title = $_menu_object->name; if (isset($_REQUEST['menu-item'])) { wp_save_nav_menu_items($nav_menu_selected_id, absint($_REQUEST['menu-item'])); } if (isset($_REQUEST['zero-menu-state'])) { // If there are menu items, add them wp_nav_menu_update_menu_items($nav_menu_selected_id, $nav_menu_selected_title); // Auto-save nav_menu_locations $locations = get_nav_menu_locations(); foreach ($locations as $location => $menu_id) { $locations[$location] = $nav_menu_selected_id; break; // There should only be 1 } set_theme_mod('nav_menu_locations', $locations); } if (isset($_REQUEST['use-location'])) { $locations = get_registered_nav_menus(); $menu_locations = get_nav_menu_locations(); if (isset($locations[$_REQUEST['use-location']])) { $menu_locations[$_REQUEST['use-location']] = $nav_menu_selected_id; } set_theme_mod('nav_menu_locations', $menu_locations); } // $messages[] = '<div id="message" class="updated"><p>' . sprintf(__('<strong>%s</strong> has been created.'), $nav_menu_selected_title) . '</p></div>'; wp_redirect(admin_url('nav-menus.php?menu=' . $_nav_menu_selected_id)); exit; } } else { $messages[] = '<div id="message" class="error"><p>' . __('Please enter a valid menu name.', 'lambda-admin-td') . '</p></div>'; } // Update existing menu } else { $_menu_object = wp_get_nav_menu_object($nav_menu_selected_id); $menu_title = trim(esc_html($_POST['menu-name'])); if (!$menu_title) { $messages[] = '<div id="message" class="error"><p>' . __('Please enter a valid menu name.', 'lambda-admin-td') . '</p></div>'; $menu_title = $_menu_object->name; } if (!is_wp_error($_menu_object)) { $_nav_menu_selected_id = wp_update_nav_menu_object($nav_menu_selected_id, array('menu-name' => $menu_title)); if (is_wp_error($_nav_menu_selected_id)) { $_menu_object = $_nav_menu_selected_id; $messages[] = '<div id="message" class="error"><p>' . $_nav_menu_selected_id->get_error_message() . '</p></div>'; } else { $_menu_object = wp_get_nav_menu_object($_nav_menu_selected_id); $nav_menu_selected_title = $_menu_object->name; } } // Update menu items if (!is_wp_error($_menu_object)) { $messages = array_merge($messages, wp_nav_menu_update_menu_items($nav_menu_selected_id, $nav_menu_selected_title)); } } header('Content-Type: application/json'); echo json_encode(array('messages' => $messages, 'nav_menu_selected_id' => $nav_menu_selected_id)); die; }
/** * Ajax handler for adding a menu item. Based on wp_ajax_add_menu_item(). * * @since Menu Customizer 0.0. */ function menu_customizer_add_item_ajax() { check_ajax_referer('customize-menus', 'customize-menu-item-nonce'); if (!current_user_can('edit_theme_options')) { wp_die(-1); } require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; $menu_item_data = (array) $_POST['menu-item']; $menu_id = absint($_POST['menu']); // Used only for display, new item is created as an orphan - menu id of 0. $id = 0; // For performance reasons, we omit some object properties from the checklist. // The following is a hacky way to restore them when adding non-custom items. // @todo: do we really need this - do we need to populate the description field here? if (!empty($menu_item_data['obj_type']) && 'custom' != $menu_item_data['obj_type'] && !empty($menu_item_data['id'])) { switch ($menu_item_data['obj_type']) { case 'post_type': $id = absint(str_replace('post-', '', $menu_item_data['id'])); $_object = get_post($id); break; case 'taxonomy': $id = absint(str_replace('term-', '', $menu_item_data['id'])); $_object = get_term($id, $menu_item_data['type']); break; } $_menu_items = array_map('wp_setup_nav_menu_item', array($_object)); $_menu_item = array_shift($_menu_items); // Restore the missing menu item properties $menu_item_data['menu-item-description'] = $_menu_item->description; } // Make the "Home" item into the custom link that it actually is. if ('page' == $menu_item_data['type'] && 'custom' == $menu_item_data['obj_type']) { $menu_item_data['type'] = 'custom'; $menu_item_data['url'] = home_url('/'); } // Map data from menu customizer keys to nav-menus.php keys. $item_data = array('menu-item-db-id' => 0, 'menu-item-object-id' => $id, 'menu-item-object' => isset($menu_item_data['type']) ? $menu_item_data['type'] : '', 'menu-item-type' => isset($menu_item_data['obj_type']) ? $menu_item_data['obj_type'] : '', 'menu-item-title' => isset($menu_item_data['name']) ? $menu_item_data['name'] : '', 'menu-item-url' => isset($menu_item_data['url']) ? $menu_item_data['url'] : '', 'menu-item-description' => isset($menu_item_data['menu-item-description']) ? $menu_item_data['menu-item-description'] : ''); // `wp_save_nav_menu_items` requires `menu-item-db-id` to not be set for custom items. if ('custom' == $item_data['menu-item-type']) { unset($item_data['menu-item-db-id']); } $item_ids = wp_save_nav_menu_items(0, array(0 => $item_data)); if (is_wp_error($item_ids) || empty($item_ids)) { wp_die(0); } $item = get_post($item_ids[0]); if (!empty($item->ID)) { $item = wp_setup_nav_menu_item($item); $item->label = $item->title; // Don't show "(pending)" in ajax-added items. } // Output the markup for this item. menu_customizer_render_item_control($item, $menu_id, 0); wp_die(); }
'id' => $comment->comment_ID, 'data' => $comment_list_item, 'position' => $position )); $x->send(); break; case 'add-menu-item' : if ( ! current_user_can( 'edit_theme_options' ) ) die('-1'); check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' ); require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; $item_ids = wp_save_nav_menu_items( 0, $_POST['menu-item'] ); if ( is_wp_error( $item_ids ) ) die('-1'); foreach ( (array) $item_ids as $menu_item_id ) { $menu_obj = get_post( $menu_item_id ); if ( ! empty( $menu_obj->ID ) ) { $menu_obj = wp_setup_nav_menu_item( $menu_obj ); $menu_obj->label = $menu_obj->title; // don't show "(pending)" in ajax-added items $menu_items[] = $menu_obj; } } if ( ! empty( $menu_items ) ) { $args = array( 'after' => '',
/** * Ajax handler is triggered when * something is added to the nav menu * @ajax */ public function ajax_add_menu_item() { if (!tf_current_user_can(array('manage_options', 'edit_theme_options'), false)) { die('-1'); } check_ajax_referer('add-menu_item', 'menu-settings-column-nonce'); require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; // For performance reasons, we omit some object properties from the checklist. // The following is a hacky way to restore them when adding non-custom items. $menu_items_data = array(); if ($this->request->POST('menu-item')) { foreach ((array) $this->request->POST('menu-item') as $menu_item_data) { if (!empty($menu_item_data['menu-item-type']) && 'custom' != $menu_item_data['menu-item-type'] && !empty($menu_item_data['menu-item-object-id'])) { switch ($menu_item_data['menu-item-type']) { case 'post_type': $_object = get_post($menu_item_data['menu-item-object-id']); break; case 'taxonomy': $_object = get_term($menu_item_data['menu-item-object-id'], $menu_item_data['menu-item-object']); break; } $_menu_items = array_map('wp_setup_nav_menu_item', array($_object)); $_menu_item = array_shift($_menu_items); // Restore the missing menu item properties $menu_item_data['menu-item-description'] = $_menu_item->description; } $menu_items_data[] = $menu_item_data; } } $item_ids = wp_save_nav_menu_items(0, $menu_items_data); if (is_wp_error($item_ids)) { die('-1'); } foreach ((array) $item_ids as $menu_item_id) { $menu_obj = get_post($menu_item_id); if (!empty($menu_obj->ID)) { $menu_obj = wp_setup_nav_menu_item($menu_obj); $menu_obj->label = $menu_obj->title; // don't show "(pending)" in ajax-added items $menu_items[] = $menu_obj; } } if (!empty($menu_items)) { $args = array('after' => '', 'before' => '', 'link_after' => '', 'link_before' => '', 'walker' => new TF_ADMIN_MENU_WALKER()); echo walk_nav_menu_tree($menu_items, 0, (object) $args); } die; }
function wp_ajax_add_menu_item() { check_ajax_referer('add-menu_item', 'menu-settings-column-nonce'); if (!current_user_can('edit_theme_options')) { wp_die(-1); } require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; $menu_items_data = array(); $search_keys = array(); foreach ((array) $_POST['menu-item'] as $k => $menu_item_data) { if (!isset($menu_item_data['menu-item-type']) || $menu_item_data['menu-item-type'] !== 'search') { continue; } $menu_item_data['menu-item-description'] = _x('Search box', 'menu-item-description', 'bop-nav-search-box-item'); $menu_items_data[] = $menu_item_data; $search_keys[] = $k; } foreach ($search_keys as $k) { unset($_POST['menu-item'][$k]); } if (!$menu_items_data) { return; } $item_ids = wp_save_nav_menu_items(0, $menu_items_data); if (is_wp_error($item_ids)) { wp_die(0); } $menu_items = array(); foreach ((array) $item_ids as $menu_item_id) { $menu_obj = get_post($menu_item_id); if (!empty($menu_obj->ID)) { $menu_obj = wp_setup_nav_menu_item($menu_obj); $menu_obj->label = $menu_obj->title; // don't show "(pending)" in ajax-added items $menu_items[] = $menu_obj; } } /** * This filter is defined in wp-admin/includes/nav-menu.php * * @since 1.0.0 */ $walker_class_name = apply_filters('wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $_POST['menu']); if (!class_exists($walker_class_name)) { wp_die(0); } if (!empty($menu_items)) { $args = array('after' => '', 'before' => '', 'link_after' => '', 'link_before' => '', 'walker' => new $walker_class_name()); echo walk_nav_menu_tree($menu_items, 0, (object) $args); } if (!$_POST['menu-item']) { wp_die(); } }
public function add_menu_item($menu_id, $menu_items) { if (empty($menu_id) || is_nav_menu($menu_id) === false) { return false; } //$this->_out(new Upfront_JsonResponse_Error('Cannot create menu!')); $new_menu_items = wp_save_nav_menu_items($menu_id, $menu_items); return $new_menu_items; }
/** * TODO: documentation */ public function duplicate_item() { check_ajax_referer('add-menu_item', 'menu-settings-column-nonce'); if (!current_user_can('edit_theme_options')) { wp_die(-1); } require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; $item = wp_setup_nav_menu_item(clone get_post($_GET['db_id'])); $menu_items = array(); $menu_item = array('menu-item-object' => $item->object, 'menu-item-object-id' => $item->object_id, 'menu-item-parent-id' => isset($_GET['parent_id']) ? $_GET['parent_id'] : $item->menu_item_parent, 'menu-item-type' => $item->type, 'menu-item-title' => $item->title, 'menu-item-url' => $item->url); $item_ids = wp_save_nav_menu_items($_GET['menu'], array($menu_item)); if (is_wp_error($item_ids)) { wp_die(0); } $menu_obj = get_post($item_ids[0]); if (!empty($menu_obj->ID)) { $menu_obj = wp_setup_nav_menu_item($menu_obj); $menu_obj->label = $menu_obj->title; // don't show "(pending)" in ajax-added items $menu_items[] = $menu_obj; } $walker_class_name = apply_filters('wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $_GET['menu']); if (!class_exists($walker_class_name)) { wp_die(0); } if (!empty($menu_items)) { $args = array('after' => '', 'before' => '', 'link_after' => '', 'link_before' => '', 'walker' => new $walker_class_name()); $output = walk_nav_menu_tree($menu_items, 0, (object) $args); $output = preg_replace_callback('/(menu-item-depth-)([0-9]+)/', function ($matches) { return $matches[1] . ($matches[2] + 1); }, $output); echo $output; wp_die(); } }