Back to WordPress admin." ); } } } //Clean up after the plugin is deleted static function delete_plugin_options() { delete_option('idealien_ml2msls_options'); } //Setup plugin options static function add_plugin_defaults() { //Check that this is initial activation (or default option reset requires reset) $tmp = get_option('idealien_ml2msls_options'); if(($tmp['chk_default_options_db']=='1')||(!is_array($tmp))) { //Start from a clean slate delete_option('idealien_ml2msls_options'); //Create array of default options $arr = array( "main_mode" => "OFF", //"WPMS, WPML, EXPORT" "main_post_type" => "", "chk_default_options_db" => "1" ); //Store them into the DB update_option('idealien_ml2msls_options', $arr); } } function Idealien_ml2msls() { //Confirm WordPress version requirements - 3.1 add_action("admin_init", array(&$this, "requires_wordpress_version")); // Setup Options page with custom post type add_action("admin_menu", array(&$this, "admin_add_page")); // Add settings for options page add_action('admin_init', array(&$this, "admin_init")); // Setup Settings Link on Plugins Page add_action("plugin_action_links", array(&$this, "action_link"), 10, 2 ); //EXPORT ENHANCEMENTS - Not Complete //Add Language selector to the Tools > Export window //add_action('export_filters', array(&$this, "export_language_select")); //Ensure the filter is passed to the arguments for creation of export //add_filter('export_args', array(&$this, "export_language_filter_args")); //add_filter('export_wp_join', array(&$this, "export_language_filter_join")); //add_filter('export_wp_where', array(&$this, "export_language_filter_where")); //Add filter for language to export query //add_action( 'export_wp', array(&$this, "export_language_query_filter")); //CORE Consideration //$join .= apply_filters( 'export_wp_join', $join, $args ); //$where .= apply_filters( 'export_wp_where', $where, $args ); //End Idealien_ML2MSLS constructor function } // Display a Settings link on the Plugins page function action_link( $links, $file ) { if ( $file == plugin_basename( __FILE__ ) ) { $idealien_ml2msls_options_link = ''.__('Settings', ml2msls).''; //Settings at the front, Support at the back array_unshift( $links, $idealien_ml2msls_options_link ); } return $links; } // Add menu page function admin_add_page() { //add_management_page( "Convert WPML to WPMSLS", "WPML 2 WPMSLS", "manage_options", "wpml2wpmsls", array($this, 'options_page') ); global $wpml2wpmsls; $wpml2wpmsls = add_options_page(__('Convert WPML to WPMSLS', ml2msls), __('WPML 2 WPMSLS', ml2msls), 'manage_options', 'wpml2wpmsls', array(&$this, 'options_page')); add_action('load-'.$wpml2wpmsls, array(&$this, 'contextual_help_tab')); } // Options Form function options_page() { ?>

