*/
final class WPAI_WPML
{
/**
* Singletone instance
* @var WPAI_WPML
*/
protected static $instance;
/**
* Plugin root dir
* @var string
*/
const ROOT_DIR = WPAI_WPML_ROOT_DIR;
/**
* Plugin root URL
* @var string
*/
const ROOT_URL = WPAI_WPML_ROOT_URL;
/**
* Return singletone instance
* @return WPAI_WPML
*/
static public function getInstance()
{
if (self::$instance == NULL)
{
self::$instance = new self();
}
return self::$instance;
}
public $wpml_addon;
public $wpml;
private $current_language;
private $default_language;
private $language_code;
private function __construct()
{
$this->wpml_addon = new RapidAddon('WPML All Import', 'wpml_addon');
$this->wpml_addon->set_import_function( array( &$this, 'import') );
$this->wpml_addon->set_post_saved_function( array( &$this, 'saved') );
$conditions = array(
'plugins' => array(
'sitepress-multilingual-cms/sitepress.php'
)
);
$this->wpml_addon->admin_notice(
$this->wpml_addon->name . ' requires WP All Import Pro or Free and WPML Multilingual CMS.',
$conditions
);
$this->wpml_addon->run($conditions);
if ( $this->wpml_addon->is_active_addon('') && apply_filters( 'wpml_setting', false, 'setup_complete' ) )
{
global $sitepress;
$this->wpml = $sitepress;
$this->default_language = $this->wpml->get_default_language();
$this->init_addon_fields();
add_action( 'admin_init', array( &$this, 'enqueue_stylesheets' ) );
add_action( 'pmxi_before_post_import', array( &$this, 'before_post_import' ), 10, 1 );
add_action( 'pmxi_after_post_import', array( &$this, 'after_post_import' ), 10, 1 );
add_action( 'pmxi_saved_post', array( &$this, 'saved_post' ), 10, 1 );
add_action( 'pmxi_delete_post', array( &$this, 'delete_post' ), 10, 1 );
add_filter( 'pmxi_import_name', array( &$this, 'import_name'), 10, 2 );
add_filter( 'wp_all_import_term_exists', array( &$this, 'wp_all_import_term_exists' ), 10, 4);
add_filter( 'wp_all_import_get_existing_image', array( $this, 'get_existing_image_filter' ) );
add_filter( 'wp_all_import_get_image_from_gallery', array( $this, 'get_image_from_gallery_filter' ) );
//add_action( 'pmxi_attachment_uploaded', array( $this, 'pmxi_attachment_uploaded_action' ), 10, 3 );
add_action( 'wp_all_import_add_attachment', array( $this, 'add_attachment_action' ) );
}
}
/**
*
* Init addons' view
*
*/
private function init_addon_fields()
{
global $wpdb;
$table = PMXI_Plugin::getInstance()->getTablePrefix() . 'imports';
$imports = $wpdb->get_results("SELECT * FROM $table WHERE `parent_import_id` = 0", ARRAY_A);
if ( empty($imports) )
{
$this->wpml_addon->add_text("This is your first import. Default language will be choosen automatically ( " . $this->get_flag_html($this->default_language) . $this->wpml->get_display_language_name($this->default_language, 'en') ." ).");
}
$langs = $this->wpml->get_active_languages();
if ( ! empty($langs) )
{
// prepare active languages list
$language_list = array();
foreach ($langs as $code => $langInfo)
{
$language_list[$code] = $this->get_flag_html($code) . $langInfo['display_name'];
if ($code == $this->default_language) $language_list[$code] .= ' ( default )';
}
$this->wpml_addon->add_field(
'lng',
'Content Language',
'radio',
$language_list
);
if ( ! empty($imports) )
{
// prepare active imports list
$import_list = array();
foreach ( $imports as $import )
{
if ( ! empty($_GET['id']) and $_GET['id'] == $import['id'] ) continue;
$import_options = unserialize($import['options']);
$import_list[$import['id']] = '[ ID: ' . $import['id'] . ' ] ' . ( ( ! empty($import_options['wpml_addon']['lng'])) ? $this->get_flag_html($import_options['wpml_addon']['lng']) : '' ) . (( ! empty($import['friendly_name']) ) ? $import['friendly_name'] : $import['name']);
}
$this->wpml_addon->add_options(
null,
'Automatic Record Matching to Translate',
array(
$this->wpml_addon->add_field(
'matching_logic',
'Records matching logic',
'radio',
array(
'' => 'Import data in main language (' . $this->wpml->get_display_language_name($this->default_language, 'en') . ')',
'auto' => array(
'Define parent import',
$this->wpml_addon->add_field(
'import',
'Import to translate',
'radio',
$import_list
),
$this->wpml_addon->add_field('unique_key', 'Unique Identifier', 'text', null, 'To inform WPML that this new post is translation of another post put the same unique identifier like you did for post in main language.')
)
)
)
)
);
// Aditional Options [ TODO: taxonomies options, media options, etc. ]
// $this->wpml_addon->add_options(
// null,
// 'Advanced Settings',
// array(
// $this->wpml_addon->add_field('translate_taxes', 'Translate taxonomies', 'radio', array('' => 'No', '1' => 'Yes'))
// )
// );
}
return;
}
$this->wpml_addon->add_text('Please set up site languages before using \'WP All Import - WPML add-on.\'');
}
public function get_flag_html( $code )
{
return " ";
}
// [filters]
/**
*
* Import's friendly name on manage imports screen
*
*/
public function import_name($friendly_name, $import_id)
{
$import = new PMXI_Import_Record();
$import->getById($import_id);
if ( ! $import->isEmpty())
{
if ( ! empty($import->options['wpml_addon']['lng']) )
{
$friendly_name = $this->get_flag_html($import->options['wpml_addon']['lng']) . $friendly_name;
}
}
return $friendly_name;
}
// [\filters]
// [actions]
public function enqueue_stylesheets()
{
wp_enqueue_style( 'wp-all-import-wpml-add-on', self::ROOT_URL . '/static/css/admin.css', false, 0.1, 'all' );
}
/**
*
* Fires before inserting/updating post [do_action - 'pmxi_before_post_import']
*
*/
public function before_post_import( $import_id )
{
$this->current_language = apply_filters('wpml_current_language', null);
if ( empty($this->language_code) )
{
$import = new PMXI_Import_Record();
$import->getById( $import_id );
if ( ! $import->isEmpty() )
{
$this->language_code = (empty($import->options['wpml_addon']['lng'])) ? $this->default_language : $import->options['wpml_addon']['lng'];
}
}
// switch language to language in which post should be created
do_action( 'wpml_switch_language', $this->language_code );
}
/**
*
* Fires after inserting/updating post [do_action - 'pmxi_after_post_import']
*
*/
public function after_post_import( $import_id )
{
// switch language back to main
do_action( 'wpml_switch_language', $this->current_language );
}
/**
*
* Fires after saving post [do_action - 'pmxi_saved_post']
*
*/
public function saved_post( $post_id )
{
/*
set postmeta '_wcml_duplicate_of_variation' for translated product variations
*/
$post_type = get_post_type($post_id);
$wpml_post_type = "post_".$post_type;
if ('product_variation' == $post_type) {
$post_language = apply_filters( 'wpml_element_language_code', null,
array('element_id' => $post_id,
'element_type' => $post_type));
if ($this->default_language != $post_language) {
$post_meta_key = '_wcml_duplicate_of_variation';
$current_post_meta = get_post_meta($post_id, $post_meta_key, true);
if (!is_numeric($current_post_meta)) {
$trid = apply_filters( 'wpml_element_trid', null, $post_id, $wpml_post_type);
if (is_numeric($trid)) {
$translations = apply_filters( 'wpml_get_element_translations', null, $trid, $wpml_post_type);
if (is_array($translations) && isset($translations[$this->default_language])) {
$original_post_object = $translations[$this->default_language];
if (isset($original_post_object->element_id)) {
$original_post_id = $original_post_object->element_id;
add_post_meta( $post_id, $post_meta_key, $original_post_id );
}
}
} else {
throw new Exception("No trid for product variation in secondary language, imposssible to set _wcml_duplicate_of_variation");
}
}
}
}
}
/**
*
* Fires before deleting post [do_action - 'pmxi_delete_post']
*
*/
public function delete_post( $post_id )
{
global $wpdb;
$post_type = 'post_' . get_post_type($post_id);
$delete_args = array($post_id, $post_type);
$delete_sql = "DELETE FROM {$wpdb->prefix}icl_translations WHERE element_id=%d AND element_type=%s";
$delete_sql_prepared = $wpdb->prepare($delete_sql, $delete_args);
$wpdb->query( $delete_sql_prepared );
$this->wpml->get_translations_cache()->clear();
}
//[\actions]
/**
*
* Fires after wp_insert_post/wp_update_post
*
*/
public function import($post_id, $data, $import, $articleData, $logger)
{
// return if this is a basic post ( not a translation )
if ( empty($import['options']['wpml_addon']['matching_logic']) or empty($import['options']['wpml_addon']['import']) ) return;
// search for post to translate
$parentImport = new PMXI_Import_Record();
$parentImport->getById($import['options']['wpml_addon']['import']);
if ( ! $parentImport->isEmpty())
{
// post is that must be translated
$parent_post_id = false;
$postRecord = new PMXI_Post_Record();
$postRecord->clear();
$postRecord->getBy(array(
'unique_key' => $data['unique_key'],
'import_id' => $import['options']['wpml_addon']['import']
));
if ( ! $postRecord->isEmpty() )
$parent_post_id = $postRecord->post_id;
if ($parent_post_id)
{
if (isset($articleData['post_type']) && "taxonomies" == $articleData['post_type'] && isset($articleData['taxonomy'])) {
$post_type = 'tax_' . $articleData['taxonomy'];
// update untranslated taxonomy count
global $woocommerce_wpml;
if ( isset ( $woocommerce_wpml ) ) {
$woocommerce_wpml->terms->update_terms_translated_status( $articleData['taxonomy'] );
}
} else {
$post_type = 'post_' . get_post_type($post_id);
}
$trid = $this->wpml->get_element_trid($parent_post_id, $post_type);
if ( $trid )
{
global $wpdb;
// sync translation slug
$parent_post = get_post($parent_post_id);
if ( ! empty($parent_post) and $parent_post->post_title == $articleData['post_title'])
{
$wpdb->update( $wpdb->posts, array( 'post_name' => $parent_post->post_name ), array( 'ID' => $post_id ) );
}
// create a translation
$tid = $this->wpml->set_element_language_details($post_id, $post_type, $trid, $import->options['wpml_addon']['lng'], $parentImport->options['wpml_addon']['lng'], false);
if (is_wp_error($tid))
{
$logger and call_user_func($logger, __('ERROR', 'wpml-all-import') . ': ' . $tid->get_error_message());
}
else
{
$logger and call_user_func($logger, sprintf(__('- Created `%s` translation for `%s`', 'wpml-all-import'), $import->options['wpml_addon']['lng'], $parent_post->post_title));
}
}
}
}
}
/**
*
* Fires after all data has been imported, e.q. images, taxonomies, custom fields etc.
*
*/
public function saved( $post_id, $import, $logger )
{
// TODO: here we can add translations for taxonomies and ather stuff
$logger and call_user_func($logger, __('TEST', 'wpml-all-import'));
}
public function wp_all_import_term_exists( $term_a, $taxonomy, $term, $parent) {
if ( ! $this->wpml->is_translated_taxonomy( $taxonomy ) ) return $term_a;
if ( ! empty($term_a) and ! is_wp_error($term_a) )
{
$term_id = apply_filters('wpml_object_id', $term_a['term_id'], $taxonomy, true, $this->language_code);
$term_a = get_term_by('id', $term_id, $taxonomy, ARRAY_A);
}
return $term_a;
}
public function get_existing_image_filter( $attachment_id ) {
if ( $this->language_code ) {
$attachment_id = apply_filters( 'wpml_object_id', $attachment_id, 'attachment', true, $this->language_code );
}
return $attachment_id;
}
public function get_image_from_gallery_filter( $attachment ) {
if ( $this->language_code && $attachment ) {
global $wpdb;
$localized_attachment_id = apply_filters( 'wpml_object_id', $attachment->ID, 'attachment', false, $this->language_code );
if ( $localized_attachment_id ) {
$localized_attachment = $wpdb->get_row(
$wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE ID = %d AND post_type = %s AND post_mime_type LIKE %s;", $localized_attachment_id, 'attachment', 'image%' )
);
if ( $localized_attachment ) {
$attachment = $localized_attachment;
}
}
}
return $attachment;
}
public function add_attachment_action( $attachment_id ) {
$translation_id = apply_filters( 'wpml_element_trid', false, $attachment_id, 'post_attachment' );
if ( $this->language_code && ! $translation_id ) {
do_action( 'wpml_set_element_language_details', array(
'element_id' => $attachment_id,
'element_type' => 'post_attachment',
'trid' => false,
'language_code' => $this->language_code,
) );
$factory = new WPML_Media_Attachments_Duplication_Factory();
$media_duplicate = $factory->create();
$media_duplicate->save_attachment_actions( $attachment_id );
}
}
}
WPAI_WPML::getInstance();
}