Please change the menu importer to this so custom fields get imported
-
Hi
Could you please change the function process_menu_item($item) to this so custom menu fields added by plugins or themes also get imported. It is a easy fix for a missing piece of code that has been asked for several years.
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', 'wordpress-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', 'wordpress-importer' ), esc_html( $menu_slug ) ); echo '<br />'; return; } else { $menu_id = is_array( $menu_id ) ? $menu_id['term_id'] : $menu_id; } $backup_menu_item_meta=array(); $backup_menu_item_meta['postmeta']= $item['postmeta']; 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; } // wp_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 = wp_update_nav_menu_item( $menu_id, 0, $args ); if ( $id && ! is_wp_error( $id ) ) { $menu_item_db_id=$id; $backup_menu_item_meta['postmeta']= apply_filters('wordpress_importer_menu_items_meta_import',$backup_menu_item_meta['postmeta'],$id); $skip_meta_items= array('_menu_item_type','_menu_item_menu_item_parent','_menu_item_object_id','_menu_item_object','_menu_item_target','_menu_item_classes','_menu_item_xfn','_menu_item_url'); if (is_array($backup_menu_item_meta['postmeta']) && !empty($backup_menu_item_meta['postmeta'])) { foreach ( $backup_menu_item_meta['postmeta'] as $meta ) { if (!in_array($meta['key'],$skip_meta_items)) { update_post_meta( $menu_item_db_id, $meta['key'], $meta['value']); } } } $this->processed_menu_items[intval($item['post_id'])] = (int) $id; } }
https://share.getcloudapp.com/Wnurkb4q?utm_source=show
I do not want to change the plugin every time to get this part to work. The code works just fine and imports the custom fields added by any plugin or theme to a menu item.
Please confirm this,
Viewing 1 replies (of 1 total)
Viewing 1 replies (of 1 total)
- The topic ‘Please change the menu importer to this so custom fields get imported’ is closed to new replies.