plugin_localization(); // Check if WPML is active. If not display warning message and don't load WPML-media if(!defined('ICL_SITEPRESS_VERSION')){ add_action('admin_notices', array($this, '_no_wpml_warning')); return false; }elseif(version_compare(ICL_SITEPRESS_VERSION, '2.0.5', '<')){ add_action('admin_notices', array($this, '_old_wpml_warning')); return false; } $this->languages = null; if(is_admin()){ add_action('admin_head',array($this,'js_scripts')); global $sitepress, $pagenow; if (1 < count($sitepress->get_active_languages())) { $this->settings = get_option('wpml_media_settings', array('initial_message_shown' => false)); if (!isset($_GET['page']) || $_GET['page'] != 'wpml-media') { if (!$this->settings['initial_message_shown']) { add_action('admin_notices', array($this, '_initialize_message')); } } add_action('admin_menu', array($this,'menu')); add_filter('manage_media_columns', array($this, 'manage_media_columns'), 10 , 1); add_action('manage_media_custom_column', array($this, 'manage_media_custom_column'), 10, 2); //add_filter('manage_upload_sortable_columns', array($this, 'manage_upload_sortable_columns')); add_action('parse_query', array($this, 'parse_query')); add_filter('posts_where', array($this,'posts_where_filter')); add_filter('views_upload', array($this, 'views_upload')); add_action('icl_post_languages_options_after', array($this, 'language_options')); // Post/page save actions add_action('save_post', array($this,'save_post_actions'), 10, 2); add_action('add_attachment', array($this,'save_attachment_actions')); add_action('edit_attachment', array($this,'save_attachment_actions')); if($pagenow == 'media-upload.php'){ add_action('media_upload_library', array($this,'language_filter'), 99); } if($pagenow == 'media.php') { add_action('admin_footer', array($this,'media_language_options')); } } $this->ajax_responses(); } //add_filter('get_post_metadata', array($this, 'get_post_metadata'), 10, 4); add_filter('WPML_filter_link', array($this, 'filter_link'), 10, 2); add_filter('icl_ls_languages', array($this, 'icl_ls_languages'), 10, 1); add_action('icl_pro_translation_saved', array($this, 'icl_pro_translation_saved'), 10, 1); } function media_language_options() { global $sitepress; $att_id = $_GET['attachment_id']; $translations = $this->_get_translations($att_id); $current_lang = ''; foreach($translations as $lang => $id) { if ($id == $att_id) { $current_lang = $lang; unset($translations[$lang]); break; } } $active_languages = icl_get_languages('orderby=id&order=asc&skip_missing=0'); $lang_links = ''; if ($current_lang) { $lang_links = '' . $active_languages[$current_lang]['native_name'] . ''; } foreach ($translations as $lang => $id) { $lang_links .= ' | ' . $active_languages[$lang]['native_name'] . ''; } echo ''; } function icl_pro_translation_saved($new_post_id) { global $wpdb; $post_type = $wpdb->get_var("SELECT post_type FROM {$wpdb->posts} WHERE ID = " . $new_post_id); $trid = $_POST['trid']; $lang = $_POST['lang']; $source_lang = $wpdb->get_var("SELECT language_code FROM {$wpdb->prefix}icl_translations WHERE trid={$trid} AND source_language_code IS NULL"); $this->duplicate_post_attachments($new_post_id, $trid, $source_lang, $lang); } function save_post_actions($pidd, $post){ global $wpdb, $sitepress; list($post_type, $post_status) = $wpdb->get_row("SELECT post_type, post_status FROM {$wpdb->posts} WHERE ID = " . $pidd, ARRAY_N); // exceptions if( !$sitepress->is_translated_post_type($post_type) || isset($_POST['autosave']) || (isset($_POST['post_ID']) && $_POST['post_ID']!=$pidd) || (isset($_POST['post_type']) && $_POST['post_type']=='revision') || $post_type == 'revision' || get_post_meta($pidd, '_wp_trash_meta_status', true) || ( isset($_GET['action']) && $_GET['action']=='restore') || $post_status == 'auto-draft' ){ return; } if (isset($_POST['icl_trid'])) { // save the post from the edit screen. if (isset($_POST['icl_duplicate_attachments'])) { update_post_meta($pidd, '_wpml_media_duplicate', intval($_POST['icl_duplicate_attachments'])); } else { update_post_meta($pidd, '_wpml_media_duplicate', "0"); } if (isset($_POST['icl_duplicate_featured_image'])) { update_post_meta($pidd, '_wpml_media_featured', intval($_POST['icl_duplicate_featured_image'])); } else { update_post_meta($pidd, '_wpml_media_featured', "0"); } $icl_trid = $_POST['icl_trid']; } else { // get trid from database. $icl_trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id={$pidd} AND element_type = 'post_$post_type'"); } if ($icl_trid) { $this->duplicate_post_attachments($pidd, $icl_trid); } } function save_attachment_actions($post_id){ global $wpdb, $sitepress; $wpml_media_lang = get_post_meta($post_id, 'wpml_media_lang', true); if(empty($wpml_media_lang)){ $parent_post = $wpdb->get_row($wpdb->prepare( "SELECT p2.ID, p2.post_type FROM $wpdb->posts p1 JOIN $wpdb->posts p2 ON p1.post_parent =p2.ID WHERE p1.ID=%d" , $post_id)); if($parent_post){ $wpml_media_lang = $sitepress->get_language_for_element($parent_post->ID, 'post_' . $parent_post->post_type); } if(empty($wpml_media_lang)){ $wpml_media_lang = $sitepress->get_admin_language_cookie(); } if(empty($wpml_media_lang)){ $wpml_media_lang = $sitepress->get_default_language(); } } if(!empty($wpml_media_lang)){ update_post_meta($post_id, 'wpml_media_lang', $wpml_media_lang); } } function duplicate_post_attachments($pidd, $icl_trid, $source_lang = null, $lang = null) { global $wpdb, $sitepress; if ($icl_trid == "") { return; } if (!$source_lang) { $source_lang = $wpdb->get_var("SELECT source_language_code FROM {$wpdb->prefix}icl_translations WHERE element_id = $pidd AND trid = $icl_trid"); } if ($source_lang == null || $source_lang == "") { // This is the original see if we should copy to translations $duplicate = get_post_meta($pidd, '_wpml_media_duplicate', true); $featured = get_post_meta($pidd, '_wpml_media_featured', true); if ($duplicate || $featured) { $translations = $wpdb->get_col("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE trid = $icl_trid"); foreach ($translations as $translation_id) { if ($translation_id && $translation_id != $pidd) { $duplicate_t = $duplicate; if ($duplicate_t) { // See if the translation is marked for duplication $duplicate_t = get_post_meta($translation_id, '_wpml_media_duplicate', true); } $lang = $wpdb->get_var("SELECT language_code FROM {$wpdb->prefix}icl_translations WHERE element_id = $translation_id AND trid = $icl_trid"); if ($duplicate_t || $duplicate_t == '') { $source_attachments = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_parent = $pidd AND post_type = 'attachment'"); $attachments = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_parent = $translation_id AND post_type = 'attachment'"); foreach ($source_attachments as $source_att_id) { $found = false; foreach($attachments as $att_id) { $duplicate_of = get_post_meta($att_id, 'wpml_media_duplicate_of', true); if ($duplicate_of == $source_att_id) { $found = true; } } if (!$found) { $this->create_duplicate_attachment($source_att_id, $translation_id, $lang); } } } $featured_t = $featured; if ($featured_t) { // See if the translation is marked for duplication $featured_t = get_post_meta($translation_id, '_wpml_media_featured', true); } if ($featured_t || $featured_t == '') { $thumbnail_id = get_post_meta($pidd, '_thumbnail_id', true); if ($thumbnail_id) { update_post_meta($translation_id, '_thumbnail_id', $thumbnail_id); } } } } } } else { // This is a translation. $source_id = $wpdb->get_var("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE language_code = '$source_lang' AND trid = $icl_trid"); if (!$lang) { $lang = $wpdb->get_var("SELECT language_code FROM {$wpdb->prefix}icl_translations WHERE element_id = $pidd AND trid = $icl_trid"); } $duplicate = get_post_meta($pidd, '_wpml_media_duplicate', true); if ($duplicate === "") { // check the original state $duplicate = get_post_meta($source_id, '_wpml_media_duplicate', true); } if ($duplicate) { $attachments = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_parent = $pidd AND post_type = 'attachment'"); $source_attachments = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_parent = $source_id AND post_type = 'attachment'"); foreach ($source_attachments as $source_att_id) { $found = false; foreach($attachments as $att_id) { $duplicate_of = get_post_meta($att_id, 'wpml_media_duplicate_of', true); if ($duplicate_of == $source_att_id) { $found = true; } } if (!$found) { $this->create_duplicate_attachment($source_att_id, $pidd, $lang); } } } $featured = get_post_meta($pidd, '_wpml_media_featured', true); if ($featured === "") { // check the original state $featured = get_post_meta($source_id, '_wpml_media_featured', true); } if ($featured) { $thumbnail_id = get_post_meta($source_id, '_thumbnail_id', true); if ($thumbnail_id) { update_post_meta($pidd, '_thumbnail_id', $thumbnail_id); } } } } function language_options() { global $icl_meta_box_globals, $wpdb; $translation = false; $source_id = null; $translated_id = null; if (sizeof($icl_meta_box_globals['translations']) > 0) { if (!isset($icl_meta_box_globals['translations'][$icl_meta_box_globals['selected_language']])) { // We are creating a new translation $translation = true; // find the original foreach ($icl_meta_box_globals['translations'] as $trans_data) { if ($trans_data->original == '1') { $source_id = $trans_data->element_id; break; } } } else { $trans_data = $icl_meta_box_globals['translations'][$icl_meta_box_globals['selected_language']]; // see if this is an original or a translation. if ($trans_data->original == '0') { // double check that it's not the original // This is because the source_language_code field in icl_translations is not always being set to null. $source_language_code = $wpdb->get_var("SELECT source_language_code FROM {$wpdb->prefix}icl_translations WHERE translation_id = $trans_data->translation_id"); $translation = !($source_language_code == "" || $source_language_code == null); if ($translation) { $source_id = $icl_meta_box_globals['translations'][$source_language_code]->element_id; $translated_id = $trans_data->element_id; } else { $source_id = $trans_data->element_id; } } else { $source_id = $trans_data->element_id; } } } echo '

