• 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,

    • This topic was modified 4 years, 1 month ago by BackuPs.
    • This topic was modified 4 years, 1 month ago by BackuPs.
Viewing 1 replies (of 1 total)
  • Thread Starter BackuPs

    (@backups)

    The function is fould in the file called class-wp-import.php

    Please adapt the code change !

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.