$menu_items[$_item->db_id] = $_item; } $post_fields = array('menu-item-db-id', 'menu-item-object-id', 'menu-item-object', 'menu-item-parent-id', 'menu-item-position', 'menu-item-type', 'menu-item-title', 'menu-item-url', 'menu-item-description', 'menu-item-attr-title', 'menu-item-target', 'menu-item-classes', 'menu-item-xfn'); nxt_defer_term_counting(true); // Loop through all the menu items' POST variables if (!empty($_POST['menu-item-db-id'])) { foreach ((array) $_POST['menu-item-db-id'] as $_key => $k) { // Menu item title can't be blank if (empty($_POST['menu-item-title'][$_key])) { continue; } $args = array(); foreach ($post_fields as $field) { $args[$field] = isset($_POST[$field][$_key]) ? $_POST[$field][$_key] : ''; } $menu_item_db_id = nxt_update_nav_menu_item($nav_menu_selected_id, $_POST['menu-item-db-id'][$_key] != $_key ? 0 : $_key, $args); if (is_nxt_error($menu_item_db_id)) { $messages[] = '<div id="message" class="error"><p>' . $menu_item_db_id->get_error_message() . '</p></div>'; } elseif (isset($menu_items[$menu_item_db_id])) { unset($menu_items[$menu_item_db_id]); } } } // Remove menu items from the menu that weren't in $_POST if (!empty($menu_items)) { foreach (array_keys($menu_items) as $menu_item_id) { if (is_nav_menu_item($menu_item_id)) { nxt_delete_post($menu_item_id); } } }
/** * Save posted nav menu item data. * * @since 3.0.0 * * @param int $menu_id The menu ID for which to save this item. $menu_id of 0 makes a draft, orphaned menu item. * @param array $menu_data The unsanitized posted menu item data. * @return array The database IDs of the items saved */ function nxt_save_nav_menu_items($menu_id = 0, $menu_data = array()) { $menu_id = (int) $menu_id; $items_saved = array(); if (0 == $menu_id || is_nav_menu($menu_id)) { // Loop through all the menu items' POST values foreach ((array) $menu_data as $_possible_db_id => $_item_object_data) { if (empty($_item_object_data['menu-item-object-id']) && (!isset($_item_object_data['menu-item-type']) || in_array($_item_object_data['menu-item-url'], array('http://', '')) || !('custom' == $_item_object_data['menu-item-type'] && !isset($_item_object_data['menu-item-db-id'])) || !empty($_item_object_data['menu-item-db-id']))) { continue; // then this potential menu item is not getting added to this menu } // if this possible menu item doesn't actually have a menu database ID yet if (empty($_item_object_data['menu-item-db-id']) || 0 > $_possible_db_id || $_possible_db_id != $_item_object_data['menu-item-db-id']) { $_actual_db_id = 0; } else { $_actual_db_id = (int) $_item_object_data['menu-item-db-id']; } $args = array('menu-item-db-id' => isset($_item_object_data['menu-item-db-id']) ? $_item_object_data['menu-item-db-id'] : '', 'menu-item-object-id' => isset($_item_object_data['menu-item-object-id']) ? $_item_object_data['menu-item-object-id'] : '', 'menu-item-object' => isset($_item_object_data['menu-item-object']) ? $_item_object_data['menu-item-object'] : '', 'menu-item-parent-id' => isset($_item_object_data['menu-item-parent-id']) ? $_item_object_data['menu-item-parent-id'] : '', 'menu-item-position' => isset($_item_object_data['menu-item-position']) ? $_item_object_data['menu-item-position'] : '', 'menu-item-type' => isset($_item_object_data['menu-item-type']) ? $_item_object_data['menu-item-type'] : '', 'menu-item-title' => isset($_item_object_data['menu-item-title']) ? $_item_object_data['menu-item-title'] : '', 'menu-item-url' => isset($_item_object_data['menu-item-url']) ? $_item_object_data['menu-item-url'] : '', 'menu-item-description' => isset($_item_object_data['menu-item-description']) ? $_item_object_data['menu-item-description'] : '', 'menu-item-attr-title' => isset($_item_object_data['menu-item-attr-title']) ? $_item_object_data['menu-item-attr-title'] : '', 'menu-item-target' => isset($_item_object_data['menu-item-target']) ? $_item_object_data['menu-item-target'] : '', 'menu-item-classes' => isset($_item_object_data['menu-item-classes']) ? $_item_object_data['menu-item-classes'] : '', 'menu-item-xfn' => isset($_item_object_data['menu-item-xfn']) ? $_item_object_data['menu-item-xfn'] : ''); $items_saved[] = nxt_update_nav_menu_item($menu_id, $_actual_db_id, $args); } } return $items_saved; }
/** * Automatically add newly published page objects to menus with that as an option. * * @since 3.0.0 * @access private * * @param string $new_status The new status of the post object. * @param string $old_status The old status of the post object. * @param object $post The post object being transitioned from one status to another. * @return void */ function _nxt_auto_add_pages_to_menu($new_status, $old_status, $post) { if ('publish' != $new_status || 'publish' == $old_status || 'page' != $post->post_type) { return; } if (!empty($post->post_parent)) { return; } $auto_add = get_option('nav_menu_options'); if (empty($auto_add) || !is_array($auto_add) || !isset($auto_add['auto_add'])) { return; } $auto_add = $auto_add['auto_add']; if (empty($auto_add) || !is_array($auto_add)) { return; } $args = array('menu-item-object-id' => $post->ID, 'menu-item-object' => $post->post_type, 'menu-item-type' => 'post_type', 'menu-item-status' => 'publish'); foreach ($auto_add as $menu_id) { $items = nxt_get_nav_menu_items($menu_id, array('post_status' => 'publish,draft')); if (!is_array($items)) { continue; } foreach ($items as $item) { if ($post->ID == $item->object_id) { continue 2; } } nxt_update_nav_menu_item($menu_id, 0, $args); } }
/** * Attempt to create a new menu item from import data * * Fails for draft, orphaned menu items and those without an associated nav_menu * or an invalid nav_menu term. If the post type or term object which the menu item * represents doesn't exist then the menu item will not be imported (waits until the * end of the import to retry again before discarding). * * @param array $item Menu item details from WXR file */ function process_menu_item($item) { // skip draft, orphaned menu items if ('draft' == $item['status']) { return; } $menu_slug = false; if (isset($item['terms'])) { // loop through terms, assume first nav_menu term is correct menu foreach ($item['terms'] as $term) { if ('nav_menu' == $term['domain']) { $menu_slug = $term['slug']; break; } } } // no nav_menu term associated with this menu item if (!$menu_slug) { _e('Menu item skipped due to missing menu slug', 'nxtclass-importer'); echo '<br />'; return; } $menu_id = term_exists($menu_slug, 'nav_menu'); if (!$menu_id) { printf(__('Menu item skipped due to invalid menu slug: %s', 'nxtclass-importer'), esc_html($menu_slug)); echo '<br />'; return; } else { $menu_id = is_array($menu_id) ? $menu_id['term_id'] : $menu_id; } foreach ($item['postmeta'] as $meta) { ${$meta}['key'] = $meta['value']; } if ('taxonomy' == $_menu_item_type && isset($this->processed_terms[intval($_menu_item_object_id)])) { $_menu_item_object_id = $this->processed_terms[intval($_menu_item_object_id)]; } else { if ('post_type' == $_menu_item_type && isset($this->processed_posts[intval($_menu_item_object_id)])) { $_menu_item_object_id = $this->processed_posts[intval($_menu_item_object_id)]; } else { if ('custom' != $_menu_item_type) { // associated object is missing or not imported yet, we'll retry later $this->missing_menu_items[] = $item; return; } } } if (isset($this->processed_menu_items[intval($_menu_item_menu_item_parent)])) { $_menu_item_menu_item_parent = $this->processed_menu_items[intval($_menu_item_menu_item_parent)]; } else { if ($_menu_item_menu_item_parent) { $this->menu_item_orphans[intval($item['post_id'])] = (int) $_menu_item_menu_item_parent; $_menu_item_menu_item_parent = 0; } } // nxt_update_nav_menu_item expects CSS classes as a space separated string $_menu_item_classes = maybe_unserialize($_menu_item_classes); if (is_array($_menu_item_classes)) { $_menu_item_classes = implode(' ', $_menu_item_classes); } $args = array('menu-item-object-id' => $_menu_item_object_id, 'menu-item-object' => $_menu_item_object, 'menu-item-parent-id' => $_menu_item_menu_item_parent, 'menu-item-position' => intval($item['menu_order']), 'menu-item-type' => $_menu_item_type, 'menu-item-title' => $item['post_title'], 'menu-item-url' => $_menu_item_url, 'menu-item-description' => $item['post_content'], 'menu-item-attr-title' => $item['post_excerpt'], 'menu-item-target' => $_menu_item_target, 'menu-item-classes' => $_menu_item_classes, 'menu-item-xfn' => $_menu_item_xfn, 'menu-item-status' => $item['status']); $id = nxt_update_nav_menu_item($menu_id, 0, $args); if ($id && !is_nxt_error($id)) { $this->processed_menu_items[intval($item['post_id'])] = (int) $id; } }