get_default_language();
// add language controls for menus no option but javascript
if($pagenow == 'nav-menus.php'){
add_action('admin_footer', array($this, 'nav_menu_language_controls'), 10);
wp_enqueue_script('wp_nav_menus', ICL_PLUGIN_URL . '/res/js/wp-nav-menus.js', ICL_SITEPRESS_VERSION, true);
wp_enqueue_style('wp_nav_menus_css', ICL_PLUGIN_URL . '/res/css/wp-nav-menus.css', array(), ICL_SITEPRESS_VERSION,'all');
// filter posts by language
add_action('parse_query', array($this, 'parse_query'));
}
if(is_admin()){
$this->_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 ( isset( $this->current_menu[ 'language' ] )
&& isset($this->current_menu['id'])
&& $this->current_menu[ 'language' ]
&& $this->current_menu[ 'language' ] != $default_language
&& isset( $_GET[ 'menu' ] )
&& empty( $_GET[ 'lang' ] ) ) {
wp_redirect(admin_url(sprintf('nav-menus.php?menu=%d&lang=%s',$this->current_menu['id'], $this->current_menu['language'])));
}
if(!empty($this->current_menu['language'])){
$this->current_lang = $this->current_menu['language'];
}elseif(isset($_REQUEST['lang'])){
$this->current_lang = $_REQUEST['lang'];
}elseif($lang = $sitepress->get_language_cookie()){
$this->current_lang = $lang;
}else{
$this->current_lang = $default_language;
}
if(isset($_POST['icl_wp_nav_menu_ajax'])){
$this->ajax($_POST);
}
// for theme locations that are not translated into the current 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(){
global $sitepress;
if(!isset($sitepress) || !$sitepress->get_setting( 'setup_complete' )) return;
$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' ),
'wpml_manage_wp_menus_sync', ICL_PLUGIN_FOLDER . '/menu/menus-sync.php' );
}
/**
*
* Associates menus without language information with default language
*
*/
private function _set_menus_language() {
global $wpdb, $sitepress;
$default_language = $sitepress->get_default_language();
$untranslated_menus = $wpdb->get_col (
"
SELECT term_taxonomy_id
FROM {$wpdb->term_taxonomy} tt
LEFT JOIN {$wpdb->prefix}icl_translations i
ON CONCAT('tax_', tt.taxonomy ) = i.element_type
AND i.element_id = tt.term_taxonomy_id
WHERE tt.taxonomy='nav_menu'
AND i.language_code IS NULL"
);
foreach ( (array) $untranslated_menus as $item ) {
$sitepress->set_element_language_details($item, 'tax_nav_menu', null, $default_language );
}
$untranslated_menu_items = $wpdb->get_col (
"
SELECT p.ID
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}icl_translations i
ON CONCAT('post_', p.post_type ) = i.element_type
AND i.element_id = p.ID
WHERE p.post_type = 'nav_menu_item'
AND i.language_code IS NULL"
);
if(!empty($untranslated_menu_items)){
foreach($untranslated_menu_items as $item){
$sitepress->set_element_language_details($item, 'post_nav_menu_item', null, $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='".esc_sql($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);
$current_language = $sitepress->get_current_language();
$admin_language_cookie = $sitepress->get_language_cookie();
if( !isset( $_REQUEST['menu'] ) &&
isset($nav_menu_recently_edited_lang->language_code) &&
$nav_menu_recently_edited_lang->language_code != $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( $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) || $nav_menu_recently_edited_lang != $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( $current_language );
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'] = $admin_language_cookie;
}
$this->current_menu['translations'] = array();
}
}
function _load_menu($menu_id = false){
global $sitepress, $wpdb;
$menu_id = $menu_id ? $menu_id : $this->current_menu[ 'id' ];
$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));
$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']){
$src_term_id = $_POST['icl_translation_of'];
if ($src_term_id != 'none') {
$trid = $sitepress->get_element_trid($_POST['icl_translation_of'], 'tax_nav_menu');
} else {
$trid = null;
}
}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));
$q = "DELETE FROM {$wpdb->prefix}icl_translations WHERE element_id=%d AND element_type='tax_nav_menu' LIMIT 1";
$q_prepared = $wpdb->prepare($q, $menu_id_tt);
$wpdb->query($q_prepared);
}
function wp_update_nav_menu_item($menu_id, $menu_item_db_id, $args){
// TBD
// TBD
global $sitepress;
$trid = $sitepress->get_element_trid($menu_item_db_id, 'post_nav_menu_item');
$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'){
$q = "DELETE FROM {$wpdb->prefix}icl_translations WHERE element_id=%d AND element_type='post_nav_menu_item' LIMIT 1";
$q_prepared = $wpdb->prepare($q, $menu_item_id);
$wpdb->query($q_prepared);
}
}
function nav_menu_language_controls(){
global $sitepress, $wpdb;
$default_language = $sitepress->get_default_language();
if($this->current_menu['language'] != $default_language ){
$menus_wout_translation = $this->get_menus_without_translation($this->current_menu['language']);
}
if(isset($this->current_menu['translations'][ $default_language ])){
$menus_wout_translation['0'] = (object)array(
'element_id'=>$this->current_menu['translations'][ $default_language ]->element_id,
'trid' =>'0',
'name' =>$this->current_menu['translations'][ $default_language ]->name
);
}
$langsel = '
';
// show translations links if this is not a new element
if($this->current_menu['id']){
$langsel .= '