WPML not sync menu
-
I had a problem with the plugin and WPML.
I have a menu not sync, so UPDATE option don’t save.
I resolve with this code:
public function wp_update_nav_menu_item_action( $item_menu_id, $menu_item_db_id ) { global $sitepress, $icl_menus_sync; $menu_image_settings = array( 'menu_item_image_size', 'menu_item_image_title_position', 'thumbnail_id', 'thumbnail_hover_id', ); if ( class_exists( 'SitePress' ) && $sitepress instanceof SitePress && class_exists( 'ICLMenusSync' ) && $icl_menus_sync instanceof ICLMenusSync ) { static $run_times = array(); // iterate synchronized menus foreach ( $icl_menus_sync->menus as $menu_id => $menu_data ) { if ( !isset( $_POST['sync']['add'][$menu_id] ) ) { continue; } // remove cache and get language current item menu $cache_key = md5( serialize( array( $item_menu_id, 'tax_nav_menu' ) ) ); $cache_group = 'get_language_for_element'; wp_cache_delete( $cache_key, $cache_group ); $lang = $sitepress->get_language_for_element( $item_menu_id, 'tax_nav_menu' ); if ( !isset( $run_times[$menu_id][$lang] ) ) { $run_times[$menu_id][$lang] = 0; } // Count static var for each menu id and saved item language // and get original item id from counted position of synchronized // items from POST data. That's all magic. $post_item_ids = array(); foreach ($_POST['sync']['add'][$menu_id] as $id => $lang_array) { if (array_key_exists($lang, $lang_array)) { $post_item_ids[] = $id; } } if ( !array_key_exists( $run_times[$menu_id][$lang], $post_item_ids ) ) { continue; } $orig_item_id = $post_item_ids[$run_times[$menu_id][$lang]]; // iterate all item settings and save it for new item $orig_item_meta = get_metadata( 'post', $orig_item_id ); foreach ( $menu_image_settings as $meta ) { if ( isset( $orig_item_meta["_$meta"] ) && isset( $orig_item_meta["_$meta"][0] ) ) { update_post_meta( $menu_item_db_id, "_$meta", $orig_item_meta["_$meta"][0] ); } } $run_times[$menu_id][$lang]++; break; } } elseif ( class_exists( 'SitePress' ) && $sitepress instanceof SitePress ) { $orig_item_id = $menu_item_db_id; // iterate all item settings and save it for new item $orig_item_meta = get_metadata( 'post', $orig_item_id ); foreach ( $menu_image_settings as $meta ) { //if ( isset( $orig_item_meta["_$meta"] ) && isset( $orig_item_meta["_$meta"][0] ) ) { if (!empty($_POST[$meta][$orig_item_id])) { update_post_meta( $menu_item_db_id, "_$meta", $_POST[$meta][$orig_item_id] ); } //} } } }
Enjoy your code!
Viewing 2 replies - 1 through 2 (of 2 total)
Viewing 2 replies - 1 through 2 (of 2 total)
- The topic ‘WPML not sync menu’ is closed to new replies.