_set_menus_language();
}
$this->get_current_menu();
if(isset( $_POST['action']) && $_POST['action'] == 'menu-get-metabox'){
$parts = parse_url($_SERVER['HTTP_REFERER']);
@parse_str($parts['query'], $query);
if(isset($query['lang'])){
$sitepress->switch_lang($query['lang']);
}
}
if(!empty($this->current_menu['language'])){
$this->current_lang = $this->current_menu['language'];
//if($this->current_lang != $sitepress->get_default_language() && !isset($_GET['lang'])){
// wp_redirect(admin_url('nav-menus.php').'?lang='.$this->current_lang);
//}
}elseif(isset($_REQUEST['lang'])){
$this->current_lang = $_REQUEST['lang'];
}elseif($lang = $sitepress->get_language_cookie()){
$this->current_lang = $lang;
}else{
$this->current_lang = $sitepress->get_default_language();
}
if(isset($_POST['icl_wp_nav_menu_ajax'])){
$this->ajax($_POST);
}
// for theme locations that are not translated into the curent language
// reflect status in the theme location navigation switcher
add_action('admin_footer', array($this, '_set_custom_status_in_theme_location_switcher'));
// filter menu by language when adjust ids is off
// not on ajax calls
if(!$sitepress_settings['auto_adjust_ids'] && !defined('DOING_AJAX')){
add_filter('get_term', array($sitepress, 'get_term_adjust_id'));
}
// Setup Menus Sync
add_action('admin_menu', array($this, 'admin_menu_setup'));
if(isset($_GET['page']) && $_GET['page'] == ICL_PLUGIN_FOLDER . '/menu/menus-sync.php'){
global $icl_menus_sync;
include_once ICL_PLUGIN_PATH . '/inc/wp-nav-menus/menus-sync.php';
$icl_menus_sync = new ICLMenusSync;
}
}
// Menus sync submenu
function admin_menu_setup(){
$top_page = apply_filters('icl_menu_main_page', ICL_PLUGIN_FOLDER.'/menu/languages.php');
add_submenu_page( $top_page,
__( 'WP Menus Sync', 'sitepress' ), __( 'WP Menus Sync', 'sitepress' ),
'manage_options', ICL_PLUGIN_FOLDER . '/menu/menus-sync.php' );
}
/**
* associates menus without language information with default language
*
*/
function _set_menus_language(){
global $wpdb, $sitepress;
$translated_menus = $wpdb->get_col("
SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_nav_menu'
");
$translated_menus[] = 0; //dummy
$untranslated_menus = $wpdb->get_col("
SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy='nav_menu' AND term_taxonomy_id NOT IN(".join(",",$translated_menus).")
");
if(!empty($untranslated_menus)){
foreach($untranslated_menus as $item){
$sitepress->set_element_language_details($item, 'tax_nav_menu', null, $sitepress->get_default_language());
}
}
$translated_menu_items = $wpdb->get_col("
SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type='post_nav_menu_item' AND element_id IS NOT NULL
");
$translated_menu_items[] = 0; //dummy
$untranslated_menu_items = $wpdb->get_col("
SELECT ID FROM {$wpdb->posts} WHERE post_type='nav_menu_item' AND ID NOT IN(".join(",", $translated_menu_items).")
");
if(!empty($untranslated_menu_items)){
foreach($untranslated_menu_items as $item){
$sitepress->set_element_language_details($item, 'post_nav_menu_item', null, $sitepress->get_default_language());
}
}
}
function ajax($data){
if($data['icl_wp_nav_menu_ajax'] == 'translation_of'){
$trid = isset($data['trid']) ? $data['trid'] : false;
$this->_render_translation_of($data['lang'], $trid);
}
exit;
}
function _get_menu_language($menu_id){
global $sitepress, $wpdb;
$menu_tt_id = $wpdb->get_var($wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id=%d AND taxonomy='nav_menu'",$menu_id));
$lang = $sitepress->get_element_language_details($menu_tt_id, 'tax_nav_menu');
return $lang;
}
/**
* gets first menu in a specific language
* used to override nav_menu_recently_edited when a different language is selected
* @param $lang
* @return int
*/
function _get_first_menu($lang){
global $wpdb;
$menu_tt_id = $wpdb->get_var("SELECT MIN(element_id) FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_nav_menu' AND language_code='".$wpdb->escape($lang)."'");
$menu_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d",$menu_tt_id));
return (int) $menu_id;
}
function get_current_menu(){
global $sitepress;
$nav_menu_recently_edited = get_user_option( 'nav_menu_recently_edited' );
$nav_menu_recently_edited_lang = $this->_get_menu_language($nav_menu_recently_edited);
if( !isset( $_REQUEST['menu'] ) &&
isset($nav_menu_recently_edited_lang->language_code) &&
$nav_menu_recently_edited_lang->language_code != $sitepress->get_current_language()){
// if no menu is specified and the language is set override nav_menu_recently_edited
$nav_menu_selected_id = $this->_get_first_menu($sitepress->get_current_language());
if($nav_menu_selected_id){
update_user_option(get_current_user_id(), 'nav_menu_recently_edited', $nav_menu_selected_id);
}else{
$_REQUEST['menu'] = 0;
}
}elseif( !isset( $_REQUEST['menu'] ) && !isset($_GET['lang'])
&& (empty($nav_menu_recently_edited_lang->language_code) || $nav_menu_recently_edited_lang->language_code != $sitepress->get_admin_language_cookie())
&& (empty($_POST['action']) || $_POST['action']!='update')){
// if no menu is specified, no language is set, override nav_menu_recently_edited if its language is different than default
$nav_menu_selected_id = $this->_get_first_menu($sitepress->get_admin_language_cookie());
update_user_option(get_current_user_id(), 'nav_menu_recently_edited', $nav_menu_selected_id);
}elseif(isset( $_REQUEST['menu'] )){
$nav_menu_selected_id = $_REQUEST['menu'];
}else{
$nav_menu_selected_id = $nav_menu_recently_edited;
}
$this->current_menu['id'] = $nav_menu_selected_id;
if($this->current_menu['id']){
$this->_load_menu($this->current_menu['id']);
}else{
$this->current_menu['trid'] = isset($_GET['trid']) ? intval($_GET['trid']) : null;
if(isset($_POST['icl_nav_menu_language'])){
$this->current_menu['language'] = $_POST['icl_nav_menu_language'];
}elseif(isset($_GET['lang'])){
$this->current_menu['language'] = $_GET['lang'];
}else{
$this->current_menu['language'] = $sitepress->get_admin_language_cookie();
}
$this->current_menu['translations'] = array();
}
}
function _load_menu($menu_id){
global $sitepress, $wpdb;
$menu_tt_id = $wpdb->get_var($wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id=%d AND taxonomy='nav_menu'",$this->current_menu['id']));
$this->current_menu['trid'] = $sitepress->get_element_trid($menu_tt_id, 'tax_nav_menu');
if($this->current_menu['trid']){
$this->current_menu['translations'] = $sitepress->get_element_translations($this->current_menu['trid'], 'tax_nav_menu');
}else{
$this->current_menu['translations'] = array();
}
foreach($this->current_menu['translations'] as $tr){
if($menu_tt_id == $tr->element_id){
$this->current_menu['language'] = $tr->language_code;
}
}
}
function wp_update_nav_menu($menu_id, $menu_data = null){
global $sitepress, $wpdb;
if($menu_data){
if(isset($_POST['icl_translation_of']) && $_POST['icl_translation_of']){
$trid = $sitepress->get_element_trid($_POST['icl_translation_of'], 'tax_nav_menu');
}else{
$trid = isset($_POST['icl_nav_menu_trid']) ? intval($_POST['icl_nav_menu_trid']) : null;
}
$language_code = isset($_POST['icl_nav_menu_language']) ? $_POST['icl_nav_menu_language'] : $sitepress->get_default_language();
$menu_id_tt = $wpdb->get_var($wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id=%d AND taxonomy='nav_menu'",$menu_id));
$sitepress->set_element_language_details($menu_id_tt, 'tax_nav_menu', $trid, $language_code);
}
$this->current_menu['id'] = $menu_id;
$this->_load_menu($this->current_menu['id']);
}
function wp_delete_nav_menu($id){
global $wpdb;
$menu_id_tt = $wpdb->get_var($wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id=%d AND taxonomy='nav_menu'",$id));
$wpdb->query("DELETE FROM {$wpdb->prefix}icl_translations WHERE element_id='{$menu_id_tt}' AND element_type='tax_nav_menu' LIMIT 1");
}
function wp_update_nav_menu_item($menu_id, $menu_item_db_id, $args){
// TBD
// TBD
global $sitepress;
// deal with the case of auto-added pages
/*
if(isset($_POST['icl_post_language'])){
$menu_language = $this->_get_menu_language($menu_id);
if($menu_language != $_POST['icl_post_language']){
_wp_delete_post_menu_item($menu_id);
return;
}
}
*/
$trid = null;
$language_code = $this->current_lang;
$sitepress->set_element_language_details($menu_item_db_id, 'post_nav_menu_item', $trid, $language_code);
}
function wp_delete_nav_menu_item($menu_item_id){
global $wpdb;
$post = get_post($menu_item_id);
if(!empty($post->post_type) && $post->post_type == 'nav_menu_item'){
$wpdb->query("DELETE FROM {$wpdb->prefix}icl_translations WHERE element_id='{$menu_item_id}' AND element_type='post_nav_menu_item' LIMIT 1");
}
}
function nav_menu_language_controls(){
global $sitepress, $wpdb;
if($this->current_menu['language'] != $sitepress->get_default_language()){
$menus_wout_translation = $this->get_menus_without_translation($this->current_menu['language']);
}
if(isset($this->current_menu['translations'][$sitepress->get_default_language()])){
$menus_wout_translation['0'] = (object)array(
'element_id'=>$this->current_menu['translations'][$sitepress->get_default_language()]->element_id,
'trid' =>'0',
'name' =>$this->current_menu['translations'][$sitepress->get_default_language()]->name
);
}
$langsel = '
';
// show translations links if this is not a new element
if($this->current_menu['id']){
$langsel .= '