' . __('Media attachments', 'wpml-media') . ''; $checked = ''; if ($translation) { if ($translated_id) { $duplicate = get_post_meta($translated_id, '_wpml_media_duplicate', true); if ($duplicate === "") { // check the original state $duplicate = get_post_meta($source_id, '_wpml_media_duplicate', true); } $featured = get_post_meta($translated_id, '_wpml_media_featured', true); if ($featured === "") { // check the original state $featured = get_post_meta($source_id, '_wpml_media_featured', true); } } else { // This is a new translation. $duplicate = get_post_meta($source_id, '_wpml_media_duplicate', true); $featured = get_post_meta($source_id, '_wpml_media_featured', true); } if ($duplicate) { $checked = ' checked="checked"'; } echo '
'; if ($featured) { $checked = ' checked="checked"'; } else { $checked = ''; } echo '
'; } else { $duplicate = get_post_meta($source_id, '_wpml_media_duplicate', true); if ($duplicate) { $checked = ' checked="checked"'; } echo '
'; $featured = get_post_meta($source_id, '_wpml_media_featured', true); if ($featured) { $checked = ' checked="checked"'; } else { $checked = ''; } echo '
'; } } function manage_media_columns($posts_columns) { $posts_columns['language'] = __('Language', 'wpml-media'); return $posts_columns; } function manage_media_custom_column($column_name, $id) { if ($column_name == 'language') { global $wpdb, $sitepress; if(!empty($this->languages[$id])){ echo $sitepress->get_display_language_name($this->languages[$id], $sitepress->get_admin_language()); }else{ echo __('None', 'wpml-media'); } } } //function manage_upload_sortable_columns($sortable_columns) { // $sortable_columns['language'] = 'language'; // return $sortable_columns; //} function parse_query($q){ global $wp_query, $wpdb, $pagenow, $sitepress; if($pagenow == 'upload.php' || $pagenow == 'media-upload.php') { $this->_get_lang_info(); } } function _get_lang_info() { global $wpdb, $sitepress; // get the attachment languages. $results = $wpdb->get_results("SELECT ID, post_parent FROM {$wpdb->posts} WHERE post_type='attachment'"); $this->parents = array(); $this->unattached = array(); foreach ($results as $result) { $this->parents[$result->ID] = $result->post_parent; if (!$result->post_parent) { $this->unattached[] = $result->ID; } } $results = $wpdb->get_results("SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key='wpml_media_lang'"); $this->languages = array(); foreach($results as $result) { $this->languages[$result->post_id] = $result->meta_value; } // determine list of att without language set (with their parents) foreach($this->parents as $att_id => $parent_id) { if (!isset($this->languages[$att_id])) { $missing_langs[$att_id] = $parent_id; } } // get language of their parents if(!empty($missing_langs)){ $results = $wpdb->get_results($wpdb->prepare(" SELECT p.ID, t.language_code FROM {$wpdb->posts} p JOIN {$wpdb->prefix}icl_translations t ON p.ID = t.element_id AND t.element_type = CONCAT('post_', p.post_type) WHERE p.ID IN(".join(',', $missing_langs).") ")); foreach($results as $row){ $parent_langs[$row->ID] = $row->language_code; } } // set language of their parents foreach($this->parents as $att_id => $parent_id) { if (!isset($this->languages[$att_id])) { $this->languages[$att_id] = $parent_langs[$parent_id]; } } } /** *Add a filter to fix the links for attachments in the language switcher so *they point to the corresponding pages in different languages. */ function filter_link($url, $lang_info) { global $wp_query, $sitepress; $current_lang = $sitepress->get_current_language(); if ($wp_query->is_attachment && $lang_info['language_code'] != $current_lang) { $att_id = $wp_query->queried_object_id; // is this a duplicate of another attachment $translations = $this->_get_translations($att_id); if (isset($translations[$lang_info['language_code']])) { $att_id = $translations[$lang_info['language_code']]; } $link = get_attachment_link($att_id); $link = str_replace('?lang='.$current_lang, '', $link); $link = str_replace('&lang='.$current_lang, '', $link); $link = str_replace('&lang='.$current_lang, '', $link); $link = str_replace('/'.$current_lang.'/', '/', $link); $url = $sitepress->convert_url($link, $lang_info['language_code']); } return $url; } function _get_translations($att_id) { global $wpdb; if ($this->languages == null) { $this->_get_lang_info(); } $duplicates = array(); $duplicate_of = $wpdb->get_var("SELECT meta_value FROM {$wpdb->postmeta} WHERE post_id={$att_id} AND meta_key='wpml_media_duplicate_of'"); if ($duplicate_of) { $duplicates = $wpdb->get_col("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_value={$duplicate_of} AND meta_key='wpml_media_duplicate_of'"); $duplicates[] = $duplicate_of; } else { // this might be an original $duplicates = $wpdb->get_col("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_value={$att_id} AND meta_key='wpml_media_duplicate_of'"); $duplicates[] = $att_id; } $translations = array(); foreach ($duplicates as $duplicate) { if (isset($this->languages[$duplicate])) { $translations[$this->languages[$duplicate]] = $duplicate; } } return $translations; } function icl_ls_languages($w_active_languages) { static $doing_it = false; if(is_attachment() && !$doing_it){ $doing_it = true; // Always include missing languages. $w_active_languages = icl_get_languages('skip_missing=0'); $doing_it = false; } return $w_active_languages; } function posts_where_filter($where){ global $wpdb, $pagenow, $sitepress; if ($pagenow == 'upload.php' || $pagenow == 'media-upload.php') { $lang_code = ''; if (isset($_GET['lang'])) { $lang_code = $_GET['lang']; } else { if (method_exists($sitepress, 'get_admin_language_cookie')) { $lang_code = $sitepress->get_admin_language_cookie(); } } if ($lang_code != "" && $lang_code != "all") { $att_ids = array(); foreach ($this->languages as $att_id => $lang) { if ($lang == $lang_code) { $att_ids[] = $att_id; } } $att_ids = array_merge($att_ids, $this->unattached); if (sizeof($att_ids) > 0) { $att_ids = '(' . implode(',', $att_ids) . ')'; $where .= " AND {$wpdb->posts}.ID in {$att_ids}"; } else { // Add a where clause that wont return any matches. $where .= " AND {$wpdb->posts}.ID = -1"; } } } return $where; } function views_upload($views) { return $views; } function get_post_metadata($value, $object_id, $meta_key, $single) { if ($meta_key == '_thumbnail_id') { global $wpdb; $thumbnail = $wpdb->get_var("SELECT meta_value FROM {$wpdb->postmeta} WHERE post_id = {$object_id} AND meta_key = '{$meta_key}'"); if ($thumbnail == null) { // see if it's available in the original language. $post_type = $wpdb->get_var("SELECT post_type FROM {$wpdb->posts} WHERE ID = $object_id"); $trid = $wpdb->get_row("SELECT trid, source_language_code FROM {$wpdb->prefix}icl_translations WHERE element_id={$object_id} AND element_type = 'post_$post_type'"); if ($trid) { global $sitepress; $translations = $sitepress->get_element_translations($trid->trid, 'post_' . $post_type); if (isset($translations[$trid->source_language_code])) { $translation = $translations[$trid->source_language_code]; // see if the original has a thumbnail. $thumbnail = $wpdb->get_var("SELECT meta_value FROM {$wpdb->postmeta} WHERE post_id = {$translation->element_id} AND meta_key = '{$meta_key}'"); if ($thumbnail) { $value = $thumbnail; } } } } else { $value = $thumbnail; } } return $value; } function menu(){ $top_page = apply_filters('icl_menu_main_page', basename(ICL_PLUGIN_PATH).'/menu/languages.php'); $this->settings['initial_message_shown'] = true; update_option('wpml_media_settings', $this->settings); add_submenu_page($top_page, __('Media translation','wpml-media'), __('Media translation','wpml-media'), 'manage_options', 'wpml-media', array($this,'menu_content')); } function menu_content(){ global $wpdb; $total_attachments = $wpdb->get_var(" SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'attachment' AND ID NOT IN (SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = 'wpml_media_processed')"); include WPML_MEDIA_PATH . '/menu/management.php'; } function ajax_responses(){ if(!isset($_POST['wpml_media_ajx_action'])){ return; } global $wpdb; $limit = 10; switch($_POST['wpml_media_ajx_action']){ case 'rescan_all': $wpdb->query("DELETE FROM {$wpdb->postmeta} WHERE meta_key='wpml_media_processed'"); // Drop throught and do the rescan. case 'rescan': $attachments = $wpdb->get_results(" SELECT SQL_CALC_FOUND_ROWS p1.ID, p1.post_parent FROM {$wpdb->posts} p1 WHERE post_type = 'attachment' AND ID NOT IN (SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = 'wpml_media_processed') ORDER BY p1.ID ASC LIMIT $limit "); if($attachments){ $found = $wpdb->get_var("SELECT FOUND_ROWS()"); foreach($attachments as $attachment){ $this->create_duplicate_media($attachment); } echo $found >= $limit ? $found - $limit : 0; }else{ echo -1; } break; case 'featured_image_scan': global $sitepress; $count = 0; $featured_images = $wpdb->get_results("SELECT * FROM {$wpdb->postmeta} WHERE meta_key = '_thumbnail_id'"); $thumbnails = array(); foreach ($featured_images as $featured) { $thumbnails[$featured->post_id] = $featured->meta_value; } if (sizeof($thumbnails)) { $ids = implode(', ', array_keys($thumbnails)); $posts = $wpdb->get_results("SELECT ID, post_type FROM {$wpdb->posts} WHERE ID in ({$ids})"); foreach ($posts as $post) { $row = $wpdb->get_row("SELECT trid, source_language_code FROM {$wpdb->prefix}icl_translations WHERE element_id={$post->ID} AND element_type = 'post_$post->post_type'"); if ($row && $row->trid && ($row->source_language_code == null || $row->source_language_code == "")) { $translations = $sitepress->get_element_translations($row->trid, 'post_' . $post->post_type); foreach ($translations as $translation) { if ($translation->element_id != $post->ID) { if (!in_array($translation->element_id, array_keys($thumbnails))) { // translation doesn't have a feature image update_post_meta($translation->element_id, '_thumbnail_id', $thumbnails[$post->ID]); $count += 1; } } } } } } echo $count . __(' Featured images duplicate to translated content', 'wpml-media'); break; } exit; } function create_duplicate_media($attachment) { static $parents_processed = array(); if ($attachment->post_parent && !in_array($attachment->post_parent, $parents_processed)) { global $wpdb, $sitepress; // see if we have translations. $post_type = $wpdb->get_var("SELECT post_type FROM {$wpdb->posts} WHERE ID = $attachment->post_parent"); $trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id={$attachment->post_parent} AND element_type = 'post_$post_type'"); if ($trid) { $attachments = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_parent = $attachment->post_parent"); $translations = $sitepress->get_element_translations($trid, 'post_' . $post_type); foreach ($translations as $translation) { if ($translation->element_id && $translation->element_id != $attachment->post_parent) { $attachments_in_translation = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_parent = $translation->element_id"); if (sizeof($attachments_in_translation) == 0) { // only duplicate attachments if there a none already. foreach ($attachments as $att_id) { // duplicate the attachement $this->create_duplicate_attachment($att_id, $translation->element_id, $translation->language_code); } } } } } $parents_processed[] = $attachment->post_parent; } update_post_meta($attachment->ID, 'wpml_media_processed', 1); } function create_duplicate_attachment($att_id, $parent_id, $lang) { $post = get_post($att_id); $post->post_parent = $parent_id; $post->ID = NULL; $dup_att_id = wp_insert_post($post); // duplicate the post meta data. $meta = get_post_meta($att_id, '_wp_attachment_metadata', true); add_post_meta($dup_att_id, '_wp_attachment_metadata', $meta); update_post_meta($dup_att_id, 'wpml_media_processed', 1); update_post_meta($dup_att_id, 'wpml_media_lang', $lang); update_post_meta($dup_att_id, 'wpml_media_duplicate_of', $att_id); update_post_meta($dup_att_id, '_wp_attached_file', get_attached_file($att_id) ); } function js_scripts(){ global $pagenow; if ($pagenow == 'media.php') { ?>

Setup translation of media files', 'wpml-media'), $url); ?>

WPML in order to work.', 'wpml-translation-management'), 'http://wpml.org/'); ?>

WPML versions prior 2.0.5.', 'wpml-translation-management'), 'http://wpml.org/'); ?>

get_admin_language_cookie(); } } $active_languages = $sitepress->get_active_languages(); $active_languages[] = array('code'=>'all','display_name'=>__('All languages','sitepress')); foreach($active_languages as $lang){ if($lang['code'] == $lang_code){ $px = ''; $sx = ' ('. $lang['code'] .')<\/span><\/strong>'; } else { $px = ''; $sx = '<\/a> ('. $lang['code'] .')<\/span>'; } $as[] = $px . $lang['display_name'] . $sx; } $allas = join(' | ', $as); $prot_link = ''; ?>