'; } function options_radio_mode() { $options = get_option('ml2msls_options'); echo '
'; echo '
'; echo '
'; echo '
'; } function options_select_post_type() { $options = get_option('ml2msls_options'); $post_types = get_post_types(array( 'public' => true ), 'names', 'and' ); echo ""; } // Sanitize and validate input. Accepts an array, return a sanitized array. function validate_options($input) { $updateMessage = ""; $errorMessage = ""; $validatedInput['main_mode'] = wp_filter_nohtml_kses($input['main_mode']); $validatedInput['main_post_type'] = wp_filter_nohtml_kses($input['main_post_type']); //Setup query params for processing on both ML and MS usage switch ($validatedInput['main_post_type']) { case '': $errorMessage .= __('You did not select a Post Type. ', ml2msls); $updateMessage .= __('No changes made to your site content. ', ml2msls); break; case 'all': $queryParams = array( 'posts_per_page' => -1, 'post_type' => get_post_types(array( 'public' => true ), 'names', 'and' ) ); break; default: $queryParams = array( 'posts_per_page' => -1, 'post_type' => array( $validatedInput['main_post_type'] ) ); break; } switch ($validatedInput['main_mode']) { case 'WPML': if( $validatedInput['main_post_type'] != '' ): $conversionData = new WP_Query(); $conversionData->query($queryParams); if ( $conversionData->have_posts() ) : $count_posts = 0; $count_translations = 0; while ( $conversionData->have_posts() ) : $conversionData->the_post(); $ID = get_the_ID(); $postType = get_post_type( $ID ); $translations = icl_get_languages('skip_missing=1'); $translateLanguages = array(); foreach ($translations as $translation ) { $translate_ID = icl_object_id($ID, $postType, false, $translation['language_code']); //Filter out languages that do not have translations if($translate_ID != "") { $translateLanguages[] = $translation['language_code']; update_post_meta($ID, "_wpml2wpms_" . $translation['language_code'], $translate_ID ); update_post_meta($translate_ID, "_wpml2wpms_" . $translation['language_code'], $translate_ID ); } //Identify primary language of the current post if($ID == $translate_ID) { update_post_meta($ID, "_wpml2wpms_baseLanguage", $translation['language_code']); } else { update_post_meta($translate_ID, "_wpml2wpms_baseLanguage", $translation['language_code']); } $count_translations++; } update_post_meta($ID, "_wpml2wpms_transLanguages", $translateLanguages); $count_posts++; endwhile; $updateMessage .= $count_posts . __(' entries had meta data updated with details for ', ml2msls) . $count_translations . __(' translations. ', ml2msls); else: $updateMessage .= __(' None of those Post Type(s) existed for update. ', ml2msls); endif; endif; $updateMessage .= "
" . __('Settings saved. ', ml2msls); break; case 'EXPORT': $updateMessage .= __("This feature is not yet implemented.", ml2msls); break; case 'WPMS': if( $validatedInput['main_post_type'] != '' ): $main_blog_ID = get_current_blog_id(); $main_lang_iso = get_option('WPLANG'); $main_lang_short = substr($main_lang_iso, 0, 2); $updateMessage .= "
" . "Initiating Blog: " . $main_blog_ID . ": " . get_bloginfo('name') . " has language: " . $main_lang_iso . "
"; $sites = array(); // Query all blogs from multi-site install for language details based on current user access $current_user = wp_get_current_user(); $blogs = get_blogs_of_user($current_user->ID); foreach ( $blogs as $blog ) { switch_to_blog( $blog->userblog_id ); //Store Blog ID and multiple versions of language code $language = get_option('WPLANG'); $sites[] = array( "ID" => $blog->userblog_id,"ISO" => $language, "LANG" => substr($language, 0, 2)); } //Return to original blog switch_to_blog( $main_blog_ID ); //Find posts to begin conversion $conversionData = new WP_Query(); $conversionData->query($queryParams); if ( $conversionData->have_posts() ) : $count_posts = 0; $count_translations = 0; while ( $conversionData->have_posts() ) : $conversionData->the_post(); $count_posts++; $ID = get_the_ID(); $postType = get_post_type( $ID ); $native_new_id = $ID; $native_old_id = get_post_meta($ID, "_wpml2wpms_" . $native_language, true); $native_language = get_post_meta($ID, "_wpml2wpms_baseLanguage", true); //Loop through every translation language looking for matches. $translations = get_post_meta($ID, "_wpml2wpms_transLanguages", true); foreach($translations as $translation) { $trans_old_id = get_post_meta($ID, "_wpml2wpms_" . $translation, true); //Find every site which has matching language (2 char) foreach($sites as $site) { if($site['LANG'] == $translation) { switch_to_blog($site['ID']); //Find matching posts based on old post ID / language combo $transQueryParams = array( 'post_type' => $postType, 'posts_per_page' => '-1', 'meta_query' => array( array( 'key' => "_wpml2wpms_" . $translation, 'value' => $trans_old_id, 'compare' => '=' ) ), 'order' => 'ASC' ); $translatePosts = new WP_Query(); $translatePosts->query($transQueryParams); if ( $translatePosts->have_posts() ) : while ( $translatePosts->have_posts() ) : $translatePosts->the_post(); $trans_new_id = get_the_ID(); endwhile; else: $trans_new_id = 0; endif; //Matching post was found. Make MSLS entry for current site back to native language post if($trans_new_id != 0) { $count_translations++; delete_option( "msls_" . $trans_new_id); add_option( "msls_" . $trans_new_id, array( $main_lang_iso => $native_new_id), "", "no"); $trans_language = get_option('WPLANG'); } wp_reset_postdata(); restore_current_blog(); //Make MSLS entry for native language site to translation language post if($trans_new_id != 0) { delete_option( "msls_" . $native_new_id); add_option( "msls_" . $native_new_id, array( $trans_language => $trans_new_id), "", "no"); } } } } endwhile; $updateMessage .= $count_posts . __(' entries had meta data updated with details for ', ml2msls) . $count_translations . __(' translations ', ml2msls) . ". "; else: $updateMessage .= __(' None of those Post Type(s) existed for update. ', ml2msls); endif; endif; break; case 'OFF': $updateMessage .= "
" . __('Settings saved. ', ml2msls); $updateMessage .= __('No changes made to your site content. ', ml2msls); break; } if( $errorMessage != "") { add_settings_error( 'wpml2wpmsls', 'error-messages', $errorMessage, 'error'); } if( $updateMessage != "") { add_settings_error( 'wpml2wpmsls', 'update-messages', $updateMessage, 'updated'); } return $validatedInput; } // Add menu page function export_language_select() { echo "" . "Language" . "
"; $languages = icl_get_languages('skip_missing=0'); echo ""; } function export_language_filter_args( $args) { if ( $_REQUEST['ml2msls_language_filter'] ) $args['ml2msls_language_filter'] = $_REQUEST['ml2msls_language_filter']; return $args; } function export_language_filter_join( $join, $args) { $join .= " INNER JOIN {$wpdb->wp_postmeta} ON ({$wpdb->posts}.ID = {$wpdb->wp_postmeta}.post_id) "; return $join; } function export_language_filter_where( $where, $args) { $where .= $wpdb->prepare( " AND {$wpdb->wp_postmeta}._wpml2wpms_baseLanguage = %s ", "en" ); return $where; } function export_language_query_filter($query) { global $wpdb; //$query .= $wpdb->prepare(" WHERE ID IN (SELECT post_id FROM {$wpdb->wp_postmeta} WHERE meta_key = %s AND meta_value = %s) ", "_wpml2wpms_baseLanguage", "en"); //$query .= $wpdb->prepare(" INNER JOIN {$wpdb->wp_postmeta} ON ({$wpdb->posts}.ID = {$wpdb->wp_postmeta}.post_id) WHERE ($wpdb->wp_postmeta.meta_key} = %s AND ($wpdb->wp_postmeta.meta_value} = %s) ", "_wpml2wpms_baseLanguage", "en"); //var_export($query); return $query; } function contextual_help_tab() { global $wpml2wpmsls; $screen = get_current_screen(); if ( $screen->id != $wpml2wpmsls ) return; // Add help tab to page $helpTitle = '

' . __('WPML2WPMS Help', ml2msls) . '

'; $defaultContent = '' . __( 'Note: ', ml2msls) . ''; $defaultContent .= __('This plugin only converts the actual posts or post types. You will need to handle conversion of any strings, .po files or other language elements separately.', ml2msls ); $content = '

' . __('To convert your WPML translation details for export: ', ml2msls); $content .= '
  1. ' . __( 'You must have WPML installed and activated.', ml2msls ) . '
  2. '; $content .= '
  3. ' . __( 'Set the Conversion Mode to WPML and select which post type(s) you want to convert.', ml2msls ) . '
  4. '; $content .= '
  5. ' . __( 'Press Update. All of the selected post types will have their translations associated together via meta data.', ml2msls ) . '
'; $screen->add_help_tab( array( 'id' => 'ml2msls_tab1', 'title' => __('Step 1 - Convert WPML', ml2msls), 'content' => $helpTitle . $defaultContent . $content, ) ); $content = '

' . __('To export your WPML translation details: ', ml2msls); $content .= '
  1. ' . __( 'Use the standard WordPress Export tool.', ml2msls ) . '
  2. '; $content .= '
  3. ' . __( 'A future version of this plugin will enable you to filter posts for export by language.', ml2msls ) . '
'; // Add help tab to page $screen->add_help_tab( array( 'id' => 'ml2msls_tab2', 'title' => __('Step 2 - Export Data', ml2msls), 'content' => $helpTitle . $defaultContent . $content, ) ); $content = '
  1. ' . __( 'Use the standard WordPress Import tool.', ml2msls ) . '
  2. '; $content .= '
  3. ' . __( 'Manually delete any posts in each site that are not of the correct language.', ml2msls ) . '
  4. '; $content .= '
  5. ' . __( 'When the export enhancements are complete your export files will be language specific so deletes not be required.', ml2msls ) . '
'; // Add help tab to page $screen->add_help_tab( array( 'id' => 'ml2msls_tab3', 'title' => __('Step 3 - Import Data', ml2msls), 'content' => $helpTitle . $defaultContent . $content, ) ); $content = '

' . __('To finish converting your translations: ', ml2msls); $content .= '
  1. ' . __( 'You must have MSLS installed and activated.', ml2msls ) . '
  2. '; $content .= '
  3. ' . __( 'Set the Conversion Mode to WPMS and select which post type(s) you want to convert.', ml2msls ) . '
  4. '; $content .= '
  5. ' . __( 'Press Update. All of the selected post types will have their associated translations restored.', ml2msls ) . '
'; // Add help tab to page $screen->add_help_tab( array( 'id' => 'ml2msls_tab4', 'title' => __('Step 4 - Update WPMS', ml2msls), 'content' => $helpTitle . $defaultContent . $content, ) ); } } // Initiate the plugin add_action("init", "Idealien_ml2mslsInit"); register_activation_hook(__FILE__, array('Idealien_ml2msls', 'add_plugin_defaults')); register_deactivation_hook(__FILE__, array('Idealien_ml2msls', 'delete_plugin_options')); function Idealien_ml2mslsInit() { global $Idealien_ml2msls; $Idealien_ml2msls = new Idealien_ml2msls(); } ?>