function pmxi_recursion_taxes($parent, $tx_name, $txes, $key)
{
    if (is_array($parent)) {
        $parent['name'] = sanitize_text_field($parent['name']);
        if (empty($parent['parent'])) {
            $term = is_exists_term($tx_name, $parent['name']);
            if (empty($term) and !is_wp_error($term)) {
                $term = wp_insert_term($parent['name'], $tx_name);
            }
            return !is_wp_error($term) ? $term['term_id'] : 0;
        } else {
            $parent_id = pmxi_recursion_taxes($parent['parent'], $tx_name, $txes, $key);
            $term = is_exists_term($tx_name, $parent['name'], (int) $parent_id);
            if (empty($term) and !is_wp_error($term)) {
                $term = wp_insert_term($parent, $tx_name, array('parent' => !empty($parent_id) ? (int) $parent_id : 0));
            }
            return !is_wp_error($term) ? $term['term_id'] : 0;
        }
    } else {
        if (!empty($txes[$key - 1]) and !empty($txes[$key - 1]['parent']) and $parent != $txes[$key - 1]['parent']) {
            $parent_id = pmxi_recursion_taxes($txes[$key - 1]['parent'], $tx_name, $txes, $key - 1);
            $term = is_exists_term($tx_name, $parent, (int) $parent_id);
            if (empty($term) and !is_wp_error($term)) {
                $term = wp_insert_term($parent, $tx_name, array('parent' => !empty($parent_id) ? (int) $parent_id : 0));
            }
            return !is_wp_error($term) ? $term['term_id'] : 0;
        } else {
            $term = is_exists_term($tx_name, $parent);
            if (empty($term) and !is_wp_error($term)) {
                $term = wp_insert_term($parent, $tx_name);
            }
            return !is_wp_error($term) ? $term['term_id'] : 0;
        }
    }
}
Example #2
0
function pmxi_recursion_taxes($parent, $tx_name, $txes, $key)
{
    if (is_array($parent)) {
        if (empty($parent['parent'])) {
            $term = is_exists_term($parent['name'], $tx_name, 0);
            if (empty($term) and !is_wp_error($term)) {
                $term = is_exists_term(htmlspecialchars($parent['name']), $tx_name, 0);
                if (empty($term) and !is_wp_error($term)) {
                    $term = wp_insert_term($parent['name'], $tx_name);
                }
            }
            return (!empty($term) and !is_wp_error($term)) ? $term['term_id'] : 0;
        } else {
            $parent_id = pmxi_recursion_taxes($parent['parent'], $tx_name, $txes, $key);
            $term = is_exists_term($parent['name'], $tx_name, (int) $parent_id);
            if (empty($term) and !is_wp_error($term)) {
                $term = is_exists_term(htmlspecialchars($parent['name']), $tx_name, (int) $parent_id);
                if (empty($term) and !is_wp_error($term)) {
                    $term = wp_insert_term($parent['name'], $tx_name, array('parent' => !empty($parent_id) ? (int) $parent_id : 0));
                }
            }
            return (!empty($term) and !is_wp_error($term)) ? $term['term_id'] : 0;
        }
    } else {
        if (!empty($txes[$key - 1]) and !empty($txes[$key - 1]['parent']) and $parent != $txes[$key - 1]['parent']) {
            $parent_id = pmxi_recursion_taxes($txes[$key - 1]['parent'], $tx_name, $txes, $key - 1);
            $term = is_exists_term($parent, $tx_name, (int) $parent_id);
            if (empty($term) and !is_wp_error($term)) {
                $term = is_exists_term(htmlspecialchars($parent), $tx_name, (int) $parent_id);
                if (empty($term) and !is_wp_error($term)) {
                    $term = wp_insert_term($parent, $tx_name, array('parent' => !empty($parent_id) ? (int) $parent_id : 0));
                }
            }
            return (!empty($term) and !is_wp_error($term)) ? $term['term_id'] : 0;
        } else {
            $term = is_exists_term($parent, $tx_name);
            if (empty($term) and !is_wp_error($term)) {
                $term = is_exists_term(htmlspecialchars($parent), $tx_name);
                if (empty($term) and !is_wp_error($term)) {
                    $term = wp_insert_term($parent, $tx_name);
                }
            }
            return (!empty($term) and !is_wp_error($term)) ? $term['term_id'] : 0;
        }
    }
}
Example #3
0
 /**
  * Perform import operation
  * @param string $xml XML string to import
  * @param callback[optional] $logger Method where progress messages are submmitted
  * @return PMXI_Import_Record
  * @chainable
  */
 public function process($xml, $logger = NULL, $chunk = false, $is_cron = false, $xpath_prefix = '', $loop = 0)
 {
     add_filter('user_has_cap', array($this, '_filter_has_cap_unfiltered_html'));
     kses_init();
     // do not perform special filtering for imported content
     kses_remove_filters();
     $cxpath = $xpath_prefix . $this->xpath;
     $this->options += PMXI_Plugin::get_default_import_options();
     // make sure all options are defined
     $avoid_pingbacks = PMXI_Plugin::getInstance()->getOption('pingbacks');
     $cron_sleep = (int) PMXI_Plugin::getInstance()->getOption('cron_sleep');
     if ($avoid_pingbacks and !defined('WP_IMPORTING')) {
         define('WP_IMPORTING', true);
     }
     $postRecord = new PMXI_Post_Record();
     $tmp_files = array();
     // compose records to import
     $records = array();
     $is_import_complete = false;
     try {
         $chunk == 1 and $logger and call_user_func($logger, __('Composing titles...', 'wp_all_import_plugin'));
         if (!empty($this->options['title'])) {
             $titles = XmlImportParser::factory($xml, $cxpath, $this->options['title'], $file)->parse($records);
             $tmp_files[] = $file;
         } else {
             $loop and $titles = array_fill(0, $loop, '');
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing excerpts...', 'wp_all_import_plugin'));
         $post_excerpt = array();
         if (!empty($this->options['post_excerpt'])) {
             $post_excerpt = XmlImportParser::factory($xml, $cxpath, $this->options['post_excerpt'], $file)->parse($records);
             $tmp_files[] = $file;
         } else {
             count($titles) and $post_excerpt = array_fill(0, count($titles), '');
         }
         if ("xpath" == $this->options['status']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing statuses...', 'wp_all_import_plugin'));
             $post_status = array();
             if (!empty($this->options['status_xpath'])) {
                 $post_status = XmlImportParser::factory($xml, $cxpath, $this->options['status_xpath'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $post_status = array_fill(0, count($titles), 'publish');
             }
         }
         if ("xpath" == $this->options['comment_status']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing comment statuses...', 'wp_all_import_plugin'));
             $comment_status = array();
             if (!empty($this->options['comment_status_xpath'])) {
                 $comment_status = XmlImportParser::factory($xml, $cxpath, $this->options['comment_status_xpath'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $comment_status = array_fill(0, count($titles), 'open');
             }
         }
         if ("xpath" == $this->options['ping_status']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing ping statuses...', 'wp_all_import_plugin'));
             $ping_status = array();
             if (!empty($this->options['ping_status_xpath'])) {
                 $ping_status = XmlImportParser::factory($xml, $cxpath, $this->options['ping_status_xpath'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $ping_status = array_fill(0, count($titles), 'open');
             }
         }
         if ("xpath" == $this->options['post_format']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing post formats...', 'wp_all_import_plugin'));
             $post_format = array();
             if (!empty($this->options['post_format_xpath'])) {
                 $post_format = XmlImportParser::factory($xml, $cxpath, $this->options['post_format_xpath'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $post_format = array_fill(0, count($titles), 'open');
             }
         }
         if ("pid" == $this->options['duplicate_indicator']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing post IDs...', 'wp_all_import_plugin'));
             $post_ids = array();
             if (!empty($this->options['pid_xpath'])) {
                 $post_ids = XmlImportParser::factory($xml, $cxpath, $this->options['pid_xpath'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $post_ids = array_fill(0, count($titles), '');
             }
         }
         if ("no" == $this->options['is_multiple_page_template']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing page templates...', 'wp_all_import_plugin'));
             $page_template = array();
             if (!empty($this->options['single_page_template'])) {
                 $page_template = XmlImportParser::factory($xml, $cxpath, $this->options['single_page_template'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $page_template = array_fill(0, count($titles), 'default');
             }
         }
         if ($this->options['is_override_post_type'] and !empty($this->options['post_type_xpath'])) {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing post types...', 'wp_all_import_plugin'));
             $post_type = array();
             $post_type = XmlImportParser::factory($xml, $cxpath, $this->options['post_type_xpath'], $file)->parse($records);
             $tmp_files[] = $file;
         } else {
             if ('post' == $this->options['type'] and '' != $this->options['custom_type']) {
                 $pType = $this->options['custom_type'];
             } else {
                 $pType = $this->options['type'];
             }
             count($titles) and $post_type = array_fill(0, count($titles), $pType);
         }
         if ("no" == $this->options['is_multiple_page_parent']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing page parent...', 'wp_all_import_plugin'));
             $page_parent = array();
             if (!empty($this->options['single_page_parent'])) {
                 $page_parent = XmlImportParser::factory($xml, $cxpath, $this->options['single_page_parent'], $file)->parse($records);
                 $tmp_files[] = $file;
                 foreach ($page_parent as $key => $identity) {
                     $page = 0;
                     switch ($this->options['type']) {
                         case 'post':
                             if (!empty($identity)) {
                                 if (ctype_digit($identity)) {
                                     $page = get_post($identity);
                                 } else {
                                     $page = get_page_by_title($identity, OBJECT, $post_type[$key]);
                                     if (empty($page)) {
                                         $args = array('name' => $identity, 'post_type' => $post_type[$key], 'post_status' => 'any', 'numberposts' => 1);
                                         $my_posts = get_posts($args);
                                         if ($my_posts) {
                                             $page = $my_posts[0];
                                         }
                                     }
                                 }
                             }
                             break;
                         case 'page':
                             $page = get_page_by_title($identity) or $page = get_page_by_path($identity) or ctype_digit($identity) and $page = get_post($identity);
                             break;
                         default:
                             # code...
                             break;
                     }
                     $page_parent[$key] = !empty($page) ? $page->ID : 0;
                 }
             } else {
                 count($titles) and $page_parent = array_fill(0, count($titles), 0);
             }
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing authors...', 'wp_all_import_plugin'));
         $post_author = array();
         $current_user = wp_get_current_user();
         if (!empty($this->options['author'])) {
             $post_author = XmlImportParser::factory($xml, $cxpath, $this->options['author'], $file)->parse($records);
             $tmp_files[] = $file;
             foreach ($post_author as $key => $author) {
                 $user = get_user_by('login', $author) or $user = get_user_by('slug', $author) or $user = get_user_by('email', $author) or ctype_digit($author) and $user = get_user_by('id', $author);
                 if (!empty($user)) {
                     $post_author[$key] = $user->ID;
                 } else {
                     if ($current_user->ID) {
                         $post_author[$key] = $current_user->ID;
                     } else {
                         $super_admins = get_super_admins();
                         if (!empty($super_admins)) {
                             $sauthor = array_shift($super_admins);
                             $user = get_user_by('login', $sauthor) or $user = get_user_by('slug', $sauthor) or $user = get_user_by('email', $sauthor) or ctype_digit($sauthor) and $user = get_user_by('id', $sauthor);
                             $post_author[$key] = !empty($user) ? $user->ID : $current_user->ID;
                         }
                     }
                 }
             }
         } else {
             if ($current_user->ID) {
                 count($titles) and $post_author = array_fill(0, count($titles), $current_user->ID);
             } else {
                 $super_admins = get_super_admins();
                 if (!empty($super_admins)) {
                     $author = array_shift($super_admins);
                     $user = get_user_by('login', $author) or $user = get_user_by('slug', $author) or $user = get_user_by('email', $author) or ctype_digit($author) and $user = get_user_by('id', $author);
                     count($titles) and $post_author = array_fill(0, count($titles), !empty($user) ? $user->ID : $current_user->ID);
                 }
             }
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing slugs...', 'wp_all_import_plugin'));
         $post_slug = array();
         if (!empty($this->options['post_slug'])) {
             $post_slug = XmlImportParser::factory($xml, $cxpath, $this->options['post_slug'], $file)->parse($records);
             $tmp_files[] = $file;
         } else {
             count($titles) and $post_slug = array_fill(0, count($titles), '');
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing menu order...', 'wp_all_import_plugin'));
         $menu_order = array();
         if (!empty($this->options['order'])) {
             $menu_order = XmlImportParser::factory($xml, $cxpath, $this->options['order'], $file)->parse($records);
             $tmp_files[] = $file;
         } else {
             count($titles) and $menu_order = array_fill(0, count($titles), '');
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing contents...', 'wp_all_import_plugin'));
         if (!empty($this->options['content'])) {
             $contents = XmlImportParser::factory((!empty($this->options['is_keep_linebreaks']) and intval($this->options['is_keep_linebreaks'])) ? $xml : preg_replace('%\\r\\n?|\\n%', ' ', $xml), $cxpath, $this->options['content'], $file)->parse($records);
             $tmp_files[] = $file;
         } else {
             count($titles) and $contents = array_fill(0, count($titles), '');
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing dates...', 'wp_all_import_plugin'));
         if ('specific' == $this->options['date_type']) {
             $dates = XmlImportParser::factory($xml, $cxpath, $this->options['date'], $file)->parse($records);
             $tmp_files[] = $file;
             $warned = array();
             // used to prevent the same notice displaying several times
             foreach ($dates as $i => $d) {
                 if ($d == 'now') {
                     $d = current_time('mysql');
                 }
                 // Replace 'now' with the WordPress local time to account for timezone offsets (WordPress references its local time during publishing rather than the server’s time so it should use that)
                 $time = strtotime($d);
                 if (FALSE === $time) {
                     in_array($d, $warned) or $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: unrecognized date format `%s`, assigning current date', 'wp_all_import_plugin'), $warned[] = $d));
                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                     $time = time();
                 }
                 $dates[$i] = date('Y-m-d H:i:s', $time);
             }
         } else {
             $dates_start = XmlImportParser::factory($xml, $cxpath, $this->options['date_start'], $file)->parse($records);
             $tmp_files[] = $file;
             $dates_end = XmlImportParser::factory($xml, $cxpath, $this->options['date_end'], $file)->parse($records);
             $tmp_files[] = $file;
             $warned = array();
             // used to prevent the same notice displaying several times
             foreach ($dates_start as $i => $d) {
                 $time_start = strtotime($dates_start[$i]);
                 if (FALSE === $time_start) {
                     in_array($dates_start[$i], $warned) or $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: unrecognized date format `%s`, assigning current date', 'wp_all_import_plugin'), $warned[] = $dates_start[$i]));
                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                     $time_start = time();
                 }
                 $time_end = strtotime($dates_end[$i]);
                 if (FALSE === $time_end) {
                     in_array($dates_end[$i], $warned) or $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: unrecognized date format `%s`, assigning current date', 'wp_all_import_plugin'), $warned[] = $dates_end[$i]));
                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                     $time_end = time();
                 }
                 $dates[$i] = date('Y-m-d H:i:s', mt_rand($time_start, $time_end));
             }
         }
         // [custom taxonomies]
         require_once ABSPATH . 'wp-admin/includes/taxonomy.php';
         $taxonomies = array();
         $exclude_taxonomies = apply_filters('pmxi_exclude_taxonomies', class_exists('PMWI_Plugin') ? array('post_format', 'product_type', 'product_shipping_class') : array('post_format'));
         $post_taxonomies = array_diff_key(get_taxonomies_by_object_type(array($this->options['custom_type']), 'object'), array_flip($exclude_taxonomies));
         if (!empty($post_taxonomies)) {
             foreach ($post_taxonomies as $ctx) {
                 if ("" == $ctx->labels->name or class_exists('PMWI_Plugin') and strpos($ctx->name, "pa_") === 0 and $this->options['custom_type'] == "product") {
                     continue;
                 }
                 $chunk == 1 and $logger and call_user_func($logger, sprintf(__('Composing terms for `%s` taxonomy...', 'wp_all_import_plugin'), $ctx->labels->name));
                 $tx_name = $ctx->name;
                 $mapping_rules = !empty($this->options['tax_mapping'][$tx_name]) ? json_decode($this->options['tax_mapping'][$tx_name], true) : false;
                 $taxonomies[$tx_name] = array();
                 if (!empty($this->options['tax_logic'][$tx_name]) and !empty($this->options['tax_assing'][$tx_name])) {
                     switch ($this->options['tax_logic'][$tx_name]) {
                         case 'single':
                             if (!empty($this->options['tax_single_xpath'][$tx_name])) {
                                 $txes = XmlImportParser::factory($xml, $cxpath, $this->options['tax_single_xpath'][$tx_name], $file)->parse($records);
                                 $tmp_files[] = $file;
                                 foreach ($txes as $i => $tx) {
                                     $taxonomies[$tx_name][$i][] = wp_all_import_ctx_mapping(array('name' => $tx, 'parent' => false, 'assign' => isset($this->options['term_assing'][$tx_name]) ? $this->options['term_assing'][$tx_name] : true, 'is_mapping' => !empty($this->options['tax_enable_mapping'][$tx_name]), 'hierarchy_level' => 1, 'max_hierarchy_level' => 1), $mapping_rules, $tx_name);
                                 }
                             }
                             break;
                         case 'multiple':
                             if (!empty($this->options['tax_multiple_xpath'][$tx_name])) {
                                 $txes = XmlImportParser::factory($xml, $cxpath, $this->options['tax_multiple_xpath'][$tx_name], $file)->parse($records);
                                 $tmp_files[] = $file;
                                 foreach ($txes as $i => $tx) {
                                     $_tx = $tx;
                                     // apply mapping rules before splitting via separator symbol
                                     if (!empty($this->options['tax_enable_mapping'][$tx_name]) and !empty($this->options['tax_logic_mapping'][$tx_name])) {
                                         if (!empty($mapping_rules)) {
                                             foreach ($mapping_rules as $rule) {
                                                 if (!empty($rule[trim($_tx)])) {
                                                     $_tx = trim($rule[trim($_tx)]);
                                                     break;
                                                 }
                                             }
                                         }
                                     }
                                     $delimeted_taxonomies = explode(!empty($this->options['tax_multiple_delim'][$tx_name]) ? $this->options['tax_multiple_delim'][$tx_name] : ',', $_tx);
                                     if (!empty($delimeted_taxonomies)) {
                                         foreach ($delimeted_taxonomies as $cc) {
                                             $taxonomies[$tx_name][$i][] = wp_all_import_ctx_mapping(array('name' => $cc, 'parent' => false, 'assign' => isset($this->options['multiple_term_assing'][$tx_name]) ? $this->options['multiple_term_assing'][$tx_name] : true, 'is_mapping' => !empty($this->options['tax_enable_mapping'][$tx_name]) and empty($this->options['tax_logic_mapping'][$tx_name]), 'hierarchy_level' => 1, 'max_hierarchy_level' => 1), $mapping_rules, $tx_name);
                                         }
                                     }
                                 }
                             }
                             break;
                         case 'hierarchical':
                             if (!empty($this->options['tax_hierarchical_logic_entire'][$tx_name])) {
                                 if (!empty($this->options['tax_hierarchical_xpath'][$tx_name]) and is_array($this->options['tax_hierarchical_xpath'][$tx_name])) {
                                     count($titles) and $iterator = array_fill(0, count($titles), 0);
                                     $taxonomies_hierarchy_groups = array_fill(0, count($titles), array());
                                     // separate hierarchy groups via symbol
                                     if (!empty($this->options['is_tax_hierarchical_group_delim'][$tx_name]) and !empty($this->options['tax_hierarchical_group_delim'][$tx_name])) {
                                         foreach ($this->options['tax_hierarchical_xpath'][$tx_name] as $k => $tx_xpath) {
                                             if (empty($tx_xpath)) {
                                                 continue;
                                             }
                                             $txes = XmlImportParser::factory($xml, $cxpath, $tx_xpath, $file)->parse($records);
                                             $tmp_files[] = $file;
                                             foreach ($txes as $i => $tx) {
                                                 $_tx = $tx;
                                                 // apply mapping rules before splitting via separator symbol
                                                 if (!empty($this->options['tax_enable_mapping'][$tx_name]) and !empty($this->options['tax_logic_mapping'][$tx_name])) {
                                                     if (!empty($mapping_rules)) {
                                                         foreach ($mapping_rules as $rule) {
                                                             if (!empty($rule[trim($_tx)])) {
                                                                 $_tx = trim($rule[trim($_tx)]);
                                                                 break;
                                                             }
                                                         }
                                                     }
                                                 }
                                                 $delimeted_groups = explode($this->options['tax_hierarchical_group_delim'][$tx_name], $_tx);
                                                 if (!empty($delimeted_groups) and is_array($delimeted_groups)) {
                                                     foreach ($delimeted_groups as $group) {
                                                         if (!empty($group)) {
                                                             array_push($taxonomies_hierarchy_groups[$i], $group);
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     } else {
                                         foreach ($this->options['tax_hierarchical_xpath'][$tx_name] as $k => $tx_xpath) {
                                             if (empty($tx_xpath)) {
                                                 continue;
                                             }
                                             $txes = XmlImportParser::factory($xml, $cxpath, $tx_xpath, $file)->parse($records);
                                             $tmp_files[] = $file;
                                             foreach ($txes as $i => $tx) {
                                                 array_push($taxonomies_hierarchy_groups[$i], $tx);
                                             }
                                         }
                                     }
                                     foreach ($taxonomies_hierarchy_groups as $i => $groups) {
                                         if (empty($groups)) {
                                             continue;
                                         }
                                         foreach ($groups as $kk => $tx) {
                                             $_tx = $tx;
                                             // apply mapping rules before splitting via separator symbol
                                             if (!empty($this->options['tax_enable_mapping'][$tx_name]) and !empty($this->options['tax_logic_mapping'][$tx_name])) {
                                                 if (!empty($mapping_rules)) {
                                                     foreach ($mapping_rules as $rule) {
                                                         if (!empty($rule[trim($_tx)])) {
                                                             $_tx = trim($rule[trim($_tx)]);
                                                             break;
                                                         }
                                                     }
                                                 }
                                             }
                                             $delimeted_taxonomies = explode(!empty($this->options['tax_hierarchical_delim'][$tx_name]) ? $this->options['tax_hierarchical_delim'][$tx_name] : ',', $_tx);
                                             if (!empty($delimeted_taxonomies)) {
                                                 foreach ($delimeted_taxonomies as $j => $cc) {
                                                     $is_assign_term = isset($this->options['tax_hierarchical_assing'][$tx_name][$k]) ? $this->options['tax_hierarchical_assing'][$tx_name][$k] : true;
                                                     if (!empty($this->options['tax_hierarchical_last_level_assign'][$tx_name])) {
                                                         $is_assign_term = count($delimeted_taxonomies) == $j + 1 ? 1 : 0;
                                                     }
                                                     $taxonomies[$tx_name][$i][] = wp_all_import_ctx_mapping(array('name' => $cc, 'parent' => (!empty($taxonomies[$tx_name][$i][$iterator[$i] - 1]) and $j) ? $taxonomies[$tx_name][$i][$iterator[$i] - 1] : false, 'assign' => $is_assign_term, 'is_mapping' => !empty($this->options['tax_enable_mapping'][$tx_name]) and empty($this->options['tax_logic_mapping'][$tx_name]), 'hierarchy_level' => $j + 1, 'max_hierarchy_level' => count($delimeted_taxonomies)), $mapping_rules, $tx_name);
                                                     $iterator[$i]++;
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                             if (!empty($this->options['tax_hierarchical_logic_manual'][$tx_name])) {
                                 if (!empty($this->options['post_taxonomies'][$tx_name])) {
                                     $taxonomies_hierarchy = json_decode($this->options['post_taxonomies'][$tx_name], true);
                                     foreach ($taxonomies_hierarchy as $k => $taxonomy) {
                                         if ("" == $taxonomy['xpath']) {
                                             continue;
                                         }
                                         $txes_raw = XmlImportParser::factory($xml, $cxpath, $taxonomy['xpath'], $file)->parse($records);
                                         $tmp_files[] = $file;
                                         $warned = array();
                                         foreach ($txes_raw as $i => $cc) {
                                             $_tx = $cc;
                                             // apply mapping rules before splitting via separator symbol
                                             if (!empty($this->options['tax_enable_mapping'][$tx_name]) and !empty($this->options['tax_logic_mapping'][$tx_name])) {
                                                 if (!empty($mapping_rules)) {
                                                     foreach ($mapping_rules as $rule) {
                                                         if (!empty($rule[trim($_tx)])) {
                                                             $_tx = trim($rule[trim($_tx)]);
                                                             break;
                                                         }
                                                     }
                                                 }
                                             }
                                             if (!empty($this->options['tax_manualhierarchy_delim'][$tx_name])) {
                                                 $delimeted_taxonomies = explode($this->options['tax_manualhierarchy_delim'][$tx_name], $_tx);
                                             }
                                             if (empty($delimeted_taxonomies)) {
                                                 continue;
                                             }
                                             if (empty($taxonomies_hierarchy[$k]['txn_names'][$i])) {
                                                 $taxonomies_hierarchy[$k]['txn_names'][$i] = array();
                                             }
                                             if (empty($taxonomies[$tx_name][$i])) {
                                                 $taxonomies[$tx_name][$i] = array();
                                             }
                                             $count_cats = count($taxonomies[$tx_name][$i]);
                                             foreach ($delimeted_taxonomies as $j => $dc) {
                                                 if (!empty($taxonomy['parent_id'])) {
                                                     foreach ($taxonomies_hierarchy as $key => $value) {
                                                         if ($value['item_id'] == $taxonomy['parent_id'] and !empty($value['txn_names'][$i])) {
                                                             foreach ($value['txn_names'][$i] as $parent) {
                                                                 $taxonomies[$tx_name][$i][] = wp_all_import_ctx_mapping(array('name' => trim($dc), 'parent' => $parent, 'assign' => isset($taxonomy['assign']) ? $taxonomy['assign'] : true, 'is_mapping' => !empty($this->options['tax_enable_mapping'][$tx_name]) and empty($this->options['tax_logic_mapping'][$tx_name]), 'hierarchy_level' => 1, 'max_hierarchy_level' => 1), $mapping_rules, $tx_name);
                                                             }
                                                         }
                                                     }
                                                 } else {
                                                     $taxonomies[$tx_name][$i][] = wp_all_import_ctx_mapping(array('name' => trim($dc), 'parent' => false, 'assign' => isset($taxonomy['assign']) ? $taxonomy['assign'] : true, 'is_mapping' => !empty($this->options['tax_enable_mapping'][$tx_name]) and empty($this->options['tax_logic_mapping'][$tx_name]), 'hierarchy_level' => 1, 'max_hierarchy_level' => 1), $mapping_rules, $tx_name);
                                                 }
                                                 if ($count_cats < count($taxonomies[$tx_name][$i])) {
                                                     $taxonomies_hierarchy[$k]['txn_names'][$i][] = $taxonomies[$tx_name][$i][count($taxonomies[$tx_name][$i]) - 1];
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                             break;
                         default:
                             break;
                     }
                 }
             }
         }
         // [/custom taxonomies]
         // Composing featured images
         $image_sections = apply_filters('wp_all_import_image_sections', array(array('slug' => '', 'title' => __('Images', 'wp_all_import_plugin'), 'type' => 'images')));
         if (!(($uploads = wp_upload_dir()) && false === $uploads['error'])) {
             $logger and call_user_func($logger, __('<b>WARNING</b>', 'wp_all_import_plugin') . ': ' . $uploads['error']);
             $logger and call_user_func($logger, __('<b>WARNING</b>: No featured images will be created. Uploads folder is not found.', 'wp_all_import_plugin'));
             $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
         } else {
             $images_bundle = array();
             $auto_rename_images_bundle = array();
             $auto_extensions_bundle = array();
             $image_meta_titles_bundle = array();
             $image_meta_captions_bundle = array();
             $image_meta_alts_bundle = array();
             $image_meta_descriptions_bundle = array();
             foreach ($image_sections as $section) {
                 $chunk == 1 and $logger and call_user_func($logger, __('Composing URLs for ' . strtolower($section['title']) . '...', 'wp_all_import_plugin'));
                 $featured_images = array();
                 if ("no" == $this->options[$section['slug'] . 'download_images']) {
                     if ($this->options[$section['slug'] . 'featured_image']) {
                         $featured_images = XmlImportParser::factory($xml, $cxpath, $this->options[$section['slug'] . 'featured_image'], $file)->parse($records);
                         $tmp_files[] = $file;
                     } else {
                         count($titles) and $featured_images = array_fill(0, count($titles), '');
                     }
                 } elseif ("gallery" == $this->options[$section['slug'] . 'download_images']) {
                     if ($this->options[$section['slug'] . 'gallery_featured_image']) {
                         $featured_images = XmlImportParser::factory($xml, $cxpath, $this->options[$section['slug'] . 'gallery_featured_image'], $file)->parse($records);
                         $tmp_files[] = $file;
                     } else {
                         count($titles) and $featured_images = array_fill(0, count($titles), '');
                     }
                 } else {
                     if ($this->options[$section['slug'] . 'download_featured_image']) {
                         $featured_images = XmlImportParser::factory($xml, $cxpath, $this->options[$section['slug'] . 'download_featured_image'], $file)->parse($records);
                         $tmp_files[] = $file;
                     } else {
                         count($titles) and $featured_images = array_fill(0, count($titles), '');
                     }
                 }
                 $images_bundle[empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = array('type' => $section['type'], 'files' => $featured_images);
                 // Composing images meta titles
                 if ($this->options[$section['slug'] . 'set_image_meta_title']) {
                     $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (titles)...', 'wp_all_import_plugin'));
                     $image_meta_titles = array();
                     if ($this->options[$section['slug'] . 'image_meta_title']) {
                         $image_meta_titles = XmlImportParser::factory($xml, $cxpath, $this->options[$section['slug'] . 'image_meta_title'], $file)->parse($records);
                         $tmp_files[] = $file;
                     } else {
                         count($titles) and $image_meta_titles = array_fill(0, count($titles), '');
                     }
                     $image_meta_titles_bundle[empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $image_meta_titles;
                 }
                 // Composing images meta captions
                 if ($this->options[$section['slug'] . 'set_image_meta_caption']) {
                     $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (captions)...', 'wp_all_import_plugin'));
                     $image_meta_captions = array();
                     if ($this->options[$section['slug'] . 'image_meta_caption']) {
                         $image_meta_captions = XmlImportParser::factory($xml, $cxpath, $this->options[$section['slug'] . 'image_meta_caption'], $file)->parse($records);
                         $tmp_files[] = $file;
                     } else {
                         count($titles) and $image_meta_captions = array_fill(0, count($titles), '');
                     }
                     $image_meta_captions_bundle[empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $image_meta_captions;
                 }
                 // Composing images meta alt text
                 if ($this->options[$section['slug'] . 'set_image_meta_alt']) {
                     $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (alt text)...', 'wp_all_import_plugin'));
                     $image_meta_alts = array();
                     if ($this->options[$section['slug'] . 'image_meta_alt']) {
                         $image_meta_alts = XmlImportParser::factory($xml, $cxpath, $this->options[$section['slug'] . 'image_meta_alt'], $file)->parse($records);
                         $tmp_files[] = $file;
                     } else {
                         count($titles) and $image_meta_alts = array_fill(0, count($titles), '');
                     }
                     $image_meta_alts_bundle[empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $image_meta_alts;
                 }
                 // Composing images meta description
                 if ($this->options[$section['slug'] . 'set_image_meta_description']) {
                     $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (description)...', 'wp_all_import_plugin'));
                     $image_meta_descriptions = array();
                     if ($this->options[$section['slug'] . 'image_meta_description']) {
                         $image_meta_descriptions = XmlImportParser::factory($xml, $cxpath, $this->options[$section['slug'] . 'image_meta_description'], $file)->parse($records);
                         $tmp_files[] = $file;
                     } else {
                         count($titles) and $image_meta_descriptions = array_fill(0, count($titles), '');
                     }
                     $image_meta_descriptions_bundle[empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $image_meta_descriptions;
                 }
                 if ("yes" == $this->options[$section['slug'] . 'download_images']) {
                     // Composing images suffix
                     $chunk == 1 and $this->options[$section['slug'] . 'auto_rename_images'] and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' suffix...', 'wp_all_import_plugin'));
                     $auto_rename_images = array();
                     if ($this->options[$section['slug'] . 'auto_rename_images'] and !empty($this->options[$section['slug'] . 'auto_rename_images_suffix'])) {
                         $auto_rename_images = XmlImportParser::factory($xml, $cxpath, $this->options[$section['slug'] . 'auto_rename_images_suffix'], $file)->parse($records);
                         $tmp_files[] = $file;
                     } else {
                         count($titles) and $auto_rename_images = array_fill(0, count($titles), '');
                     }
                     $auto_rename_images_bundle[empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $auto_rename_images;
                     // Composing images extensions
                     $chunk == 1 and $this->options[$section['slug'] . 'auto_set_extension'] and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' extensions...', 'wp_all_import_plugin'));
                     $auto_extensions = array();
                     if ($this->options[$section['slug'] . 'auto_set_extension'] and !empty($this->options[$section['slug'] . 'new_extension'])) {
                         $auto_extensions = XmlImportParser::factory($xml, $cxpath, $this->options[$section['slug'] . 'new_extension'], $file)->parse($records);
                         $tmp_files[] = $file;
                     } else {
                         count($titles) and $auto_extensions = array_fill(0, count($titles), '');
                     }
                     $auto_extensions_bundle[empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $auto_extensions;
                 }
             }
         }
         // Composing attachments
         if (!(($uploads = wp_upload_dir()) && false === $uploads['error'])) {
             $logger and call_user_func($logger, __('<b>WARNING</b>', 'wp_all_import_plugin') . ': ' . $uploads['error']);
             $logger and call_user_func($logger, __('<b>WARNING</b>: No attachments will be created', 'wp_all_import_plugin'));
             $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
         } else {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing URLs for attachments files...', 'wp_all_import_plugin'));
             $attachments = array();
             if ($this->options['attachments']) {
                 // Detect if attachments is separated by comma
                 $atchs = explode(',', $this->options['attachments']);
                 if (!empty($atchs)) {
                     $parse_multiple = true;
                     foreach ($atchs as $atch) {
                         if (!preg_match("/{.*}/", trim($atch))) {
                             $parse_multiple = false;
                         }
                     }
                     if ($parse_multiple) {
                         foreach ($atchs as $atch) {
                             $posts_attachments = XmlImportParser::factory($xml, $cxpath, trim($atch), $file)->parse($records);
                             $tmp_files[] = $file;
                             foreach ($posts_attachments as $i => $val) {
                                 $attachments[$i][] = $val;
                             }
                         }
                     } else {
                         $attachments = XmlImportParser::factory($xml, $cxpath, $this->options['attachments'], $file)->parse($records);
                         $tmp_files[] = $file;
                     }
                 }
             } else {
                 count($titles) and $attachments = array_fill(0, count($titles), '');
             }
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing unique keys...', 'wp_all_import_plugin'));
         if (!empty($this->options['unique_key'])) {
             $unique_keys = XmlImportParser::factory($xml, $cxpath, $this->options['unique_key'], $file)->parse($records);
             $tmp_files[] = $file;
         } else {
             count($titles) and $unique_keys = array_fill(0, count($titles), '');
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Processing posts...', 'wp_all_import_plugin'));
         $addons = array();
         $addons_data = array();
         // data parsing for WP All Import add-ons
         $chunk == 1 and $logger and call_user_func($logger, __('Data parsing via add-ons...', 'wp_all_import_plugin'));
         $parsingData = array('import' => $this, 'count' => count($titles), 'xml' => $xml, 'logger' => $logger, 'chunk' => $chunk, 'xpath_prefix' => $xpath_prefix);
         $parse_functions = apply_filters('wp_all_import_addon_parse', array());
         foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
             $model_class = str_replace("_Plugin", "_Import_Record", $class);
             if (class_exists($model_class)) {
                 $addons[$class] = new $model_class();
                 $addons_data[$class] = method_exists($addons[$class], 'parse') ? $addons[$class]->parse($parsingData) : false;
             } else {
                 if (!empty($parse_functions[$class])) {
                     if (is_array($parse_functions[$class]) and is_callable($parse_functions[$class]) or !is_array($parse_functions[$class]) and function_exists($parse_functions[$class])) {
                         $addons_data[$class] = call_user_func($parse_functions[$class], $parsingData);
                     }
                 }
             }
         }
         // save current import state to variables before import
         $created = $this->created;
         $updated = $this->updated;
         $skipped = $this->skipped;
         $specified_records = array();
         $simpleXml = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
         $rootNodes = $simpleXml->xpath($cxpath);
         if ($this->options['is_import_specified']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Calculate specified records to import...', 'wp_all_import_plugin'));
             $import_specified_option = apply_filters('wp_all_import_specified_records', $this->options['import_specified'], $this->id, $rootNodes);
             foreach (preg_split('% *, *%', $import_specified_option, -1, PREG_SPLIT_NO_EMPTY) as $chank) {
                 if (preg_match('%^(\\d+)-(\\d+)$%', $chank, $mtch)) {
                     $specified_records = array_merge($specified_records, range(intval($mtch[1]), intval($mtch[2])));
                 } else {
                     $specified_records = array_merge($specified_records, array(intval($chank)));
                 }
             }
         }
         foreach ($titles as $i => $void) {
             $custom_type_details = get_post_type_object($post_type[$i]);
             if ($is_cron and $cron_sleep) {
                 sleep($cron_sleep);
             }
             $logger and call_user_func($logger, __('---', 'wp_all_import_plugin'));
             $logger and call_user_func($logger, sprintf(__('Record #%s', 'wp_all_import_plugin'), $this->imported + $this->skipped + $i + 1));
             if ("manual" == $this->options['duplicate_matching'] and !empty($specified_records) and !in_array($created + $updated + $skipped + 1, $specified_records)) {
                 $skipped++;
                 $logger and call_user_func($logger, __('<b>SKIPPED</b>: by specified records option', 'wp_all_import_plugin'));
                 $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                 $logger and !$is_cron and PMXI_Plugin::$session->chunk_number++;
                 $logger and !$is_cron and PMXI_Plugin::$session->save_data();
                 continue;
             }
             wp_cache_flush();
             $logger and call_user_func($logger, __('<b>ACTION</b>: pmxi_before_post_import ...', 'wp_all_import_plugin'));
             do_action('pmxi_before_post_import', $this->id);
             if (empty($titles[$i])) {
                 if (!empty($addons_data['PMWI_Plugin']) and !empty($addons_data['PMWI_Plugin']['single_product_parent_ID'][$i])) {
                     $titles[$i] = $addons_data['PMWI_Plugin']['single_product_parent_ID'][$i] . ' Product Variation';
                 } else {
                     $logger and call_user_func($logger, __('<b>WARNING</b>: title is empty.', 'wp_all_import_plugin'));
                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                 }
             }
             if ($this->options['custom_type'] == 'import_users') {
                 $articleData = array('user_pass' => $addons_data['PMUI_Plugin']['pmui_pass'][$i], 'user_login' => $addons_data['PMUI_Plugin']['pmui_logins'][$i], 'user_nicename' => $addons_data['PMUI_Plugin']['pmui_nicename'][$i], 'user_url' => $addons_data['PMUI_Plugin']['pmui_url'][$i], 'user_email' => $addons_data['PMUI_Plugin']['pmui_email'][$i], 'display_name' => $addons_data['PMUI_Plugin']['pmui_display_name'][$i], 'user_registered' => $addons_data['PMUI_Plugin']['pmui_registered'][$i], 'first_name' => $addons_data['PMUI_Plugin']['pmui_first_name'][$i], 'last_name' => $addons_data['PMUI_Plugin']['pmui_last_name'][$i], 'description' => $addons_data['PMUI_Plugin']['pmui_description'][$i], 'nickname' => $addons_data['PMUI_Plugin']['pmui_nickname'][$i], 'role' => '' == $addons_data['PMUI_Plugin']['pmui_role'][$i] ? 'subscriber' : strtolower($addons_data['PMUI_Plugin']['pmui_role'][$i]));
                 $logger and call_user_func($logger, sprintf(__('Combine all data for user %s...', 'wp_all_import_plugin'), $articleData['user_login']));
             } else {
                 $articleData = array('post_type' => $post_type[$i], 'post_status' => "xpath" == $this->options['status'] ? $post_status[$i] : $this->options['status'], 'comment_status' => "xpath" == $this->options['comment_status'] ? $comment_status[$i] : $this->options['comment_status'], 'ping_status' => "xpath" == $this->options['ping_status'] ? $ping_status[$i] : $this->options['ping_status'], 'post_title' => !empty($this->options['is_leave_html']) ? html_entity_decode($titles[$i]) : $titles[$i], 'post_excerpt' => apply_filters('pmxi_the_excerpt', !empty($this->options['is_leave_html']) ? html_entity_decode($post_excerpt[$i]) : $post_excerpt[$i], $this->id), 'post_name' => $post_slug[$i], 'post_content' => apply_filters('pmxi_the_content', !empty($this->options['is_leave_html']) ? html_entity_decode($contents[$i]) : $contents[$i], $this->id), 'post_date' => $dates[$i], 'post_date_gmt' => get_gmt_from_date($dates[$i]), 'post_author' => $post_author[$i], 'menu_order' => (int) $menu_order[$i], 'post_parent' => "no" == $this->options['is_multiple_page_parent'] ? (int) $page_parent[$i] : (int) $this->options['parent']);
                 $logger and call_user_func($logger, sprintf(__('Combine all data for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
             }
             // Re-import Records Matching
             $post_to_update = false;
             $post_to_update_id = false;
             // An array representation of current XML node
             $current_xml_node = wp_all_import_xml2array($rootNodes[$i]);
             $check_for_duplicates = apply_filters('wp_all_import_is_check_duplicates', true, $this->id);
             if ($check_for_duplicates) {
                 // if Auto Matching re-import option selected
                 if ("manual" != $this->options['duplicate_matching']) {
                     // find corresponding article among previously imported
                     $logger and call_user_func($logger, sprintf(__('Find corresponding article among previously imported for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
                     $postRecord->clear();
                     $postRecord->getBy(array('unique_key' => $unique_keys[$i], 'import_id' => $this->id));
                     if (!$postRecord->isEmpty()) {
                         $logger and call_user_func($logger, sprintf(__('Duplicate post was found for post %s with unique key `%s`...', 'wp_all_import_plugin'), $articleData['post_title'], $unique_keys[$i]));
                         if ($this->options['custom_type'] == 'import_users') {
                             $post_to_update = get_user_by('id', $post_to_update_id = $postRecord->post_id);
                         } else {
                             $post_to_update = get_post($post_to_update_id = $postRecord->post_id);
                         }
                     } else {
                         $logger and call_user_func($logger, sprintf(__('Duplicate post wasn\'t found with unique key `%s`...', 'wp_all_import_plugin'), $unique_keys[$i]));
                     }
                     // if Manual Matching re-import option seleted
                 } else {
                     if ('custom field' == $this->options['duplicate_indicator']) {
                         $custom_duplicate_value = XmlImportParser::factory($xml, $cxpath, $this->options['custom_duplicate_value'], $file)->parse($records);
                         $tmp_files[] = $file;
                         $custom_duplicate_name = XmlImportParser::factory($xml, $cxpath, $this->options['custom_duplicate_name'], $file)->parse($records);
                         $tmp_files[] = $file;
                     } else {
                         count($titles) and $custom_duplicate_name = $custom_duplicate_value = array_fill(0, count($titles), '');
                     }
                     $logger and call_user_func($logger, sprintf(__('Find corresponding article among database for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
                     if ('pid' == $this->options['duplicate_indicator']) {
                         $duplicate_id = $post_ids[$i];
                     } else {
                         $duplicates = pmxi_findDuplicates($articleData, $custom_duplicate_name[$i], $custom_duplicate_value[$i], $this->options['duplicate_indicator']);
                         $duplicate_id = !empty($duplicates) ? array_shift($duplicates) : false;
                     }
                     if (!empty($duplicate_id)) {
                         $logger and call_user_func($logger, sprintf(__('Duplicate post was found for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
                         if ($this->options['custom_type'] == 'import_users') {
                             $post_to_update = get_user_by('id', $post_to_update_id = $duplicate_id);
                         } else {
                             $post_to_update = get_post($post_to_update_id = $duplicate_id);
                         }
                     } else {
                         $logger and call_user_func($logger, sprintf(__('Duplicate post wasn\'t found for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
                     }
                 }
             }
             if (!empty($specified_records)) {
                 if (!in_array($created + $updated + $skipped + 1, $specified_records)) {
                     if (!$postRecord->isEmpty()) {
                         $postRecord->set(array('iteration' => $this->iteration))->update();
                     }
                     $skipped++;
                     $logger and call_user_func($logger, __('<b>SKIPPED</b>: by specified records option', 'wp_all_import_plugin'));
                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                     $logger and !$is_cron and PMXI_Plugin::$session->chunk_number++;
                     $logger and !$is_cron and PMXI_Plugin::$session->save_data();
                     continue;
                 }
             }
             $missing_images = array();
             // Duplicate record is found
             if ($post_to_update) {
                 $continue_import = true;
                 $continue_import = apply_filters('wp_all_import_is_post_to_update', $post_to_update_id, $current_xml_node, $this->id);
                 if (!$continue_import) {
                     if (!$postRecord->isEmpty()) {
                         $postRecord->set(array('iteration' => $this->iteration))->update();
                     }
                     $skipped++;
                     $logger and call_user_func($logger, sprintf(__('<b>SKIPPED</b>: By filter wp_all_import_is_post_to_update `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                     $logger and !$is_cron and PMXI_Plugin::$session->chunk_number++;
                     $logger and !$is_cron and PMXI_Plugin::$session->save_data();
                     continue;
                 }
                 //$logger and call_user_func($logger, sprintf(__('Duplicate record is found for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                 // Do not update already existing records option selected
                 if ("yes" == $this->options['is_keep_former_posts']) {
                     if (!$postRecord->isEmpty()) {
                         $postRecord->set(array('iteration' => $this->iteration))->update();
                     }
                     do_action('pmxi_do_not_update_existing', $post_to_update_id, $this->id, $this->iteration);
                     $skipped++;
                     $logger and call_user_func($logger, sprintf(__('<b>SKIPPED</b>: Previously imported record found for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                     $logger and !$is_cron and PMXI_Plugin::$session->chunk_number++;
                     $logger and !$is_cron and PMXI_Plugin::$session->save_data();
                     continue;
                 }
                 $articleData['ID'] = $post_to_update_id;
                 // Choose which data to update
                 if ($this->options['update_all_data'] == 'no') {
                     if (!in_array($this->options['custom_type'], array('import_users'))) {
                         // preserve date of already existing article when duplicate is found
                         if (!$this->options['is_update_categories'] and (is_object_in_taxonomy($post_type[$i], 'category') or is_object_in_taxonomy($post_type[$i], 'post_tag')) or $this->options['is_update_categories'] and $this->options['update_categories_logic'] != "full_update") {
                             $logger and call_user_func($logger, sprintf(__('Preserve taxonomies of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                             $existing_taxonomies = array();
                             foreach (array_keys($taxonomies) as $tx_name) {
                                 $txes_list = get_the_terms($articleData['ID'], $tx_name);
                                 if (is_wp_error($txes_list)) {
                                     $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Unable to get current taxonomies for article #%d, updating with those read from XML file', 'wp_all_import_plugin'), $articleData['ID']));
                                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                 } else {
                                     $txes_new = array();
                                     if (!empty($txes_list)) {
                                         foreach ($txes_list as $t) {
                                             $txes_new[] = $t->term_taxonomy_id;
                                         }
                                     }
                                     $existing_taxonomies[$tx_name][$i] = $txes_new;
                                 }
                             }
                         }
                         if (!$this->options['is_update_dates']) {
                             // preserve date of already existing article when duplicate is found
                             $articleData['post_date'] = $post_to_update->post_date;
                             $articleData['post_date_gmt'] = $post_to_update->post_date_gmt;
                             $logger and call_user_func($logger, sprintf(__('Preserve date of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                         }
                         if (!$this->options['is_update_status']) {
                             // preserve status and trashed flag
                             $articleData['post_status'] = $post_to_update->post_status;
                             $logger and call_user_func($logger, sprintf(__('Preserve status of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                         }
                         if (!$this->options['is_update_content']) {
                             $articleData['post_content'] = $post_to_update->post_content;
                             $logger and call_user_func($logger, sprintf(__('Preserve content of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                         }
                         if (!$this->options['is_update_title']) {
                             $articleData['post_title'] = $post_to_update->post_title;
                             $logger and call_user_func($logger, sprintf(__('Preserve title of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                         }
                         if (!$this->options['is_update_slug']) {
                             $articleData['post_name'] = $post_to_update->post_name;
                             $logger and call_user_func($logger, sprintf(__('Preserve slug of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                         }
                         // Check for changed slugs for published post objects and save the old slug.
                         if (!empty($articleData['post_name']) and $articleData['post_name'] != $post_to_update->post_name) {
                             $old_slugs = (array) get_post_meta($post_to_update_id, '_wp_old_slug');
                             // If we haven't added this old slug before, add it now.
                             if (!empty($post_to_update->post_name) && !in_array($post_to_update->post_name, $old_slugs)) {
                                 add_post_meta($post_to_update_id, '_wp_old_slug', $post_to_update->post_name);
                             }
                             // If the new slug was used previously, delete it from the list.
                             if (in_array($articleData['post_name'], $old_slugs)) {
                                 delete_post_meta($post_to_update_id, '_wp_old_slug', $articleData['post_name']);
                             }
                         }
                         if (!$this->options['is_update_excerpt']) {
                             $articleData['post_excerpt'] = $post_to_update->post_excerpt;
                             $logger and call_user_func($logger, sprintf(__('Preserve excerpt of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                         }
                         if (!$this->options['is_update_menu_order']) {
                             $articleData['menu_order'] = $post_to_update->menu_order;
                             $logger and call_user_func($logger, sprintf(__('Preserve menu order of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                         }
                         if (!$this->options['is_update_parent']) {
                             $articleData['post_parent'] = $post_to_update->post_parent;
                             $logger and call_user_func($logger, sprintf(__('Preserve post parent of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                         }
                         if (!$this->options['is_update_comment_status']) {
                             $articleData['comment_status'] = $post_to_update->comment_status;
                             $logger and call_user_func($logger, sprintf(__('Preserve comment status of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                         }
                         if (!$this->options['is_update_author']) {
                             $articleData['post_author'] = $post_to_update->post_author;
                             $logger and call_user_func($logger, sprintf(__('Preserve post author of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                         }
                     } else {
                         if (!$this->options['is_update_first_name']) {
                             $articleData['first_name'] = $post_to_update->first_name;
                         }
                         if (!$this->options['is_update_last_name']) {
                             $articleData['last_name'] = $post_to_update->last_name;
                         }
                         if (!$this->options['is_update_role']) {
                             unset($articleData['role']);
                         }
                         if (!$this->options['is_update_nickname']) {
                             $articleData['nickname'] = get_user_meta($post_to_update->ID, 'nickname', true);
                         }
                         if (!$this->options['is_update_description']) {
                             $articleData['description'] = get_user_meta($post_to_update->ID, 'description', true);
                         }
                         if (!$this->options['is_update_login']) {
                             $articleData['user_login'] = $post_to_update->user_login;
                         }
                         if (!$this->options['is_update_password']) {
                             unset($articleData['user_pass']);
                         }
                         if (!$this->options['is_update_nicename']) {
                             $articleData['user_nicename'] = $post_to_update->user_nicename;
                         }
                         if (!$this->options['is_update_email']) {
                             $articleData['user_email'] = $post_to_update->user_email;
                         }
                         if (!$this->options['is_update_registered']) {
                             $articleData['user_registered'] = $post_to_update->user_registered;
                         }
                         if (!$this->options['is_update_display_name']) {
                             $articleData['display_name'] = $post_to_update->display_name;
                         }
                         if (!$this->options['is_update_url']) {
                             $articleData['user_url'] = $post_to_update->user_url;
                         }
                     }
                 }
                 if (!in_array($this->options['custom_type'], array('import_users'))) {
                     $is_images_to_delete = apply_filters('pmxi_delete_images', true, $articleData, $current_xml_node);
                     if ($is_images_to_delete) {
                         if ($this->options['update_all_data'] == 'yes' or $this->options['update_all_data'] == 'no' and $this->options['is_update_attachments']) {
                             $logger and call_user_func($logger, sprintf(__('Deleting attachments for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                             wp_delete_attachments($articleData['ID'], true, 'files');
                         }
                         // handle obsolete attachments (i.e. delete or keep) according to import settings
                         if ($this->options['update_all_data'] == 'yes' or $this->options['update_all_data'] == 'no' and $this->options['is_update_images'] and $this->options['update_images_logic'] == "full_update") {
                             $logger and call_user_func($logger, sprintf(__('Deleting images for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                             $do_not_remove_images = ($this->options['download_images'] == 'gallery' or $this->options['do_not_remove_images']) ? false : true;
                             $missing_images = wp_delete_attachments($articleData['ID'], $do_not_remove_images, 'images');
                         }
                     }
                 }
             } elseif (!$postRecord->isEmpty()) {
                 // existing post not found though it's track was found... clear the leftover, plugin will continue to treat record as new
                 $postRecord->clear();
             }
             $logger and call_user_func($logger, sprintf(__('Applying filter `pmxi_article_data` for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
             $articleData = apply_filters('pmxi_article_data', $articleData, $this, $post_to_update);
             // no new records are created. it will only update posts it finds matching duplicates for
             if (!$this->options['create_new_records'] and empty($articleData['ID'])) {
                 if (!$postRecord->isEmpty()) {
                     $postRecord->set(array('iteration' => $this->iteration))->update();
                 }
                 $logger and call_user_func($logger, __('<b>SKIPPED</b>: by do not create new posts option.', 'wp_all_import_plugin'));
                 $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                 $logger and !$is_cron and PMXI_Plugin::$session->chunk_number++;
                 $skipped++;
                 $logger and !$is_cron and PMXI_Plugin::$session->save_data();
                 continue;
             }
             // cloak urls with `WP Wizard Cloak` if corresponding option is set
             if (!empty($this->options['is_cloak']) and class_exists('PMLC_Plugin')) {
                 if (preg_match_all('%<a\\s[^>]*href=(?(?=")"([^"]*)"|(?(?=\')\'([^\']*)\'|([^\\s>]*)))%is', $articleData['post_content'], $matches, PREG_PATTERN_ORDER)) {
                     $hrefs = array_unique(array_merge(array_filter($matches[1]), array_filter($matches[2]), array_filter($matches[3])));
                     foreach ($hrefs as $url) {
                         if (preg_match('%^\\w+://%i', $url)) {
                             // mask only links having protocol
                             // try to find matching cloaked link among already registered ones
                             $list = new PMLC_Link_List();
                             $linkTable = $list->getTable();
                             $rule = new PMLC_Rule_Record();
                             $ruleTable = $rule->getTable();
                             $dest = new PMLC_Destination_Record();
                             $destTable = $dest->getTable();
                             $list->join($ruleTable, "{$ruleTable}.link_id = {$linkTable}.id")->join($destTable, "{$destTable}.rule_id = {$ruleTable}.id")->setColumns("{$linkTable}.*")->getBy(array("{$linkTable}.destination_type =" => 'ONE_SET', "{$linkTable}.is_trashed =" => 0, "{$linkTable}.preset =" => '', "{$linkTable}.expire_on =" => '0000-00-00', "{$ruleTable}.type =" => 'ONE_SET', "{$destTable}.weight =" => 100, "{$destTable}.url LIKE" => $url), NULL, 1, 1)->convertRecords();
                             if ($list->count()) {
                                 // matching link found
                                 $link = $list[0];
                             } else {
                                 // register new cloaked link
                                 global $wpdb;
                                 $slug = max(intval($wpdb->get_var("SELECT MAX(CONVERT(name, SIGNED)) FROM {$linkTable}")), intval($wpdb->get_var("SELECT MAX(CONVERT(slug, SIGNED)) FROM {$linkTable}")), 0);
                                 $i = 0;
                                 do {
                                     is_int(++$slug) and $slug > 0 or $slug = 1;
                                     $is_slug_found = !intval($wpdb->get_var("SELECT COUNT(*) FROM {$linkTable} WHERE name = '{$slug}' OR slug = '{$slug}'"));
                                 } while (!$is_slug_found and $i++ < 100000);
                                 if ($is_slug_found) {
                                     $link = new PMLC_Link_Record(array('name' => strval($slug), 'slug' => strval($slug), 'header_tracking_code' => '', 'footer_tracking_code' => '', 'redirect_type' => '301', 'destination_type' => 'ONE_SET', 'preset' => '', 'forward_url_params' => 1, 'no_global_tracking_code' => 0, 'expire_on' => '0000-00-00', 'created_on' => date('Y-m-d H:i:s'), 'is_trashed' => 0));
                                     $link->insert();
                                     $rule = new PMLC_Rule_Record(array('link_id' => $link->id, 'type' => 'ONE_SET', 'rule' => ''));
                                     $rule->insert();
                                     $dest = new PMLC_Destination_Record(array('rule_id' => $rule->id, 'url' => $url, 'weight' => 100));
                                     $dest->insert();
                                 } else {
                                     $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Unable to create cloaked link for %s', 'wp_all_import_plugin'), $url));
                                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                     $link = NULL;
                                 }
                             }
                             if ($link) {
                                 // cloaked link is found or created for url
                                 $articleData['post_content'] = preg_replace('%' . preg_quote($url, '%') . '(?=([\\s\'"]|$))%i', $link->getUrl(), $articleData['post_content']);
                             }
                         }
                     }
                 }
             }
             // insert article being imported
             if ($this->options['is_fast_mode']) {
                 foreach (array('transition_post_status', 'save_post', 'pre_post_update', 'add_attachment', 'edit_attachment', 'edit_post', 'post_updated', 'wp_insert_post', 'save_post_' . $post_type[$i]) as $act) {
                     remove_all_actions($act);
                 }
             }
             if (empty($articleData['ID'])) {
                 $continue_import = true;
                 $continue_import = apply_filters('wp_all_import_is_post_to_create', $current_xml_node, $this->id);
                 if (!$continue_import) {
                     $skipped++;
                     $logger and call_user_func($logger, sprintf(__('<b>SKIPPED</b>: By filter wp_all_import_is_post_to_create `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                     $logger and !$is_cron and PMXI_Plugin::$session->chunk_number++;
                     $logger and !$is_cron and PMXI_Plugin::$session->save_data();
                     continue;
                 }
             }
             if (!in_array($this->options['custom_type'], array('import_users'))) {
                 if (empty($articleData['ID'])) {
                     $logger and call_user_func($logger, sprintf(__('<b>CREATING</b> `%s` `%s`', 'wp_all_import_plugin'), $articleData['post_title'], $custom_type_details->labels->singular_name));
                 } else {
                     $logger and call_user_func($logger, sprintf(__('<b>UPDATING</b> `%s` `%s`', 'wp_all_import_plugin'), $articleData['post_title'], $custom_type_details->labels->singular_name));
                 }
                 $pid = empty($articleData['ID']) ? wp_insert_post($articleData, true) : wp_update_post($articleData, true);
             } else {
                 $pid = empty($articleData['ID']) ? wp_insert_user($articleData) : wp_update_user($articleData);
                 $articleData['post_title'] = $articleData['user_login'];
             }
             if (empty($pid)) {
                 $logger and call_user_func($logger, __('<b>ERROR</b>', 'wp_all_import_plugin') . ': something wrong, ID = 0 was generated.');
                 $logger and !$is_cron and PMXI_Plugin::$session->errors++;
                 $skipped++;
             } elseif (is_wp_error($pid)) {
                 $logger and call_user_func($logger, __('<b>ERROR</b>', 'wp_all_import_plugin') . ': ' . $pid->get_error_message());
                 $logger and !$is_cron and PMXI_Plugin::$session->errors++;
                 $skipped++;
             } else {
                 if ("manual" != $this->options['duplicate_matching'] or empty($articleData['ID'])) {
                     // associate post with import
                     $postRecord->isEmpty() and $postRecord->set(array('post_id' => $pid, 'import_id' => $this->id, 'unique_key' => $unique_keys[$i], 'product_key' => ($post_type[$i] == "product" and PMXI_Admin_Addons::get_addon('PMWI_Plugin')) ? $addons_data['PMWI_Plugin']['single_product_ID'][$i] : ''))->insert();
                     $postRecord->set(array('iteration' => $this->iteration, 'specified' => empty($specified_records) ? 0 : 1))->update();
                     $logger and call_user_func($logger, sprintf(__('Associate post `%s` with current import ...', 'wp_all_import_plugin'), $articleData['post_title']));
                 }
                 // [post format]
                 if (current_theme_supports('post-formats') && post_type_supports($post_type[$i], 'post-formats')) {
                     set_post_format($pid, "xpath" == $this->options['post_format'] ? $post_format[$i] : $this->options['post_format']);
                     $logger and call_user_func($logger, sprintf(__('Associate post `%s` with post format %s ...', 'wp_all_import_plugin'), $articleData['post_title'], "xpath" == $this->options['post_format'] ? $post_format[$i] : $this->options['post_format']));
                 }
                 // [/post format]
                 // [addons import]
                 // prepare data for import
                 $importData = array('pid' => $pid, 'i' => $i, 'import' => $this, 'articleData' => $articleData, 'xml' => $xml, 'is_cron' => $is_cron, 'logger' => $logger, 'xpath_prefix' => $xpath_prefix, 'post_type' => $post_type[$i]);
                 $import_functions = apply_filters('wp_all_import_addon_import', array());
                 // deligate operation to addons
                 foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
                     if (class_exists($class)) {
                         if (method_exists($addons[$class], 'import')) {
                             $addons[$class]->import($importData);
                         }
                     } else {
                         if (!empty($import_functions[$class])) {
                             if (is_array($import_functions[$class]) and is_callable($import_functions[$class]) or !is_array($import_functions[$class]) and function_exists($import_functions[$class])) {
                                 call_user_func($import_functions[$class], $importData, $addons_data[$class]);
                             }
                         }
                     }
                 }
                 // [/addons import]
                 // Page Template
                 if (!empty($articleData['post_type']) and 'page' == $articleData['post_type'] and wp_all_import_is_update_cf('_wp_page_template', $this->options) and (!empty($this->options['page_template']) or "no" == $this->options['is_multiple_page_template'])) {
                     update_post_meta($pid, '_wp_page_template', "no" == $this->options['is_multiple_page_template'] ? $page_template[$i] : $this->options['page_template']);
                 }
                 // [featured image]
                 $is_images_to_update = apply_filters('pmxi_is_images_to_update', true, $articleData, $current_xml_node);
                 $is_allow_import_images = apply_filters('wp_all_import_is_allow_import_images', false, empty($articleData['post_type']) ? '' : $articleData['post_type']);
                 if ($is_images_to_update and !empty($uploads) and false === $uploads['error'] and (!empty($articleData['post_type']) and $articleData['post_type'] == "product" and class_exists('PMWI_Plugin') or $is_allow_import_images) and (empty($articleData['ID']) or $this->options['update_all_data'] == "yes" or $this->options['update_all_data'] == "no" and $this->options['is_update_images'])) {
                     if (!empty($images_bundle)) {
                         require_once ABSPATH . 'wp-admin/includes/image.php';
                         $is_show_add_new_images = apply_filters('wp_all_import_is_show_add_new_images', true, $post_type[$i]);
                         foreach ($images_bundle as $slug => $bundle_data) {
                             $featured_images = $bundle_data['files'];
                             $option_slug = $slug == 'pmxi_gallery_image' ? '' : $slug;
                             $gallery_attachment_ids = array();
                             if (!empty($featured_images[$i])) {
                                 $targetDir = $uploads['path'];
                                 $targetUrl = $uploads['url'];
                                 $logger and call_user_func($logger, __('<b>IMAGES:</b>', 'wp_all_import_plugin'));
                                 if (!@is_writable($targetDir)) {
                                     $logger and call_user_func($logger, sprintf(__('<b>ERROR</b>: Target directory %s is not writable', 'wp_all_import_plugin'), $targetDir));
                                 } else {
                                     $success_images = false;
                                     $imgs = array();
                                     switch ($this->options[$option_slug . 'download_images']) {
                                         case 'no':
                                             $featured_delim = $this->options[$option_slug . 'featured_delim'];
                                             break;
                                         case 'gallery':
                                             $featured_delim = $this->options[$option_slug . 'gallery_featured_delim'];
                                             break;
                                         default:
                                             // yes
                                             $featured_delim = $this->options[$option_slug . 'download_featured_delim'];
                                             break;
                                     }
                                     $line_imgs = explode("\n", $featured_images[$i]);
                                     if (!empty($line_imgs)) {
                                         foreach ($line_imgs as $line_img) {
                                             $imgs = array_merge($imgs, !empty($featured_delim) ? str_getcsv($line_img, $featured_delim) : array($line_img));
                                         }
                                     }
                                     // keep existing and add newest images
                                     if (!empty($articleData['ID']) and $this->options['is_update_images'] and $this->options['update_images_logic'] == "add_new" and $this->options['update_all_data'] == "no" and $is_show_add_new_images) {
                                         $logger and call_user_func($logger, __('- Keep existing and add newest images ...', 'wp_all_import_plugin'));
                                         $attachment_imgs = get_attached_media('image', $pid);
                                         if ($post_type[$i] == "product") {
                                             $gallery_attachment_ids = array_filter(explode(",", get_post_meta($pid, '_product_image_gallery', true)));
                                         }
                                         if ($attachment_imgs) {
                                             foreach ($attachment_imgs as $attachment_img) {
                                                 $post_thumbnail_id = get_post_thumbnail_id($pid);
                                                 if (empty($post_thumbnail_id) and $this->options[$option_slug . 'is_featured']) {
                                                     set_post_thumbnail($pid, $attachment_img->ID);
                                                 } elseif (!in_array($attachment_img->ID, $gallery_attachment_ids) and $post_thumbnail_id != $attachment_img->ID) {
                                                     $gallery_attachment_ids[] = $attachment_img->ID;
                                                 }
                                             }
                                             $success_images = true;
                                         }
                                         if (!empty($gallery_attachment_ids)) {
                                             foreach ($gallery_attachment_ids as $aid) {
                                                 do_action($slug, $pid, $aid, wp_get_attachment_url($aid), 'update_images');
                                             }
                                         }
                                     }
                                     if (!empty($imgs)) {
                                         if ($this->options[$option_slug . 'set_image_meta_title'] and !empty($image_meta_titles_bundle[$slug])) {
                                             $img_titles = array();
                                             $line_img_titles = explode("\n", $image_meta_titles_bundle[$slug][$i]);
                                             if (!empty($line_img_titles)) {
                                                 foreach ($line_img_titles as $line_img_title) {
                                                     $img_titles = array_merge($img_titles, !empty($this->options[$option_slug . 'image_meta_title_delim']) ? str_getcsv($line_img_title, $this->options[$option_slug . 'image_meta_title_delim']) : array($line_img_title));
                                                 }
                                             }
                                         }
                                         if ($this->options[$option_slug . 'set_image_meta_caption'] and !empty($image_meta_captions_bundle[$slug])) {
                                             $img_captions = array();
                                             $line_img_captions = explode("\n", $image_meta_captions_bundle[$slug][$i]);
                                             if (!empty($line_img_captions)) {
                                                 foreach ($line_img_captions as $line_img_caption) {
                                                     $img_captions = array_merge($img_captions, !empty($this->options[$option_slug . 'image_meta_caption_delim']) ? str_getcsv($line_img_caption, $this->options[$option_slug . 'image_meta_caption_delim']) : array($line_img_caption));
                                                 }
                                             }
                                         }
                                         if ($this->options[$option_slug . 'set_image_meta_alt'] and !empty($image_meta_alts_bundle[$slug])) {
                                             $img_alts = array();
                                             $line_img_alts = explode("\n", $image_meta_alts_bundle[$slug][$i]);
                                             if (!empty($line_img_alts)) {
                                                 foreach ($line_img_alts as $line_img_alt) {
                                                     $img_alts = array_merge($img_alts, !empty($this->options[$option_slug . 'image_meta_alt_delim']) ? str_getcsv($line_img_alt, $this->options[$option_slug . 'image_meta_alt_delim']) : array($line_img_alt));
                                                 }
                                             }
                                         }
                                         if ($this->options[$option_slug . 'set_image_meta_description'] and !empty($image_meta_descriptions_bundle[$slug])) {
                                             $img_descriptions = array();
                                             $line_img_descriptions = ($this->options[$option_slug . 'image_meta_description_delim_logic'] == 'line' or empty($this->options[$option_slug . 'image_meta_description_delim'])) ? explode("\n", $image_meta_descriptions_bundle[$slug][$i]) : array($image_meta_descriptions_bundle[$slug][$i]);
                                             if (!empty($line_img_descriptions)) {
                                                 foreach ($line_img_descriptions as $line_img_description) {
                                                     $img_descriptions = array_merge($img_descriptions, ($this->options[$option_slug . 'image_meta_description_delim_logic'] == 'separate' and !empty($this->options[$option_slug . 'image_meta_description_delim'])) ? str_getcsv($line_img_description, $this->options[$option_slug . 'image_meta_description_delim']) : array($line_img_description));
                                                 }
                                             }
                                         }
                                         $is_keep_existing_images = (!empty($articleData['ID']) and $this->options['is_update_images'] and $this->options['update_images_logic'] == "add_new" and $this->options['update_all_data'] == "no" and $is_show_add_new_images);
                                         foreach ($imgs as $k => $img_url) {
                                             $attid = false;
                                             $attch = null;
                                             $url = trim($img_url);
                                             if (empty($url)) {
                                                 continue;
                                             }
                                             $bn = wp_all_import_sanitize_filename(urldecode(basename($url)));
                                             if ("yes" == $this->options[$option_slug . 'download_images'] and !empty($auto_extensions_bundle[$slug][$i]) and preg_match('%^(jpg|jpeg|png|gif)$%i', $auto_extensions_bundle[$slug][$i])) {
                                                 $img_ext = $auto_extensions_bundle[$slug][$i];
                                             } else {
                                                 $img_ext = pmxi_getExtensionFromStr($url);
                                                 $default_extension = pmxi_getExtension($bn);
                                                 if ($img_ext == "") {
                                                     $img_ext = pmxi_get_remote_image_ext($url);
                                                 }
                                             }
                                             $logger and call_user_func($logger, sprintf(__('- Importing image `%s` for `%s` ...', 'wp_all_import_plugin'), $img_url, $articleData['post_title']));
                                             // generate local file name
                                             $image_name = urldecode(($this->options[$option_slug . 'auto_rename_images'] and !empty($auto_rename_images_bundle[$slug][$i])) ? sanitize_file_name($img_ext ? str_replace("." . $default_extension, "", $auto_rename_images_bundle[$slug][$i]) : $auto_rename_images_bundle[$slug][$i]) : sanitize_file_name($img_ext ? str_replace("." . $default_extension, "", $bn) : $bn)) . ("" != $img_ext ? '.' . $img_ext : '');
                                             $image_name = apply_filters("wp_all_import_image_filename", $image_name, empty($img_titles[$k]) ? '' : $img_titles[$k], empty($img_captions[$k]) ? '' : $img_captions[$k], empty($img_alts[$k]) ? '' : $img_alts[$k], $articleData);
                                             // if wizard store image data to custom field
                                             $create_image = false;
                                             $download_image = true;
                                             $wp_filetype = false;
                                             if ($bundle_data['type'] == 'images' and base64_decode($url, true) !== false) {
                                                 $img = @imagecreatefromstring(base64_decode($url));
                                                 if ($img) {
                                                     $logger and call_user_func($logger, __('- found base64_encoded image', 'wp_all_import_plugin'));
                                                     $image_filename = md5(time()) . '.jpg';
                                                     $image_filepath = $targetDir . '/' . $image_filename;
                                                     imagejpeg($img, $image_filepath);
                                                     if (!($image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath)) or !in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                                                         $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $image_filepath));
                                                         $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                                     } else {
                                                         $create_image = true;
                                                     }
                                                 }
                                             }
                                             if (!$create_image) {
                                                 if ($this->options[$option_slug . 'auto_rename_images'] and !empty($auto_rename_images_bundle[$slug][$i])) {
                                                     if ($k) {
                                                         $image_name = str_replace('.' . pmxi_getExtension($image_name), '', $image_name) . '-' . $k . '.' . pmxi_getExtension($image_name);
                                                     }
                                                 }
                                                 $image_filename = wp_unique_filename($targetDir, $image_name);
                                                 $image_filepath = $targetDir . '/' . $image_filename;
                                                 // keep existing and add newest images
                                                 if ($is_keep_existing_images) {
                                                     $attch = $this->wpdb->get_row($this->wpdb->prepare("SELECT * FROM " . $this->wpdb->posts . " WHERE (post_title = %s OR post_title = %s OR post_name = %s) AND post_type = %s AND post_parent = %d;", $image_name, preg_replace('/\\.[^.\\s]{3,4}$/', '', $image_name), sanitize_title($image_name), "attachment", $pid));
                                                     if ($attch != null) {
                                                         $post_thumbnail_id = get_post_thumbnail_id($pid);
                                                         if ($post_thumbnail_id == $attch->ID or in_array($attch->ID, $gallery_attachment_ids)) {
                                                             continue;
                                                         }
                                                     } elseif (file_exists($targetDir . '/' . $image_name)) {
                                                         if ($bundle_data['type'] == 'images' and $img_meta = wp_read_image_metadata($targetDir . '/' . $image_name)) {
                                                             if (trim($img_meta['title']) && !is_numeric(sanitize_title($img_meta['title']))) {
                                                                 $img_title = $img_meta['title'];
                                                                 $attch = $this->wpdb->get_row($this->wpdb->prepare("SELECT * FROM " . $this->wpdb->posts . " WHERE post_title = %s AND post_type = %s AND post_parent = %d;", $img_title, "attachment", $pid));
                                                                 if ($attch != null) {
                                                                     $post_thumbnail_id = get_post_thumbnail_id($pid);
                                                                     if ($post_thumbnail_id == $attch->ID or in_array($attch->ID, $gallery_attachment_ids)) {
                                                                         continue;
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                                 // search existing attachment
                                                 if ($this->options[$option_slug . 'search_existing_images'] or "gallery" == $this->options[$option_slug . 'download_images']) {
                                                     $image_filename = $image_name;
                                                     $attch = wp_all_import_get_image_from_gallery($image_name, $targetDir, $bundle_data['type']);
                                                     if ("gallery" == $this->options[$option_slug . 'download_images']) {
                                                         $download_image = false;
                                                     }
                                                     if (empty($attch)) {
                                                         $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: Image %s not found in media gallery.', 'wp_all_import_plugin'), trim($image_name)));
                                                     } else {
                                                         $logger and call_user_func($logger, sprintf(__('- Using existing image `%s` for post `%s` ...', 'wp_all_import_plugin'), trim($image_name), $articleData['post_title']));
                                                         $download_image = false;
                                                         $create_image = false;
                                                         $attid = $attch->ID;
                                                     }
                                                 }
                                                 if ($download_image && "gallery" != $this->options[$option_slug . 'download_images']) {
                                                     // do not download images
                                                     if ("no" == $this->options[$option_slug . 'download_images']) {
                                                         $image_filename = $image_name;
                                                         $image_filepath = $targetDir . '/' . $image_filename;
                                                         $wpai_uploads = $uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::FILES_DIRECTORY . DIRECTORY_SEPARATOR;
                                                         $wpai_image_path = $wpai_uploads . str_replace('%20', ' ', $url);
                                                         $logger and call_user_func($logger, sprintf(__('- Searching for existing image `%s` in `%s` folder', 'wp_all_import_plugin'), $wpai_image_path, $wpai_uploads));
                                                         if (@file_exists($wpai_image_path) and @copy($wpai_image_path, $image_filepath)) {
                                                             $download_image = false;
                                                             // valdate import attachments
                                                             if ($bundle_data['type'] == 'files') {
                                                                 if (!($wp_filetype = wp_check_filetype(basename($image_filepath), null))) {
                                                                     $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: Can\'t detect attachment file type %s', 'wp_all_import_plugin'), trim($image_filepath)));
                                                                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                                                     @unlink($image_filepath);
                                                                 } else {
                                                                     $create_image = true;
                                                                     $logger and call_user_func($logger, sprintf(__('- File `%s` has been successfully found', 'wp_all_import_plugin'), $wpai_image_path));
                                                                 }
                                                             } elseif ($bundle_data['type'] == 'images') {
                                                                 if (preg_match('%\\W(svg)$%i', basename($image_filepath)) or $image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                                                                     $create_image = true;
                                                                     $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully found', 'wp_all_import_plugin'), $wpai_image_path));
                                                                 } else {
                                                                     $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $image_filepath));
                                                                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                                                     @unlink($image_filepath);
                                                                 }
                                                             }
                                                         }
                                                     } else {
                                                         $logger and call_user_func($logger, sprintf(__('- Downloading image from `%s`', 'wp_all_import_plugin'), $url));
                                                         $request = get_file_curl($url, $image_filepath);
                                                         $get_ctx = stream_context_create(array('http' => array('timeout' => 5)));
                                                         if ((is_wp_error($request) or $request === false) and !@file_put_contents($image_filepath, @file_get_contents($url, false, $get_ctx))) {
                                                             @unlink($image_filepath);
                                                             // delete file since failed upload may result in empty file created
                                                         } else {
                                                             if ($bundle_data['type'] == 'images') {
                                                                 if (preg_match('%\\W(svg)$%i', basename($image_filepath)) or $image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                                                                     $create_image = true;
                                                                     $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
                                                                 } else {
                                                                     $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $url));
                                                                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                                                 }
                                                             } elseif ($bundle_data['type'] == 'files') {
                                                                 if ($wp_filetype = wp_check_filetype(basename($image_filepath), null)) {
                                                                     $create_image = true;
                                                                     $logger and call_user_func($logger, sprintf(__('- File `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
                                                                 }
                                                             }
                                                         }
                                                         if (!$create_image and $img_url !== pmxi_convert_encoding($img_url)) {
                                                             $url = trim(pmxi_convert_encoding($img_url));
                                                             $request = get_file_curl($url, $image_filepath);
                                                             $get_ctx = stream_context_create(array('http' => array('timeout' => 5)));
                                                             if ((is_wp_error($request) or $request === false) and !@file_put_contents($image_filepath, @file_get_contents($url, false, $get_ctx))) {
                                                                 $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s cannot be saved locally as %s', 'wp_all_import_plugin'), $url, $image_filepath));
                                                                 $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                                                 @unlink($image_filepath);
                                                                 // delete file since failed upload may result in empty file created
                                                             } else {
                                                                 if ($bundle_data['type'] == 'images') {
                                                                     if (preg_match('%\\W(svg)$%i', basename($image_filepath)) or $image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                                                                         $create_image = true;
                                                                         $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
                                                                     } else {
                                                                         $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $url));
                                                                         $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                                                         @unlink($image_filepath);
                                                                     }
                                                                 } elseif ($bundle_data['type'] == 'files') {
                                                                     if (!($wp_filetype = wp_check_filetype(basename($image_filepath), null))) {
                                                                         $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: Can\'t detect attachment file type %s', 'wp_all_import_plugin'), trim($url)));
                                                                         $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                                                         @unlink($image_filepath);
                                                                     } else {
                                                                         $create_image = true;
                                                                         $logger and call_user_func($logger, sprintf(__('- File `%s` has been successfully found', 'wp_all_import_plugin'), $url));
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                             $handle_image = false;
                                             if ($create_image) {
                                                 $file_mime_type = '';
                                                 if ($bundle_data['type'] == 'images') {
                                                     if (!empty($image_info)) {
                                                         $file_mime_type = image_type_to_mime_type($image_info[2]);
                                                     }
                                                     $file_mime_type = apply_filters('wp_all_import_image_mime_type', $file_mime_type, $image_filepath);
                                                 } else {
                                                     $file_mime_type = $wp_filetype['type'];
                                                 }
                                                 $handle_image = array('file' => $image_filepath, 'url' => $targetUrl . '/' . $image_filename, 'type' => $file_mime_type);
                                                 //apply_filters( 'wp_handle_upload', , 'upload' );
                                                 $logger and call_user_func($logger, sprintf(__('- Creating an attachment for image `%s`', 'wp_all_import_plugin'), $handle_image['url']));
                                                 $attachment_title = explode(".", $image_name);
                                                 if (is_array($attachment_title) and count($attachment_title) > 1) {
                                                     array_pop($attachment_title);
                                                 }
                                                 $attachment = array('post_mime_type' => $handle_image['type'], 'guid' => $handle_image['url'], 'post_title' => implode(".", $attachment_title), 'post_content' => '', 'post_author' => $post_author[$i]);
                                                 if ($bundle_data['type'] == 'images' and $image_meta = wp_read_image_metadata($handle_image['file'])) {
                                                     if (trim($image_meta['title']) && !is_numeric(sanitize_title($image_meta['title']))) {
                                                         $attachment['post_title'] = $image_meta['title'];
                                                     }
                                                     if (trim($image_meta['caption'])) {
                                                         $attachment['post_content'] = $image_meta['caption'];
                                                     }
                                                 }
                                                 $attid = wp_insert_attachment($attachment, $handle_image['file'], $pid);
                                                 if (is_wp_error($attid)) {
                                                     $logger and call_user_func($logger, __('- <b>WARNING</b>', 'wp_all_import_plugin') . ': ' . $attid->get_error_message());
                                                     $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                                 } else {
                                                     wp_update_attachment_metadata($attid, wp_generate_attachment_metadata($attid, $handle_image['file']));
                                                 }
                                             }
                                             if ($attid and !is_wp_error($attid)) {
                                                 if ($attch != null and empty($attch->post_parent)) {
                                                     wp_update_post(array('ID' => $attch->ID, 'post_parent' => $pid));
                                                 }
                                                 $update_attachment_meta = array();
                                                 if ($this->options[$option_slug . 'set_image_meta_title'] and !empty($img_titles[$k])) {
                                                     $update_attachment_meta['post_title'] = trim($img_titles[$k]);
                                                 }
                                                 if ($this->options[$option_slug . 'set_image_meta_caption'] and !empty($img_captions[$k])) {
                                                     $update_attachment_meta['post_excerpt'] = trim($img_captions[$k]);
                                                 }
                                                 if ($this->options[$option_slug . 'set_image_meta_description'] and !empty($img_descriptions[$k])) {
                                                     $update_attachment_meta['post_content'] = trim($img_descriptions[$k]);
                                                 }
                                                 if ($this->options[$option_slug . 'set_image_meta_alt'] and !empty($img_alts[$k])) {
                                                     update_post_meta($attid, '_wp_attachment_image_alt', trim($img_alts[$k]));
                                                 }
                                                 if (!empty($update_attachment_meta)) {
                                                     $this->wpdb->update($this->wpdb->posts, $update_attachment_meta, array('ID' => $attid));
                                                 }
                                                 $logger and call_user_func($logger, __('- <b>ACTION</b>: ' . $slug, 'wp_all_import_plugin'));
                                                 do_action($slug, $pid, $attid, $handle_image ? $handle_image['file'] : $image_filepath, $is_keep_existing_images ? 'add_images' : 'update_images');
                                                 $success_images = true;
                                                 $post_thumbnail_id = get_post_thumbnail_id($pid);
                                                 if ($bundle_data['type'] == 'images' and empty($post_thumbnail_id) and $this->options[$option_slug . 'is_featured']) {
                                                     set_post_thumbnail($pid, $attid);
                                                 } elseif (!in_array($attid, $gallery_attachment_ids) and $post_thumbnail_id != $attid) {
                                                     $gallery_attachment_ids[] = $attid;
                                                 }
                                                 if ($attch != null and empty($attch->post_parent)) {
                                                     $logger and call_user_func($logger, sprintf(__('- Attachment has been successfully updated for image `%s`', 'wp_all_import_plugin'), $handle_image ? $handle_image['url'] : $targetUrl . '/' . $image_filename));
                                                 } elseif (empty($attch)) {
                                                     $logger and call_user_func($logger, sprintf(__('- Attachment has been successfully created for image `%s`', 'wp_all_import_plugin'), $handle_image ? $handle_image['url'] : $targetUrl . '/' . $image_filename));
                                                 }
                                             }
                                         }
                                     }
                                     // Set product gallery images
                                     if ($post_type[$i] == "product") {
                                         update_post_meta($pid, '_product_image_gallery', !empty($gallery_attachment_ids) ? implode(',', $gallery_attachment_ids) : '');
                                     }
                                     // Create entry as Draft if no images are downloaded successfully
                                     $final_post_type = get_post_type($pid);
                                     if (!$success_images and "yes" == $this->options[$option_slug . 'create_draft'] and $final_post_type != 'product_variation') {
                                         $this->wpdb->update($this->wpdb->posts, array('post_status' => 'draft'), array('ID' => $pid));
                                         $logger and call_user_func($logger, sprintf(__('- Post `%s` saved as Draft, because no images are downloaded successfully', 'wp_all_import_plugin'), $articleData['post_title']));
                                     }
                                 }
                             } else {
                                 // Create entry as Draft if no images are downloaded successfully
                                 $final_post_type = get_post_type($pid);
                                 if ("yes" == $this->options[$option_slug . 'create_draft'] and $final_post_type != 'product_variation') {
                                     $this->wpdb->update($this->wpdb->posts, array('post_status' => 'draft'), array('ID' => $pid));
                                     $logger and call_user_func($logger, sprintf(__('Post `%s` saved as Draft, because no images are downloaded successfully', 'wp_all_import_plugin'), $articleData['post_title']));
                                 }
                             }
                             if ($this->options["do_not_remove_images"]) {
                                 do_action("wpallimport_after_images_import", $pid, $gallery_attachment_ids, $missing_images);
                             }
                         }
                     }
                 } else {
                     if (!empty($images_bundle)) {
                         foreach ($images_bundle as $slug => $bundle_data) {
                             if (!empty($bundle_data['images'][$i])) {
                                 $imgs = array();
                                 $featured_delim = "yes" == $this->options[$option_slug . 'download_images'] ? $this->options[$option_slug . 'download_featured_delim'] : $this->options[$option_slug . 'featured_delim'];
                                 $line_imgs = explode("\n", $bundle_data['images'][$i]);
                                 if (!empty($line_imgs)) {
                                     foreach ($line_imgs as $line_img) {
                                         $imgs = array_merge($imgs, !empty($featured_delim) ? str_getcsv($line_img, $featured_delim) : array($line_img));
                                     }
                                 }
                                 foreach ($imgs as $img) {
                                     do_action($slug, $pid, false, $img, false);
                                 }
                             }
                         }
                     }
                 }
                 if (!$is_images_to_update) {
                     $logger and call_user_func($logger, sprintf(__('Images import skipped for post `%s` according to \'pmxi_is_images_to_update\' filter...', 'wp_all_import_plugin'), $articleData['post_title']));
                 }
                 // [/featured image]
                 // [attachments]
                 $is_attachments_to_update = apply_filters('pmxi_is_attachments_to_update', true, $articleData, $current_xml_node);
                 if ($is_attachments_to_update and !empty($uploads) and false === $uploads['error'] and !empty($attachments[$i]) and (empty($articleData['ID']) or $this->options['update_all_data'] == "yes" or $this->options['update_all_data'] == "no" and $this->options['is_update_attachments'])) {
                     $targetDir = $uploads['path'];
                     $targetUrl = $uploads['url'];
                     $logger and call_user_func($logger, __('<b>ATTACHMENTS:</b>', 'wp_all_import_plugin'));
                     if (!@is_writable($targetDir)) {
                         $logger and call_user_func($logger, sprintf(__('- <b>ERROR</b>: Target directory %s is not writable', 'wp_all_import_plugin'), trim($targetDir)));
                     } else {
                         // you must first include the image.php file
                         // for the function wp_generate_attachment_metadata() to work
                         require_once ABSPATH . 'wp-admin/includes/image.php';
                         if (!is_array($attachments[$i])) {
                             $attachments[$i] = array($attachments[$i]);
                         }
                         $logger and call_user_func($logger, sprintf(__('- Importing attachments for `%s` ...', 'wp_all_import_plugin'), $articleData['post_title']));
                         foreach ($attachments[$i] as $attachment) {
                             if ("" == $attachment) {
                                 continue;
                             }
                             $atchs = str_getcsv($attachment, $this->options['atch_delim']);
                             if (!empty($atchs)) {
                                 foreach ($atchs as $atch_url) {
                                     if (empty($atch_url)) {
                                         continue;
                                     }
                                     $download_file = true;
                                     $atch_url = str_replace(" ", "%20", trim($atch_url));
                                     $attachment_filename = urldecode(basename(parse_url(trim($atch_url), PHP_URL_PATH)));
                                     $attachment_filepath = $targetDir . '/' . sanitize_file_name($attachment_filename);
                                     if ($this->options['is_search_existing_attach']) {
                                         // search existing attachment
                                         $attch = $this->wpdb->get_row($this->wpdb->prepare("SELECT * FROM " . $this->wpdb->posts . " WHERE (post_title = %s OR post_title = %s OR post_name = %s OR post_name = %s) AND post_type = %s;", $attachment_filename, preg_replace('/\\.[^.\\s]{3,4}$/', '', $attachment_filename), sanitize_title($attachment_filename), sanitize_title(preg_replace('/\\.[^.\\s]{3,4}$/', '', $attachment_filename)), "attachment"));
                                         if ($attch != null) {
                                             $download_file = false;
                                             $attach_id = $attch->ID;
                                         }
                                     }
                                     if ($download_file) {
                                         $attachment_filename = wp_unique_filename($targetDir, $attachment_filename);
                                         $attachment_filepath = $targetDir . '/' . sanitize_file_name($attachment_filename);
                                         $logger and call_user_func($logger, sprintf(__('- Filename for attachment was generated as %s', 'wp_all_import_plugin'), $attachment_filename));
                                         $request = get_file_curl(trim($atch_url), $attachment_filepath);
                                         $get_ctx = stream_context_create(array('http' => array('timeout' => 5)));
                                         if ((is_wp_error($request) or $request === false) and !@file_put_contents($attachment_filepath, @file_get_contents(trim($atch_url), false, $get_ctx))) {
                                             $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: Attachment file %s cannot be saved locally as %s', 'wp_all_import_plugin'), trim($atch_url), $attachment_filepath));
                                             is_wp_error($request) and $logger and call_user_func($logger, sprintf(__('- <b>WP Error</b>: %s', 'wp_all_import_plugin'), $request->get_error_message()));
                                             $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                             unlink($attachment_filepath);
                                             // delete file since failed upload may result in empty file created
                                         } elseif (!($wp_filetype = wp_check_filetype(basename($attachment_filename), null))) {
                                             $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: Can\'t detect attachment file type %s', 'wp_all_import_plugin'), trim($atch_url)));
                                             $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                         } else {
                                             $handle_attachment = array('file' => $attachment_filepath, 'url' => $targetUrl . '/' . basename($attachment_filepath), 'type' => $wp_filetype['type']);
                                             //apply_filters( 'wp_handle_upload', , 'upload' );
                                             $logger and call_user_func($logger, sprintf(__('- File %s has been successfully downloaded', 'wp_all_import_plugin'), $atch_url));
                                             $attachment_data = array('guid' => $handle_attachment['url'], 'post_mime_type' => $handle_attachment['type'], 'post_title' => preg_replace('/\\.[^.]+$/', '', basename($handle_attachment['file'])), 'post_content' => '', 'post_status' => 'inherit', 'post_author' => $post_author[$i]);
                                             $attach_id = wp_insert_attachment($attachment_data, $handle_attachment['file'], $pid);
                                             if (is_wp_error($attach_id)) {
                                                 $logger and call_user_func($logger, __('- <b>WARNING</b>', 'wp_all_import_plugin') . ': ' . $pid->get_error_message());
                                                 $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                             } else {
                                                 wp_update_attachment_metadata($attach_id, wp_generate_attachment_metadata($attach_id, $handle_attachment['file']));
                                                 $logger and call_user_func($logger, sprintf(__('- Attachment has been successfully created for post `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
                                                 $logger and call_user_func($logger, __('- <b>ACTION</b>: pmxi_attachment_uploaded', 'wp_all_import_plugin'));
                                                 do_action('pmxi_attachment_uploaded', $pid, $attach_id, $handle_attachment['file']);
                                             }
                                         }
                                     } else {
                                         $logger and call_user_func($logger, __('- <b>ACTION</b>: pmxi_attachment_uploaded', 'wp_all_import_plugin'));
                                         do_action('pmxi_attachment_uploaded', $pid, $attach_id, $attachment_filepath);
                                     }
                                 }
                             }
                         }
                     }
                 }
                 if (!$is_attachments_to_update) {
                     $logger and call_user_func($logger, sprintf(__('Attachments import skipped for post `%s` according to \'pmxi_is_attachments_to_update\' filter...', 'wp_all_import_plugin'), $articleData['post_title']));
                 }
                 // [/attachments]
                 // [custom taxonomies]
                 if (!empty($taxonomies)) {
                     $logger and call_user_func($logger, __('<b>TAXONOMIES:</b>', 'wp_all_import_plugin'));
                     foreach ($taxonomies as $tx_name => $txes) {
                         // Skip updating product attributes
                         if (PMXI_Admin_Addons::get_addon('PMWI_Plugin') and strpos($tx_name, "pa_") === 0) {
                             continue;
                         }
                         if (empty($articleData['ID']) or $this->options['update_all_data'] == "yes" or $this->options['update_all_data'] == "no" and $this->options['is_update_categories']) {
                             $logger and call_user_func($logger, sprintf(__('- Importing taxonomy `%s` ...', 'wp_all_import_plugin'), $tx_name));
                             if (!empty($this->options['tax_logic'][$tx_name]) and $this->options['tax_logic'][$tx_name] == 'hierarchical' and !empty($this->options['tax_hierarchical_logic'][$tx_name]) and $this->options['tax_hierarchical_logic'][$tx_name] == 'entire') {
                                 $logger and call_user_func($logger, sprintf(__('- Auto-nest enabled with separator `%s` ...', 'wp_all_import_plugin'), !empty($this->options['tax_hierarchical_delim'][$tx_name]) ? $this->options['tax_hierarchical_delim'][$tx_name] : ','));
                             }
                             if (!empty($articleData['ID'])) {
                                 if ($this->options['update_all_data'] == "no" and $this->options['update_categories_logic'] == "all_except" and !empty($this->options['taxonomies_list']) and is_array($this->options['taxonomies_list']) and in_array($tx_name, $this->options['taxonomies_list'])) {
                                     $logger and call_user_func($logger, sprintf(__('- %s %s `%s` has been skipped attempted to `Leave these taxonomies alone, update all others`...', 'wp_all_import_plugin'), $custom_type_details->labels->singular_name, $tx_name, $single_tax['name']));
                                     continue;
                                 }
                                 if ($this->options['update_all_data'] == "no" and $this->options['update_categories_logic'] == "only" and (!empty($this->options['taxonomies_list']) and is_array($this->options['taxonomies_list']) and !in_array($tx_name, $this->options['taxonomies_list']) or empty($this->options['taxonomies_list']))) {
                                     $logger and call_user_func($logger, sprintf(__('- %s %s `%s` has been skipped attempted to `Update only these taxonomies, leave the rest alone`...', 'wp_all_import_plugin'), $custom_type_details->labels->singular_name, $tx_name, $single_tax['name']));
                                     continue;
                                 }
                             }
                             $assign_taxes = array();
                             if ($this->options['update_categories_logic'] == "add_new" and !empty($existing_taxonomies[$tx_name][$i])) {
                                 $assign_taxes = $existing_taxonomies[$tx_name][$i];
                                 unset($existing_taxonomies[$tx_name][$i]);
                             } elseif (!empty($existing_taxonomies[$tx_name][$i])) {
                                 unset($existing_taxonomies[$tx_name][$i]);
                             }
                             // create term if not exists
                             if (!empty($txes[$i])) {
                                 foreach ($txes[$i] as $key => $single_tax) {
                                     $is_created_term = false;
                                     if (is_array($single_tax) and !empty($single_tax['name'])) {
                                         $parent_id = !empty($single_tax['parent']) ? pmxi_recursion_taxes($single_tax['parent'], $tx_name, $txes[$i], $key) : '';
                                         $term = empty($this->options['tax_is_full_search_' . $this->options['tax_logic'][$tx_name]][$tx_name]) ? is_exists_term($single_tax['name'], $tx_name, (int) $parent_id) : is_exists_term($single_tax['name'], $tx_name);
                                         if (empty($term) and !is_wp_error($term)) {
                                             $term = empty($this->options['tax_is_full_search_' . $this->options['tax_logic'][$tx_name]][$tx_name]) ? is_exists_term(htmlspecialchars($single_tax['name']), $tx_name, (int) $parent_id) : is_exists_term(htmlspecialchars($single_tax['name']), $tx_name);
                                             if (empty($term) and !is_wp_error($term)) {
                                                 $term_attr = array('parent' => !empty($parent_id) ? $parent_id : 0);
                                                 $term = wp_insert_term($single_tax['name'], $tx_name, $term_attr);
                                                 if (!is_wp_error($term)) {
                                                     $is_created_term = true;
                                                     if (empty($parent_id)) {
                                                         $logger and call_user_func($logger, sprintf(__('- Creating parent %s %s `%s` ...', 'wp_all_import_plugin'), $custom_type_details->labels->singular_name, $tx_name, $single_tax['name']));
                                                     } else {
                                                         $logger and call_user_func($logger, sprintf(__('- Creating child %s %s for %s named `%s` ...', 'wp_all_import_plugin'), $custom_type_details->labels->singular_name, $tx_name, is_array($single_tax['parent']) ? $single_tax['parent']['name'] : $single_tax['parent'], $single_tax['name']));
                                                     }
                                                 }
                                             }
                                         }
                                         if (is_wp_error($term)) {
                                             $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: `%s`', 'wp_all_import_plugin'), $term->get_error_message()));
                                             $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                         } elseif (!empty($term)) {
                                             $cat_id = $term['term_id'];
                                             if ($cat_id and $single_tax['assign']) {
                                                 $term = get_term_by('id', $cat_id, $tx_name);
                                                 if ($term->parent != '0' and !empty($this->options['tax_is_full_search_' . $this->options['tax_logic'][$tx_name]][$tx_name]) and empty($this->options['tax_assign_to_one_term_' . $this->options['tax_logic'][$tx_name]][$tx_name])) {
                                                     $parent_ids = wp_all_import_get_parent_terms($cat_id, $tx_name);
                                                     if (!empty($parent_ids)) {
                                                         foreach ($parent_ids as $p) {
                                                             if (!in_array($p, $assign_taxes)) {
                                                                 $assign_taxes[] = $p;
                                                             }
                                                         }
                                                     }
                                                 }
                                                 if (!in_array($term->term_taxonomy_id, $assign_taxes)) {
                                                     $assign_taxes[] = $term->term_taxonomy_id;
                                                 }
                                                 if (!$is_created_term) {
                                                     if (empty($parent_id)) {
                                                         $logger and call_user_func($logger, sprintf(__('- Attempted to create parent %s %s `%s`, duplicate detected. Importing %s to existing `%s` %s, ID %d, slug `%s` ...', 'wp_all_import_plugin'), $custom_type_details->labels->singular_name, $tx_name, $single_tax['name'], $custom_type_details->labels->singular_name, $term->name, $tx_name, $term->term_id, $term->slug));
                                                     } else {
                                                         $logger and call_user_func($logger, sprintf(__('- Attempted to create child %s %s `%s`, duplicate detected. Importing %s to existing `%s` %s, ID %d, slug `%s` ...', 'wp_all_import_plugin'), $custom_type_details->labels->singular_name, $tx_name, $single_tax['name'], $custom_type_details->labels->singular_name, $term->name, $tx_name, $term->term_id, $term->slug));
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                             // associate taxes with post
                             $this->associate_terms($pid, empty($assign_taxes) ? false : $assign_taxes, $tx_name, $logger, $is_cron);
                         } else {
                             $logger and call_user_func($logger, sprintf(__('- %s %s `%s` has been skipped attempted to `Do not update Taxonomies (incl. Categories and Tags)`...', 'wp_all_import_plugin'), $custom_type_details->labels->singular_name, $tx_name, $single_tax['name']));
                         }
                     }
                     if ($this->options['update_all_data'] == "no" and ($this->options['is_update_categories'] and $this->options['update_categories_logic'] != 'full_update' or !$this->options['is_update_categories'] and (is_object_in_taxonomy($post_type[$i], 'category') or is_object_in_taxonomy($post_type[$i], 'post_tag')))) {
                         if (!empty($existing_taxonomies)) {
                             foreach ($existing_taxonomies as $tx_name => $txes) {
                                 // Skip updating product attributes
                                 if (PMXI_Admin_Addons::get_addon('PMWI_Plugin') and strpos($tx_name, "pa_") === 0) {
                                     continue;
                                 }
                                 if (!empty($txes[$i])) {
                                     $this->associate_terms($pid, $txes[$i], $tx_name, $logger, $is_cron);
                                 }
                             }
                         }
                     }
                 }
                 // [/custom taxonomies]
                 if (empty($articleData['ID'])) {
                     $logger and call_user_func($logger, sprintf(__('<b>CREATED</b> `%s` `%s` (ID: %s)', 'wp_all_import_plugin'), $articleData['post_title'], $custom_type_details->labels->singular_name, $pid));
                 } else {
                     $logger and call_user_func($logger, sprintf(__('<b>UPDATED</b> `%s` `%s` (ID: %s)', 'wp_all_import_plugin'), $articleData['post_title'], $custom_type_details->labels->singular_name, $pid));
                 }
                 $is_update = !empty($articleData['ID']);
                 // fire important hooks after custom fields are added
                 if (!$this->options['is_fast_mode'] and $this->options['custom_type'] != 'import_users') {
                     $post_object = get_post($pid);
                     do_action("save_post_" . $articleData['post_type'], $pid, $post_object, $is_update);
                     do_action('save_post', $pid, $post_object, $is_update);
                     do_action('wp_insert_post', $pid, $post_object, $is_update);
                 }
                 // [addons import]
                 // prepare data for import
                 $importData = array('pid' => $pid, 'import' => $this, 'logger' => $logger);
                 $saved_functions = apply_filters('wp_all_import_addon_saved_post', array());
                 // deligate operation to addons
                 foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
                     if (class_exists($class)) {
                         if (method_exists($addons[$class], 'saved_post')) {
                             $addons[$class]->saved_post($importData);
                         }
                     } else {
                         if (!empty($saved_functions[$class])) {
                             if (is_array($saved_functions[$class]) and is_callable($saved_functions[$class]) or !is_array($saved_functions[$class]) and function_exists($saved_functions[$class])) {
                                 call_user_func($saved_functions[$class], $importData);
                             }
                         }
                     }
                 }
                 // [/addons import]
                 $logger and call_user_func($logger, __('<b>ACTION</b>: pmxi_saved_post', 'wp_all_import_plugin'));
                 do_action('pmxi_saved_post', $pid, $rootNodes[$i], $is_update);
                 // hook that was triggered immediately after post saved
                 if (empty($articleData['ID'])) {
                     $created++;
                 } else {
                     $updated++;
                 }
                 if (!$is_cron and "default" == $this->options['import_processing']) {
                     $processed_records = $created + $updated + $skipped;
                     $logger and call_user_func($logger, sprintf(__('<span class="processing_info"><span class="created_count">%s</span><span class="updated_count">%s</span><span class="percents_count">%s</span></span>', 'wp_all_import_plugin'), $created, $updated, ceil($processed_records / $this->count * 100)));
                 }
             }
             $logger and call_user_func($logger, __('<b>ACTION</b>: pmxi_after_post_import', 'wp_all_import_plugin'));
             do_action('pmxi_after_post_import', $this->id);
             $logger and !$is_cron and PMXI_Plugin::$session->chunk_number++;
         }
         wp_cache_flush();
         $this->set(array('imported' => $created + $updated, 'created' => $created, 'updated' => $updated, 'skipped' => $skipped, 'last_activity' => date('Y-m-d H:i:s')))->update();
         if (!$is_cron) {
             PMXI_Plugin::$session->save_data();
             $records_count = $this->created + $this->updated + $this->skipped;
             $records_to_import = empty($specified_records) ? $this->count : $specified_records[count($specified_records) - 1];
             $is_import_complete = $records_count == $records_to_import;
             // Set out of stock status for missing records [Woocommerce add-on option]
             if ($is_import_complete and empty($this->options['is_delete_missing']) and $post_type[$i] == "product" and class_exists('PMWI_Plugin') and !empty($this->options['missing_records_stock_status'])) {
                 $logger and call_user_func($logger, __('Update stock status previously imported posts which are no longer actual...', 'wp_all_import_plugin'));
                 $args = array('import_id' => $this->id, 'iteration !=' => $this->iteration);
                 if (!empty($this->options['is_import_specified'])) {
                     $args['specified'] = 1;
                 }
                 $postList = new PMXI_Post_List();
                 $missingPosts = $postList->getBy($args);
                 if (!$missingPosts->isEmpty()) {
                     foreach ($missingPosts as $missingPost) {
                         update_post_meta($missingPost['post_id'], '_stock_status', 'outofstock');
                         update_post_meta($missingPost['post_id'], '_stock', 0);
                         $missingPostRecord = new PMXI_Post_Record();
                         $missingPostRecord->getBy('id', $missingPost['id']);
                         if (!$missingPostRecord->isEmpty()) {
                             $missingPostRecord->set(array('iteration' => $this->iteration))->update();
                         }
                         unset($missingPostRecord);
                     }
                 }
             }
         }
     } catch (XmlImportException $e) {
         $logger and call_user_func($logger, __('<b>ERROR</b>', 'wp_all_import_plugin') . ': ' . $e->getMessage());
         $logger and !$is_cron and PMXI_Plugin::$session->errors++;
     }
     $logger and $is_import_complete and call_user_func($logger, __('Cleaning temporary data...', 'wp_all_import_plugin'));
     foreach ($tmp_files as $file) {
         // remove all temporary files created
         @unlink($file);
     }
     remove_filter('user_has_cap', array($this, '_filter_has_cap_unfiltered_html'));
     kses_init();
     // return any filtering rules back if they has been disabled for import procedure
     return $this;
 }
Example #4
0
 /**
  * Perform import operation
  * @param string $xml XML string to import
  * @param callback[optional] $logger Method where progress messages are submmitted
  * @return PMXI_Import_Record
  * @chainable
  */
 public function process($xml, $logger = NULL, $chunk = false, $is_cron = false, $xpath_prefix = '')
 {
     add_filter('user_has_cap', array($this, '_filter_has_cap_unfiltered_html'));
     kses_init();
     // do not perform special filtering for imported content
     $cxpath = $xpath_prefix . $this->xpath;
     $this->options += PMXI_Plugin::get_default_import_options();
     // make sure all options are defined
     $avoid_pingbacks = PMXI_Plugin::getInstance()->getOption('pingbacks');
     if ($avoid_pingbacks and !defined('WP_IMPORTING')) {
         define('WP_IMPORTING', true);
     }
     $postRecord = new PMXI_Post_Record();
     $tmp_files = array();
     // compose records to import
     $records = array();
     $is_import_complete = false;
     try {
         $chunk == 1 and $logger and call_user_func($logger, __('Composing titles...', 'pmxi_plugin'));
         $titles = XmlImportParser::factory($xml, $cxpath, $this->template['title'], $file)->parse($records);
         $tmp_files[] = $file;
         $chunk == 1 and $logger and call_user_func($logger, __('Composing excerpts...', 'pmxi_plugin'));
         $post_excerpt = array();
         if (!empty($this->options['post_excerpt'])) {
             $post_excerpt = XmlImportParser::factory($xml, $cxpath, $this->options['post_excerpt'], $file)->parse($records);
             $tmp_files[] = $file;
         } else {
             count($titles) and $post_excerpt = array_fill(0, count($titles), '');
         }
         if ("xpath" == $this->options['status']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing statuses...', 'pmxi_plugin'));
             $post_status = array();
             if (!empty($this->options['status_xpath'])) {
                 $post_status = XmlImportParser::factory($xml, $cxpath, $this->options['status_xpath'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $post_status = array_fill(0, count($titles), '');
             }
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing authors...', 'pmxi_plugin'));
         $post_author = array();
         $current_user = wp_get_current_user();
         if (!empty($this->options['author'])) {
             $post_author = XmlImportParser::factory($xml, $cxpath, $this->options['author'], $file)->parse($records);
             $tmp_files[] = $file;
             foreach ($post_author as $key => $author) {
                 $user = get_user_by('login', $author) or $user = get_user_by('slug', $author) or $user = get_user_by('email', $author) or ctype_digit($author) and $user = get_user_by('id', $author);
                 $post_author[$key] = !empty($user) ? $user->ID : $current_user->ID;
             }
         } else {
             count($titles) and $post_author = array_fill(0, count($titles), $current_user->ID);
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing slugs...', 'pmxi_plugin'));
         $post_slug = array();
         if (!empty($this->options['post_slug'])) {
             $post_slug = XmlImportParser::factory($xml, $cxpath, $this->options['post_slug'], $file)->parse($records);
             $tmp_files[] = $file;
         } else {
             count($titles) and $post_slug = array_fill(0, count($titles), '');
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing contents...', 'pmxi_plugin'));
         $contents = XmlImportParser::factory((!empty($this->template['is_keep_linebreaks']) and intval($this->template['is_keep_linebreaks'])) ? $xml : preg_replace('%\\r\\n?|\\n%', ' ', $xml), $cxpath, $this->template['content'], $file)->parse($records);
         $tmp_files[] = $file;
         $chunk == 1 and $logger and call_user_func($logger, __('Composing dates...', 'pmxi_plugin'));
         if ('specific' == $this->options['date_type']) {
             $dates = XmlImportParser::factory($xml, $cxpath, $this->options['date'], $file)->parse($records);
             $tmp_files[] = $file;
             $warned = array();
             // used to prevent the same notice displaying several times
             foreach ($dates as $i => $d) {
                 if ($d == 'now') {
                     $d = current_time('mysql');
                 }
                 // Replace 'now' with the WordPress local time to account for timezone offsets (WordPress references its local time during publishing rather than the server’s time so it should use that)
                 $time = strtotime($d);
                 if (FALSE === $time) {
                     in_array($d, $warned) or $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: unrecognized date format `%s`, assigning current date', 'pmxi_plugin'), $warned[] = $d));
                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                     $time = time();
                 }
                 $dates[$i] = date('Y-m-d H:i:s', $time);
             }
         } else {
             $dates_start = XmlImportParser::factory($xml, $cxpath, $this->options['date_start'], $file)->parse($records);
             $tmp_files[] = $file;
             $dates_end = XmlImportParser::factory($xml, $cxpath, $this->options['date_end'], $file)->parse($records);
             $tmp_files[] = $file;
             $warned = array();
             // used to prevent the same notice displaying several times
             foreach ($dates_start as $i => $d) {
                 $time_start = strtotime($dates_start[$i]);
                 if (FALSE === $time_start) {
                     in_array($dates_start[$i], $warned) or $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: unrecognized date format `%s`, assigning current date', 'pmxi_plugin'), $warned[] = $dates_start[$i]));
                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                     $time_start = time();
                 }
                 $time_end = strtotime($dates_end[$i]);
                 if (FALSE === $time_end) {
                     in_array($dates_end[$i], $warned) or $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: unrecognized date format `%s`, assigning current date', 'pmxi_plugin'), $warned[] = $dates_end[$i]));
                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                     $time_end = time();
                 }
                 $dates[$i] = date('Y-m-d H:i:s', mt_rand($time_start, $time_end));
             }
         }
         $tags = array();
         if ($this->options['tags']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing tags...', 'pmxi_plugin'));
             $tags_raw = XmlImportParser::factory($xml, $cxpath, $this->options['tags'], $file)->parse($records);
             $tmp_files[] = $file;
             foreach ($tags_raw as $i => $t_raw) {
                 $tags[$i] = '';
                 if ('' != $t_raw) {
                     $tags[$i] = implode(', ', str_getcsv($t_raw, $this->options['tags_delim']));
                 }
             }
         } else {
             count($titles) and $tags = array_fill(0, count($titles), '');
         }
         // [posts categories]
         require_once ABSPATH . 'wp-admin/includes/taxonomy.php';
         if ('post' == $this->options['type']) {
             $cats = array();
             $categories_hierarchy = !empty($this->options['categories']) ? json_decode($this->options['categories']) : array();
             if (!empty($categories_hierarchy) and is_array($categories_hierarchy)) {
                 $chunk == 1 and $logger and call_user_func($logger, __('Composing categories...', 'pmxi_plugin'));
                 $categories = array();
                 foreach ($categories_hierarchy as $k => $category) {
                     if ("" == $category->xpath) {
                         continue;
                     }
                     $cats_raw = XmlImportParser::factory($xml, $cxpath, str_replace('\'', '"', $category->xpath), $file)->parse($records);
                     $tmp_files[] = $file;
                     $warned = array();
                     // used to prevent the same notice displaying several times
                     foreach ($cats_raw as $i => $c_raw) {
                         if (empty($categories_hierarchy[$k]->cat_ids[$i])) {
                             $categories_hierarchy[$k]->cat_ids[$i] = array();
                         }
                         if (empty($cats[$i])) {
                             $cats[$i] = array();
                         }
                         $count_cats = count($cats[$i]);
                         $delimeted_categories = explode($this->options['categories_delim'], $c_raw);
                         if ('' != $c_raw) {
                             foreach (explode($this->options['categories_delim'], $c_raw) as $j => $cc) {
                                 if ('' != $cc) {
                                     $cat = get_term_by('name', trim($cc), 'category') or $cat = get_term_by('slug', trim($cc), 'category') or ctype_digit($cc) and $cat = get_term_by('id', trim($cc), 'category');
                                     if (!empty($category->parent_id)) {
                                         foreach ($categories_hierarchy as $key => $value) {
                                             if ($value->item_id == $category->parent_id and !empty($value->cat_ids[$i])) {
                                                 foreach ($value->cat_ids[$i] as $parent) {
                                                     if (!$j or !$this->options['categories_auto_nested']) {
                                                         $filtered_cats = apply_filters('pmxi_single_category', array(array('name' => trim($cc), 'parent' => is_array($parent) ? $parent['name'] : $parent, 'assign' => $category->assign)), $category);
                                                         foreach ($filtered_cats as $filtered_cat) {
                                                             $cats[$i][] = $filtered_cat;
                                                         }
                                                     } elseif ($this->options['categories_auto_nested']) {
                                                         $filtered_cats = apply_filters('pmxi_single_category', array(array('name' => trim($cc), 'parent' => !empty($delimeted_categories[$j - 1]) ? apply_filters('pmxi_parent_category', trim($delimeted_categories[$j - 1]), $category) : false, 'assign' => $category->assign)), $category);
                                                         foreach ($filtered_cats as $filtered_cat) {
                                                             $cats[$i][] = $filtered_cat;
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     } else {
                                         if (!$j or !$this->options['categories_auto_nested']) {
                                             $filtered_cats = apply_filters('pmxi_single_category', array(array('name' => trim($cc), 'parent' => false, 'assign' => $category->assign)), $category);
                                             foreach ($filtered_cats as $filtered_cat) {
                                                 $cats[$i][] = $filtered_cat;
                                             }
                                         } elseif ($this->options['categories_auto_nested']) {
                                             $filtered_cats = apply_filters('pmxi_single_category', array(array('name' => trim($cc), 'parent' => !empty($delimeted_categories[$j - 1]) ? apply_filters('pmxi_parent_category', trim($delimeted_categories[$j - 1]), $category) : false, 'assign' => $category->assign)), $category);
                                             foreach ($filtered_cats as $filtered_cat) {
                                                 $cats[$i][] = $filtered_cat;
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                         if ($count_cats < count($cats[$i])) {
                             $categories_hierarchy[$k]->cat_ids[$i][] = apply_filters('pmxi_single_category', $cats[$i][count($cats[$i]) - 1], $categories_hierarchy[$k]);
                         }
                     }
                 }
             } else {
                 count($titles) and $cats = array_fill(0, count($titles), '');
             }
         }
         // [/posts categories]
         // [custom taxonomies]
         $taxonomies = array();
         $taxonomies_param = $this->options['type'] . '_taxonomies';
         if ('page' == $this->options['type']) {
             $taxonomies_object_type = 'page';
         } elseif ('' != $this->options['custom_type']) {
             $taxonomies_object_type = $this->options['custom_type'];
         } else {
             $taxonomies_object_type = 'post';
         }
         if (!empty($this->options[$taxonomies_param]) and is_array($this->options[$taxonomies_param])) {
             foreach ($this->options[$taxonomies_param] as $tx_name => $tx_template) {
                 if ('' != $tx_template) {
                     $tx = get_taxonomy($tx_name);
                     $taxonomies[$tx_name] = array();
                     if (!empty($tx->object_type) and in_array($taxonomies_object_type, $tx->object_type)) {
                         $chunk == 1 and $logger and call_user_func($logger, sprintf(__('Composing terms for `%s` taxonomy...', 'pmxi_plugin'), $tx->labels->name));
                         $txes = array();
                         $taxonomies_hierarchy = json_decode($tx_template);
                         foreach ($taxonomies_hierarchy as $k => $taxonomy) {
                             if ("" == $taxonomy->xpath) {
                                 continue;
                             }
                             $txes_raw = XmlImportParser::factory($xml, $cxpath, str_replace('\'', '"', $taxonomy->xpath), $file)->parse($records);
                             $tmp_files[] = $file;
                             $warned = array();
                             foreach ($txes_raw as $i => $tx_raw) {
                                 if (empty($taxonomies_hierarchy[$k]->txn_names[$i])) {
                                     $taxonomies_hierarchy[$k]->txn_names[$i] = array();
                                 }
                                 if (empty($taxonomies[$tx_name][$i])) {
                                     $taxonomies[$tx_name][$i] = array();
                                 }
                                 $count_cats = count($taxonomies[$tx_name][$i]);
                                 $delimeted_taxonomies = explode(!empty($taxonomy->delim) ? $taxonomy->delim : ',', $tx_raw);
                                 if ('' != $tx_raw) {
                                     foreach (explode(!empty($taxonomy->delim) ? $taxonomy->delim : ',', $tx_raw) as $j => $cc) {
                                         if ('' != $cc) {
                                             $cat = get_term_by('name', trim($cc), $tx_name) or $cat = get_term_by('slug', trim($cc), $tx_name) or ctype_digit($cc) and $cat = get_term_by('id', $cc, $tx_name);
                                             if (!empty($taxonomy->parent_id)) {
                                                 foreach ($taxonomies_hierarchy as $key => $value) {
                                                     if ($value->item_id == $taxonomy->parent_id and !empty($value->txn_names[$i])) {
                                                         foreach ($value->txn_names[$i] as $parent) {
                                                             if (!$j or !$taxonomy->auto_nested) {
                                                                 $filtered_txs = apply_filters('pmxi_single_category', array(array('name' => trim($cc), 'parent' => $parent, 'assign' => $taxonomy->assign)), $taxonomy);
                                                                 foreach ($filtered_txs as $filtered_tx) {
                                                                     $taxonomies[$tx_name][$i][] = $filtered_tx;
                                                                 }
                                                             } elseif ($taxonomy->auto_nested) {
                                                                 $filtered_txs = apply_filters('pmxi_single_category', array(array('name' => trim($cc), 'parent' => !empty($delimeted_taxonomies[$j - 1]) ? apply_filters('pmxi_parent_category', trim($delimeted_taxonomies[$j - 1]), $taxonomy) : false, 'assign' => $taxonomy->assign)), $taxonomy);
                                                                 foreach ($filtered_txs as $filtered_tx) {
                                                                     $taxonomies[$tx_name][$i][] = $filtered_tx;
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                             } else {
                                                 if (!$j or !$taxonomy->auto_nested) {
                                                     $filtered_txs = apply_filters('pmxi_single_category', array(array('name' => trim($cc), 'parent' => false, 'assign' => $taxonomy->assign)), $taxonomy);
                                                     foreach ($filtered_txs as $filtered_tx) {
                                                         $taxonomies[$tx_name][$i][] = $filtered_tx;
                                                     }
                                                 } elseif ($taxonomy->auto_nested) {
                                                     $filtered_txs = apply_filters('pmxi_single_category', array(array('name' => trim($cc), 'parent' => !empty($delimeted_taxonomies[$j - 1]) ? apply_filters('pmxi_parent_category', trim($delimeted_taxonomies[$j - 1]), $taxonomy) : false, 'assign' => $taxonomy->assign)), $taxonomy);
                                                     foreach ($filtered_txs as $filtered_tx) {
                                                         $taxonomies[$tx_name][$i][] = $filtered_tx;
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                                 if ($count_cats < count($taxonomies[$tx_name][$i])) {
                                     $taxonomies_hierarchy[$k]->txn_names[$i][] = apply_filters('pmxi_single_category', $taxonomies[$tx_name][$i][count($taxonomies[$tx_name][$i]) - 1], $taxonomies_hierarchy[$k]);
                                 }
                             }
                         }
                     }
                 }
             }
         }
         // [/custom taxonomies]
         // serialized featured images
         if (!(($uploads = wp_upload_dir()) && false === $uploads['error'])) {
             $logger and call_user_func($logger, __('<b>WARNING</b>', 'pmxi_plugin') . ': ' . $uploads['error']);
             $logger and call_user_func($logger, __('<b>WARNING</b>: No featured images will be created', 'pmxi_plugin'));
             $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
         } else {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing URLs for featured images...', 'pmxi_plugin'));
             $featured_images = array();
             if ($this->options['featured_image']) {
                 $featured_images = XmlImportParser::factory($xml, $cxpath, $this->options['featured_image'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $featured_images = array_fill(0, count($titles), '');
             }
         }
         // serialized images meta data
         if ($this->options['set_image_meta_data']) {
             $uploads = wp_upload_dir();
             // serialized images meta titles
             $chunk == 1 and $logger and call_user_func($logger, __('Composing image meta data (titles)...', 'pmxi_plugin'));
             $image_meta_titles = array();
             if ($this->options['image_meta_title']) {
                 $image_meta_titles = XmlImportParser::factory($xml, $cxpath, $this->options['image_meta_title'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $image_meta_titles = array_fill(0, count($titles), '');
             }
             // serialized images meta captions
             $chunk == 1 and $logger and call_user_func($logger, __('Composing image meta data (captions)...', 'pmxi_plugin'));
             $image_meta_captions = array();
             if ($this->options['image_meta_caption']) {
                 $image_meta_captions = XmlImportParser::factory($xml, $cxpath, $this->options['image_meta_caption'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $image_meta_captions = array_fill(0, count($titles), '');
             }
             // serialized images meta alt text
             $chunk == 1 and $logger and call_user_func($logger, __('Composing image meta data (alt text)...', 'pmxi_plugin'));
             $image_meta_alts = array();
             if ($this->options['image_meta_alt']) {
                 $image_meta_alts = XmlImportParser::factory($xml, $cxpath, $this->options['image_meta_alt'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $image_meta_alts = array_fill(0, count($titles), '');
             }
             // serialized images meta description
             $chunk == 1 and $logger and call_user_func($logger, __('Composing image meta data (description)...', 'pmxi_plugin'));
             $image_meta_descriptions = array();
             if ($this->options['image_meta_description']) {
                 $image_meta_descriptions = XmlImportParser::factory($xml, $cxpath, $this->options['image_meta_description'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 count($titles) and $image_meta_descriptions = array_fill(0, count($titles), '');
             }
         }
         // Composing images suffix
         $chunk == 1 and $this->options['auto_rename_images'] and $logger and call_user_func($logger, __('Composing images suffix...', 'pmxi_plugin'));
         $auto_rename_images = array();
         if ($this->options['auto_rename_images'] and !empty($this->options['auto_rename_images_suffix'])) {
             $auto_rename_images = XmlImportParser::factory($xml, $cxpath, $this->options['auto_rename_images_suffix'], $file)->parse($records);
             $tmp_files[] = $file;
         } else {
             count($titles) and $auto_rename_images = array_fill(0, count($titles), '');
         }
         // serialized attachments
         if (!(($uploads = wp_upload_dir()) && false === $uploads['error'])) {
             $logger and call_user_func($logger, __('<b>WARNING</b>', 'pmxi_plugin') . ': ' . $uploads['error']);
             $logger and call_user_func($logger, __('<b>WARNING</b>: No attachments will be created', 'pmxi_plugin'));
             $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session['pmxi_import']['warnings'];
         } else {
             $chunk == 1 and $logger and call_user_func($logger, __('Composing URLs for attachments files...', 'pmxi_plugin'));
             $attachments = array();
             if ($this->options['attachments']) {
                 // Detect if attachments is separated by comma
                 $atchs = explode(',', $this->options['attachments']);
                 if (!empty($atchs)) {
                     $parse_multiple = true;
                     foreach ($atchs as $atch) {
                         if (!preg_match("/{.*}/", trim($atch))) {
                             $parse_multiple = false;
                         }
                     }
                     if ($parse_multiple) {
                         foreach ($atchs as $atch) {
                             $posts_attachments = XmlImportParser::factory($xml, $cxpath, trim($atch), $file)->parse($records);
                             $tmp_files[] = $file;
                             foreach ($posts_attachments as $i => $val) {
                                 $attachments[$i][] = $val;
                             }
                         }
                     } else {
                         $attachments = XmlImportParser::factory($xml, $cxpath, $this->options['attachments'], $file)->parse($records);
                         $tmp_files[] = $file;
                     }
                 }
             } else {
                 count($titles) and $attachments = array_fill(0, count($titles), '');
             }
         }
         $chunk == 1 and $logger and call_user_func($logger, __('Composing unique keys...', 'pmxi_plugin'));
         $unique_keys = XmlImportParser::factory($xml, $cxpath, $this->options['unique_key'], $file)->parse($records);
         $tmp_files[] = $file;
         $chunk == 1 and $logger and call_user_func($logger, __('Processing posts...', 'pmxi_plugin'));
         if ('post' == $this->options['type'] and '' != $this->options['custom_type']) {
             $post_type = ($this->options['custom_type'] == 'product' and class_exists('PMWI_Plugin')) ? $this->options['custom_type'] : ($this->options['custom_type'] == 'page' ? 'page' : 'post');
         } else {
             $post_type = $this->options['type'];
         }
         $addons = array();
         $addons_data = array();
         // data parsing for WP All Import add-ons
         $parsingData = array('import' => $this, 'count' => count($titles), 'xml' => $xml, 'logger' => $logger, 'chunk' => $chunk, 'xpath_prefix' => $xpath_prefix);
         foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
             $model_class = str_replace("_Plugin", "_Import_Record", $class);
             if (class_exists($model_class)) {
                 $addons[$class] = new $model_class();
                 $addons_data[$class] = method_exists($addons[$class], 'parse') ? $addons[$class]->parse($parsingData) : false;
             } else {
                 $parse_func = $class . '_parse';
                 if (function_exists($parse_func)) {
                     $addons_data[$class] = call_user_func($parse_func, $parsingData);
                 }
             }
         }
         // save current import state to variables before import
         $created = $this->created;
         $updated = $this->updated;
         $skipped = $this->skipped;
         $specified_records = array();
         if ($this->options['is_import_specified']) {
             foreach (preg_split('% *, *%', $this->options['import_specified'], -1, PREG_SPLIT_NO_EMPTY) as $chank) {
                 if (preg_match('%^(\\d+)-(\\d+)$%', $chank, $mtch)) {
                     $specified_records = array_merge($specified_records, range(intval($mtch[1]), intval($mtch[2])));
                 } else {
                     $specified_records = array_merge($specified_records, array(intval($chank)));
                 }
             }
         }
         foreach ($titles as $i => $void) {
             wp_cache_flush();
             do_action('pmxi_before_post_import', $this->id);
             if (empty($titles[$i])) {
                 if (!empty($addons_data['PMWI_Plugin']) and !empty($addons_data['PMWI_Plugin']['single_product_parent_ID'][$i])) {
                     $titles[$i] = $addons_data['PMWI_Plugin']['single_product_parent_ID'][$i] . ' Product Variation';
                 } else {
                     $skipped++;
                     $logger and call_user_func($logger, __('<b>SKIPPED</b>: by empty title', 'pmxi_plugin'));
                     $logger and PMXI_Plugin::$session['pmxi_import']['chunk_number'] = ++PMXI_Plugin::$session->data['pmxi_import']['chunk_number'];
                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                     pmxi_session_commit();
                     continue;
                 }
             }
             $articleData = array('post_type' => $post_type, 'post_status' => "xpath" == $this->options['status'] ? $post_status[$i] : $this->options['status'], 'comment_status' => $this->options['comment_status'], 'ping_status' => $this->options['ping_status'], 'post_title' => !empty($this->template['is_leave_html']) ? html_entity_decode($titles[$i]) : $titles[$i], 'post_excerpt' => apply_filters('pmxi_the_excerpt', !empty($this->template['is_leave_html']) ? html_entity_decode($post_excerpt[$i]) : $post_excerpt[$i], $this->id), 'post_name' => $post_slug[$i], 'post_content' => apply_filters('pmxi_the_content', !empty($this->template['is_leave_html']) ? html_entity_decode($contents[$i]) : $contents[$i], $this->id), 'post_date' => $dates[$i], 'post_date_gmt' => get_gmt_from_date($dates[$i]), 'post_author' => $post_author[$i], 'tags_input' => $tags[$i]);
             if ('post' != $articleData['post_type']) {
                 $articleData += array('menu_order' => $this->options['order'], 'post_parent' => $this->options['parent']);
             }
             // Re-import Records Matching
             $post_to_update = false;
             $post_to_update_id = false;
             // if Auto Matching re-import option selected
             if ("manual" != $this->options['duplicate_matching']) {
                 // find corresponding article among previously imported
                 $postRecord->clear();
                 $postRecord->getBy(array('unique_key' => $unique_keys[$i], 'import_id' => $this->id));
                 if (!$postRecord->isEmpty()) {
                     $post_to_update = get_post($post_to_update_id = $postRecord->post_id);
                 }
                 // if Manual Matching re-import option seleted
             } else {
                 $postRecord->clear();
                 // find corresponding article among previously imported
                 $postRecord->getBy(array('unique_key' => $unique_keys[$i], 'import_id' => $this->id));
                 if ('custom field' == $this->options['duplicate_indicator']) {
                     $custom_duplicate_value = XmlImportParser::factory($xml, $cxpath, $this->options['custom_duplicate_value'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $custom_duplicate_name = XmlImportParser::factory($xml, $cxpath, $this->options['custom_duplicate_name'], $file)->parse($records);
                     $tmp_files[] = $file;
                 } else {
                     count($titles) and $custom_duplicate_name = $custom_duplicate_value = array_fill(0, count($titles), '');
                 }
                 // handle duplicates according to import settings
                 if ($duplicates = pmxi_findDuplicates($articleData, $custom_duplicate_name[$i], $custom_duplicate_value[$i], $this->options['duplicate_indicator'])) {
                     $duplicate_id = array_shift($duplicates);
                     if ($duplicate_id) {
                         $post_to_update = get_post($post_to_update_id = $duplicate_id);
                     }
                 }
             }
             if (!empty($specified_records)) {
                 if (!in_array($created + $updated + $skipped + 1, $specified_records)) {
                     if (!$postRecord->isEmpty()) {
                         $postRecord->set(array('iteration' => $this->iteration))->update();
                     }
                     $skipped++;
                     $logger and call_user_func($logger, __('<b>SKIPPED</b>: by specified records option', 'pmxi_plugin'));
                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                     $logger and PMXI_Plugin::$session['pmxi_import']['chunk_number'] = ++PMXI_Plugin::$session->data['pmxi_import']['chunk_number'];
                     pmxi_session_commit();
                     continue;
                 }
             }
             // Duplicate record is founded
             if ($post_to_update) {
                 // Do not update already existing records option selected
                 if ("yes" == $this->options['is_keep_former_posts']) {
                     if (!$postRecord->isEmpty()) {
                         $postRecord->set(array('iteration' => $this->iteration))->update();
                     }
                     do_action('pmxi_do_not_update_existing', $post_to_update_id, $this->id, $this->iteration);
                     $skipped++;
                     $logger and call_user_func($logger, sprintf(__('<b>SKIPPED</b>: Previously imported record found for `%s`', 'pmxi_plugin'), $articleData['post_title']));
                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                     $logger and PMXI_Plugin::$session['pmxi_import']['chunk_number'] = ++PMXI_Plugin::$session->data['pmxi_import']['chunk_number'];
                     pmxi_session_commit();
                     continue;
                 }
                 $articleData['ID'] = $post_to_update_id;
                 // Choose which data to update
                 if ($this->options['update_all_data'] == 'no') {
                     // preserve date of already existing article when duplicate is found
                     if (!$this->options['is_update_categories'] or $this->options['is_update_categories'] and $this->options['update_categories_logic'] != "full_update") {
                         // preserve categories and tags of already existing article if corresponding setting is specified
                         $cats_list = get_the_category($articleData['ID']);
                         $existing_cats = array();
                         if (is_wp_error($cats_list)) {
                             $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Unable to get current categories for article #%d, updating with those read from XML file', 'pmxi_plugin'), $articleData['ID']));
                             $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                         } else {
                             $cats_new = array();
                             foreach ($cats_list as $c) {
                                 $cats_new[] = $c->slug;
                             }
                             $existing_cats[$i] = $cats_new;
                         }
                         // Re-import Post Tags
                         if (!$this->options['is_update_categories'] or $this->options['update_categories_logic'] == 'add_new' or $this->options['update_categories_logic'] == 'only' and empty($this->options['taxonomies_list']) or !empty($this->options['taxonomies_list']) and is_array($this->options['taxonomies_list']) and (in_array('post_tag', $this->options['taxonomies_list']) and $this->options['update_categories_logic'] == 'all_except' or !in_array('post_tag', $this->options['taxonomies_list']) and $this->options['update_categories_logic'] == 'only')) {
                             $tags_list = get_the_tags($articleData['ID']);
                             if (is_wp_error($tags_list)) {
                                 $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Unable to get current tags for article #%d, updating with those read from XML file', 'pmxi_plugin'), $articleData['ID']));
                                 $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                             } else {
                                 $tags_new = ($this->options['is_update_categories'] and $this->options['update_categories_logic'] == 'add_new') ? array_filter(explode(",", $tags[$i])) : array();
                                 if ($tags_list) {
                                     foreach ($tags_list as $t) {
                                         if (!in_array($t->name, $tags_new)) {
                                             $tags_new[] = $t->name;
                                         }
                                     }
                                 }
                                 $articleData['tags_input'] = implode(', ', $tags_new);
                             }
                         }
                         $existing_taxonomies = array();
                         foreach (array_keys($taxonomies) as $tx_name) {
                             $txes_list = get_the_terms($articleData['ID'], $tx_name);
                             if (is_wp_error($txes_list)) {
                                 $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Unable to get current taxonomies for article #%d, updating with those read from XML file', 'pmxi_plugin'), $articleData['ID']));
                                 $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                             } else {
                                 $txes_new = array();
                                 if (!empty($txes_list)) {
                                     foreach ($txes_list as $t) {
                                         $txes_new[] = $t->slug;
                                     }
                                 }
                                 $existing_taxonomies[$tx_name][$i] = $txes_new;
                             }
                         }
                     } else {
                         //Remove existing taxonomies
                         foreach (array_keys($taxonomies) as $tx_name) {
                             wp_set_object_terms($articleData['ID'], NULL, $tx_name);
                         }
                     }
                     if (!$this->options['is_update_dates']) {
                         // preserve date of already existing article when duplicate is found
                         $articleData['post_date'] = $post_to_update->post_date;
                         $articleData['post_date_gmt'] = $post_to_update->post_date_gmt;
                     }
                     if (!$this->options['is_update_status']) {
                         // preserve status and trashed flag
                         $articleData['post_status'] = $post_to_update->post_status;
                     }
                     if (!$this->options['is_update_content']) {
                         $articleData['post_content'] = $post_to_update->post_content;
                     }
                     if (!$this->options['is_update_title']) {
                         $articleData['post_title'] = $post_to_update->post_title;
                     }
                     if (!$this->options['is_update_slug']) {
                         $articleData['post_name'] = $post_to_update->post_name;
                     }
                     if (!$this->options['is_update_excerpt']) {
                         $articleData['post_excerpt'] = $post_to_update->post_excerpt;
                     }
                     if (!$this->options['is_update_menu_order']) {
                         $articleData['menu_order'] = $post_to_update->menu_order;
                     }
                     if (!$this->options['is_update_parent']) {
                         $articleData['post_parent'] = $post_to_update->post_parent;
                     }
                 }
                 if ($this->options['update_all_data'] == 'yes' or $this->options['update_all_data'] == 'no' and $this->options['is_update_attachments']) {
                     wp_delete_attachments($articleData['ID'], true, 'files');
                 }
                 // handle obsolete attachments (i.e. delete or keep) according to import settings
                 if ($this->options['update_all_data'] == 'yes' or $this->options['update_all_data'] == 'no' and $this->options['is_update_images'] and $this->options['update_images_logic'] == "full_update") {
                     wp_delete_attachments($articleData['ID'], $this->options['download_images'], 'images');
                 }
             } elseif (!$postRecord->isEmpty()) {
                 // existing post not found though it's track was found... clear the leftover, plugin will continue to treat record as new
                 $postRecord->delete();
             }
             // no new records are created. it will only update posts it finds matching duplicates for
             if (!$this->options['create_new_records'] and empty($articleData['ID'])) {
                 if (!$postRecord->isEmpty()) {
                     $postRecord->set(array('iteration' => $this->iteration))->update();
                 }
                 $logger and call_user_func($logger, __('<b>SKIPPED</b>: by do not create new posts option.', 'pmxi_plugin'));
                 $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                 $logger and PMXI_Plugin::$session['pmxi_import']['chunk_number'] = ++PMXI_Plugin::$session->data['pmxi_import']['chunk_number'];
                 $skipped++;
                 pmxi_session_commit();
                 continue;
             }
             // cloak urls with `WP Wizard Cloak` if corresponding option is set
             if (!empty($this->options['is_cloak']) and class_exists('PMLC_Plugin')) {
                 if (preg_match_all('%<a\\s[^>]*href=(?(?=")"([^"]*)"|(?(?=\')\'([^\']*)\'|([^\\s>]*)))%is', $articleData['post_content'], $matches, PREG_PATTERN_ORDER)) {
                     $hrefs = array_unique(array_merge(array_filter($matches[1]), array_filter($matches[2]), array_filter($matches[3])));
                     foreach ($hrefs as $url) {
                         if (preg_match('%^\\w+://%i', $url)) {
                             // mask only links having protocol
                             // try to find matching cloaked link among already registered ones
                             $list = new PMLC_Link_List();
                             $linkTable = $list->getTable();
                             $rule = new PMLC_Rule_Record();
                             $ruleTable = $rule->getTable();
                             $dest = new PMLC_Destination_Record();
                             $destTable = $dest->getTable();
                             $list->join($ruleTable, "{$ruleTable}.link_id = {$linkTable}.id")->join($destTable, "{$destTable}.rule_id = {$ruleTable}.id")->setColumns("{$linkTable}.*")->getBy(array("{$linkTable}.destination_type =" => 'ONE_SET', "{$linkTable}.is_trashed =" => 0, "{$linkTable}.preset =" => '', "{$linkTable}.expire_on =" => '0000-00-00', "{$ruleTable}.type =" => 'ONE_SET', "{$destTable}.weight =" => 100, "{$destTable}.url LIKE" => $url), NULL, 1, 1)->convertRecords();
                             if ($list->count()) {
                                 // matching link found
                                 $link = $list[0];
                             } else {
                                 // register new cloaked link
                                 global $wpdb;
                                 $slug = max(intval($wpdb->get_var("SELECT MAX(CONVERT(name, SIGNED)) FROM {$linkTable}")), intval($wpdb->get_var("SELECT MAX(CONVERT(slug, SIGNED)) FROM {$linkTable}")), 0);
                                 $i = 0;
                                 do {
                                     is_int(++$slug) and $slug > 0 or $slug = 1;
                                     $is_slug_found = !intval($wpdb->get_var("SELECT COUNT(*) FROM {$linkTable} WHERE name = '{$slug}' OR slug = '{$slug}'"));
                                 } while (!$is_slug_found and $i++ < 100000);
                                 if ($is_slug_found) {
                                     $link = new PMLC_Link_Record(array('name' => strval($slug), 'slug' => strval($slug), 'header_tracking_code' => '', 'footer_tracking_code' => '', 'redirect_type' => '301', 'destination_type' => 'ONE_SET', 'preset' => '', 'forward_url_params' => 1, 'no_global_tracking_code' => 0, 'expire_on' => '0000-00-00', 'created_on' => date('Y-m-d H:i:s'), 'is_trashed' => 0));
                                     $link->insert();
                                     $rule = new PMLC_Rule_Record(array('link_id' => $link->id, 'type' => 'ONE_SET', 'rule' => ''));
                                     $rule->insert();
                                     $dest = new PMLC_Destination_Record(array('rule_id' => $rule->id, 'url' => $url, 'weight' => 100));
                                     $dest->insert();
                                 } else {
                                     $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Unable to create cloaked link for %s', 'pmxi_plugin'), $url));
                                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                     $link = NULL;
                                 }
                             }
                             if ($link) {
                                 // cloaked link is found or created for url
                                 $articleData['post_content'] = preg_replace('%' . preg_quote($url, '%') . '(?=([\\s\'"]|$))%i', $link->getUrl(), $articleData['post_content']);
                             }
                         }
                     }
                 }
             }
             // insert article being imported
             $pid = $this->options['is_fast_mode'] ? pmxi_insert_post($articleData, true) : wp_insert_post($articleData, true);
             if (is_wp_error($pid)) {
                 $logger and call_user_func($logger, __('<b>ERROR</b>', 'pmxi_plugin') . ': ' . $pid->get_error_message());
                 $logger and PMXI_Plugin::$session['pmxi_import']['errors'] = ++PMXI_Plugin::$session->data['pmxi_import']['errors'];
             } else {
                 if ("manual" != $this->options['duplicate_matching'] or empty($articleData['ID'])) {
                     // associate post with import
                     $postRecord->isEmpty() and $postRecord->set(array('post_id' => $pid, 'import_id' => $this->id, 'unique_key' => $unique_keys[$i], 'product_key' => ($post_type == "product" and PMXI_Admin_Addons::get_addon('PMWI_Plugin')) ? $addons_data['PMWI_Plugin']['single_product_ID'][$i] : ''))->insert();
                     $postRecord->set(array('iteration' => $this->iteration))->update();
                 }
                 // [post format]
                 if (current_theme_supports('post-formats') && post_type_supports($post_type, 'post-formats')) {
                     set_post_format($pid, $this->options['post_format']);
                 }
                 // [/post format]
                 // [custom fields]
                 if (empty($articleData['ID']) or $this->options['update_all_data'] == 'yes' or $this->options['update_all_data'] == 'no' and $this->options['is_update_custom_fields'] or $this->options['update_all_data'] == 'no' and $this->options['is_update_attributes']) {
                     // Delete all meta keys
                     if (!empty($articleData['ID'])) {
                         // Get all existing meta keys
                         $existing_meta_keys = array();
                         foreach (get_post_meta($pid, '') as $cur_meta_key => $cur_meta_val) {
                             $existing_meta_keys[] = $cur_meta_key;
                         }
                         // delete keys which are no longer correspond to import settings
                         foreach ($existing_meta_keys as $cur_meta_key) {
                             // Do not delete post meta for features image
                             if (in_array($cur_meta_key, array('_thumbnail_id', '_product_image_gallery'))) {
                                 continue;
                             }
                             $field_to_delete = true;
                             // apply addons filters
                             if (!apply_filters('pmxi_custom_field_to_delete', $field_to_delete, $pid, $post_type, $this->options, $cur_meta_key)) {
                                 continue;
                             }
                             // Update all Custom Fields is defined
                             if ($this->options['update_all_data'] == 'yes' or $this->options['update_all_data'] == 'no' and $this->options['is_update_custom_fields'] and $this->options['update_custom_fields_logic'] == "full_update") {
                                 delete_post_meta($pid, $cur_meta_key);
                             } elseif ($this->options['update_all_data'] == 'no' and $this->options['is_update_custom_fields'] and $this->options['update_custom_fields_logic'] == "only") {
                                 if (!empty($this->options['custom_fields_list']) and is_array($this->options['custom_fields_list']) and in_array($cur_meta_key, $this->options['custom_fields_list'])) {
                                     delete_post_meta($pid, $cur_meta_key);
                                 }
                             } elseif ($this->options['update_all_data'] == 'no' and $this->options['is_update_custom_fields'] and $this->options['update_custom_fields_logic'] == "all_except") {
                                 if (empty($this->options['custom_fields_list']) or !in_array($cur_meta_key, $this->options['custom_fields_list'])) {
                                     delete_post_meta($pid, $cur_meta_key);
                                 }
                             }
                         }
                     }
                     $encoded_meta = array();
                     foreach ($serialized_meta as $m_key => $values) {
                         if (!empty($articleData['ID'])) {
                             if ($this->options['update_all_data'] != 'yes') {
                                 $field_to_update = false;
                                 if ($this->options['is_update_custom_fields'] and $this->options['update_custom_fields_logic'] == "only" and !empty($this->options['custom_fields_list']) and is_array($this->options['custom_fields_list']) and in_array($m_key, $this->options['custom_fields_list'])) {
                                     $field_to_update = true;
                                 }
                                 if ($this->options['is_update_custom_fields'] and $this->options['update_custom_fields_logic'] == "all_except" and (empty($this->options['custom_fields_list']) or !in_array($m_key, $this->options['custom_fields_list']))) {
                                     $field_to_update = true;
                                 }
                                 if ($this->options['update_custom_fields_logic'] == "full_update") {
                                     $field_to_update = true;
                                 }
                                 // apply addons filters
                                 $field_to_update = apply_filters('pmxi_custom_field_to_update', $field_to_update, $post_type, $this->options, $m_key);
                                 if (!$field_to_update) {
                                     continue;
                                 }
                             }
                         }
                         update_post_meta($pid, $m_key, apply_filters('pmxi_custom_field', is_serialized($values[$i]) ? unserialize($values[$i]) : $values[$i], $this->id));
                         do_action('pmxi_update_post_meta', $pid, $m_key, is_serialized($values[$i]) ? unserialize($values[$i]) : $values[$i]);
                         // hook that was triggered after post meta data updated
                     }
                 }
                 // [/custom fields]
                 // [addons import]
                 // prepare data for import
                 $importData = array('pid' => $pid, 'i' => $i, 'import' => $this, 'articleData' => $articleData, 'xml' => $xml, 'is_cron' => $is_cron, 'logger' => $logger, 'xpath_prefix' => $xpath_prefix);
                 // deligate operation to addons
                 foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
                     if (class_exists($class)) {
                         if (method_exists($addons[$class], 'import')) {
                             $addons[$class]->import($importData);
                         }
                     } else {
                         $import_func = $class . '_import';
                         if (function_exists($import_func)) {
                             call_user_func($import_func, $importData, $addons_data[$class]);
                         }
                     }
                 }
                 // [/addons import]
                 // Page Template
                 if ('post' != $articleData['post_type'] and !empty($this->options['page_template'])) {
                     update_post_meta($pid, '_wp_page_template', $this->options['page_template']);
                 }
                 // [featured image]
                 if (!empty($uploads) and false === $uploads['error'] and !empty($featured_images[$i]) and (empty($articleData['ID']) or $this->options['update_all_data'] == "yes" or $this->options['update_all_data'] == "no" and $this->options['is_update_images'])) {
                     require_once ABSPATH . 'wp-admin/includes/image.php';
                     $success_images = false;
                     $gallery_attachment_ids = array();
                     $_pmxi_images = array();
                     $imgs = !empty($this->options['featured_delim']) ? str_getcsv($featured_images[$i], $this->options['featured_delim']) : explode("\n", $featured_images[$i]);
                     if (!empty($imgs)) {
                         if ($this->options['set_image_meta_data']) {
                             $img_titles = !empty($this->options['image_meta_title_delim']) ? str_getcsv($image_meta_titles[$i], $this->options['image_meta_title_delim']) : explode("\n", $image_meta_titles[$i]);
                             $img_captions = !empty($this->options['image_meta_caption_delim']) ? str_getcsv($image_meta_captions[$i], $this->options['image_meta_caption_delim']) : explode("\n", $image_meta_captions[$i]);
                             $img_alts = !empty($this->options['image_meta_alt_delim']) ? str_getcsv($image_meta_alts[$i], $this->options['image_meta_alt_delim']) : explode("\n", $image_meta_alts[$i]);
                             $img_descriptions = !empty($this->options['image_meta_description_delim']) ? str_getcsv($image_meta_descriptions[$i], $this->options['image_meta_description_delim']) : explode("\n", $image_meta_descriptions[$i]);
                         }
                         foreach ($imgs as $k => $img_url) {
                             if (empty($img_url)) {
                                 continue;
                             }
                             $url = str_replace(" ", "%20", trim($img_url));
                             $bn = preg_replace('/[\\?|&].*/', '', basename($url));
                             $img_ext = pmxi_getExtensionFromStr($url);
                             $default_extension = pmxi_getExtension($bn);
                             if ($img_ext == "") {
                                 $img_ext = pmxi_get_remote_image_ext($url);
                             }
                             // generate local file name
                             $image_name = urldecode(($this->options['auto_rename_images'] and "" != $auto_rename_images[$i]) ? sanitize_file_name($auto_rename_images[$i] . '_' . ($img_ext ? str_replace("." . $default_extension, "", $bn) : $bn)) : sanitize_file_name($img_ext ? str_replace("." . $default_extension, "", $bn) : $bn)) . ("" != $img_ext ? '.' . $img_ext : '');
                             // if wizard store image data to custom field
                             $create_image = false;
                             $download_image = true;
                             if (base64_decode($url, true) !== false) {
                                 $img = @imagecreatefromstring(base64_decode($url));
                                 if ($img) {
                                     $image_filename = md5(time()) . '.jpg';
                                     $image_filepath = $uploads['path'] . '/' . $image_filename;
                                     imagejpeg($img, $image_filepath);
                                     if (!($image_info = @getimagesize($image_filepath)) or !in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                                         $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'pmxi_plugin'), $image_filepath));
                                         $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                     } else {
                                         $create_image = true;
                                     }
                                 }
                             } else {
                                 $image_filename = wp_unique_filename($uploads['path'], $image_name);
                                 $image_filepath = $uploads['path'] . '/' . $image_filename;
                                 // keep existing and add newest images
                                 if (!empty($articleData['ID']) and $this->options['is_update_images'] and $this->options['update_images_logic'] == "add_new" and $this->options['update_all_data'] == "no") {
                                     $attachment_imgs = get_posts(array('post_type' => 'attachment', 'posts_per_page' => -1, 'post_parent' => $pid));
                                     if ($attachment_imgs) {
                                         foreach ($attachment_imgs as $attachment_img) {
                                             if ($attachment_img->guid == $uploads['url'] . '/' . $image_name) {
                                                 $download_image = false;
                                                 $success_images = true;
                                                 if (!has_post_thumbnail($pid)) {
                                                     set_post_thumbnail($pid, $attachment_img->ID);
                                                 } else {
                                                     $gallery_attachment_ids[] = $attachment_img->ID;
                                                 }
                                                 $logger and call_user_func($logger, sprintf(__('<b>Image SKIPPED</b>: The image %s is always exists for the %s', 'pmxi_plugin'), basename($attachment_img->guid), $articleData['post_title']));
                                             }
                                         }
                                     }
                                 }
                                 if ($download_image) {
                                     // do not download images
                                     if (!$this->options['download_images']) {
                                         $image_filename = $image_name;
                                         $image_filepath = $uploads['path'] . '/' . $image_filename;
                                         $existing_attachment = $this->wpdb->get_row($this->wpdb->prepare("SELECT * FROM " . $this->wpdb->prefix . "posts WHERE guid = '%s'", $uploads['url'] . '/' . $image_filename));
                                         if (!empty($existing_attachment->ID)) {
                                             $download_image = false;
                                             $create_image = false;
                                             if (!has_post_thumbnail($pid)) {
                                                 set_post_thumbnail($pid, $existing_attachment->ID);
                                             } else {
                                                 $gallery_attachment_ids[] = $existing_attachment->ID;
                                             }
                                             do_action('pmxi_gallery_image', $pid, $existing_attachment->ID, $image_filepath);
                                         } else {
                                             if (@file_exists($image_filepath)) {
                                                 $download_image = false;
                                                 if (!($image_info = @getimagesize($image_filepath)) or !in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                                                     $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'pmxi_plugin'), $image_filepath));
                                                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                                     @unlink($image_filepath);
                                                 } else {
                                                     $create_image = true;
                                                 }
                                             }
                                         }
                                     }
                                     if ($download_image) {
                                         $request = get_file_curl($url, $image_filepath);
                                         if ((is_wp_error($request) or $request === false) and !@file_put_contents($image_filepath, @file_get_contents($url))) {
                                             @unlink($image_filepath);
                                             // delete file since failed upload may result in empty file created
                                         } elseif ($image_info = @getimagesize($image_filepath) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                                             $create_image = true;
                                         }
                                         if (!$create_image) {
                                             $url = str_replace(" ", "%20", trim(pmxi_convert_encoding($img_url)));
                                             $request = get_file_curl($url, $image_filepath);
                                             if ((is_wp_error($request) or $request === false) and !@file_put_contents($image_filepath, @file_get_contents($url))) {
                                                 $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: File %s cannot be saved locally as %s', 'pmxi_plugin'), $url, $image_filepath));
                                                 $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                                 @unlink($image_filepath);
                                                 // delete file since failed upload may result in empty file created
                                             } elseif (!($image_info = @getimagesize($image_filepath)) or !in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                                                 $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'pmxi_plugin'), $url));
                                                 $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                                 @unlink($image_filepath);
                                             } else {
                                                 $create_image = true;
                                             }
                                         }
                                     }
                                 }
                             }
                             if ($create_image) {
                                 $attachment = array('post_mime_type' => image_type_to_mime_type($image_info[2]), 'guid' => $uploads['url'] . '/' . $image_filename, 'post_title' => $image_filename, 'post_content' => '', 'post_author' => $post_author[$i]);
                                 if ($image_meta = wp_read_image_metadata($image_filepath)) {
                                     if (trim($image_meta['title']) && !is_numeric(sanitize_title($image_meta['title']))) {
                                         $attachment['post_title'] = $image_meta['title'];
                                     }
                                     if (trim($image_meta['caption'])) {
                                         $attachment['post_content'] = $image_meta['caption'];
                                     }
                                 }
                                 $attid = $this->options['is_fast_mode'] ? pmxi_insert_attachment($attachment, $image_filepath, $pid) : wp_insert_attachment($attachment, $image_filepath, $pid);
                                 if (is_wp_error($attid)) {
                                     $logger and call_user_func($logger, __('<b>WARNING</b>', 'pmxi_plugin') . ': ' . $attid->get_error_message());
                                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                 } else {
                                     // you must first include the image.php file
                                     // for the function wp_generate_attachment_metadata() to work
                                     require_once ABSPATH . 'wp-admin/includes/image.php';
                                     wp_update_attachment_metadata($attid, wp_generate_attachment_metadata($attid, $image_filepath));
                                     if ($this->options['set_image_meta_data']) {
                                         $update_attachment_meta = array();
                                         if (!empty($img_titles[$k])) {
                                             $update_attachment_meta['post_title'] = $img_titles[$k];
                                         }
                                         if (!empty($img_captions[$k])) {
                                             $update_attachment_meta['post_excerpt'] = $img_captions[$k];
                                         }
                                         if (!empty($img_descriptions[$k])) {
                                             $update_attachment_meta['post_content'] = $img_descriptions[$k];
                                         }
                                         if (!empty($img_alts[$k])) {
                                             update_post_meta($attid, '_wp_attachment_image_alt', $img_alts[$k]);
                                         }
                                         if (!empty($update_attachment_meta)) {
                                             $this->wpdb->update($this->wpdb->posts, $update_attachment_meta, array('ID' => $attid));
                                         }
                                     }
                                     do_action('pmxi_gallery_image', $pid, $attid, $image_filepath);
                                     $success_images = true;
                                     if (!has_post_thumbnail($pid)) {
                                         set_post_thumbnail($pid, $attid);
                                     } else {
                                         $gallery_attachment_ids[] = $attid;
                                     }
                                 }
                             }
                         }
                     }
                     // Set product gallery images
                     if ($post_type == "product" and !empty($gallery_attachment_ids)) {
                         update_post_meta($pid, '_product_image_gallery', implode(',', $gallery_attachment_ids));
                     }
                     // Create entry as Draft if no images are downloaded successfully
                     if (!$success_images and "yes" == $this->options['create_draft']) {
                         $this->wpdb->update($this->wpdb->posts, array('post_status' => 'draft'), array('ID' => $pid));
                     }
                 }
                 // [/featured image]
                 // [attachments]
                 if (!empty($uploads) and false === $uploads['error'] and !empty($attachments[$i]) and (empty($articleData['ID']) or $this->options['update_all_data'] == "yes" or $this->options['update_all_data'] == "no" and $this->options['is_update_attachments'])) {
                     // you must first include the image.php file
                     // for the function wp_generate_attachment_metadata() to work
                     require_once ABSPATH . 'wp-admin/includes/image.php';
                     if (!is_array($attachments[$i])) {
                         $attachments[$i] = array($attachments[$i]);
                     }
                     foreach ($attachments[$i] as $attachment) {
                         if ("" == $attachment) {
                             continue;
                         }
                         $atchs = str_getcsv($attachment, $this->options['atch_delim']);
                         if (!empty($atchs)) {
                             foreach ($atchs as $atch_url) {
                                 if (empty($atch_url)) {
                                     continue;
                                 }
                                 $atch_url = str_replace(" ", "%20", trim($atch_url));
                                 $attachment_filename = wp_unique_filename($uploads['path'], urldecode(basename(parse_url(trim($atch_url), PHP_URL_PATH))));
                                 $attachment_filepath = $uploads['path'] . '/' . sanitize_file_name($attachment_filename);
                                 $request = get_file_curl(trim($atch_url), $attachment_filepath);
                                 if ((is_wp_error($request) or $request === false) and !@file_put_contents($attachment_filepath, @file_get_contents(trim($atch_url)))) {
                                     $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Attachment file %s cannot be saved locally as %s', 'pmxi_plugin'), trim($atch_url), $attachment_filepath));
                                     is_wp_error($request) and $logger and call_user_func($logger, sprintf(__('<b>WP Error</b>: %s', 'pmxi_plugin'), $request->get_error_message()));
                                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                     unlink($attachment_filepath);
                                     // delete file since failed upload may result in empty file created
                                 } elseif (!($wp_filetype = wp_check_filetype(basename($attachment_filename), null))) {
                                     $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Can\'t detect attachment file type %s', 'pmxi_plugin'), trim($atch_url)));
                                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                 } else {
                                     $attachment_data = array('guid' => $uploads['baseurl'] . '/' . _wp_relative_upload_path($attachment_filepath), 'post_mime_type' => $wp_filetype['type'], 'post_title' => preg_replace('/\\.[^.]+$/', '', basename($attachment_filepath)), 'post_content' => '', 'post_status' => 'inherit', 'post_author' => $post_author[$i]);
                                     $attach_id = $this->options['is_fast_mode'] ? pmxi_insert_attachment($attachment_data, $attachment_filepath, $pid) : wp_insert_attachment($attachment_data, $attachment_filepath, $pid);
                                     if (is_wp_error($attach_id)) {
                                         $logger and call_user_func($logger, __('<b>WARNING</b>', 'pmxi_plugin') . ': ' . $pid->get_error_message());
                                         $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                     } else {
                                         wp_update_attachment_metadata($attach_id, wp_generate_attachment_metadata($attach_id, $attachment_filepath));
                                         do_action('pmxi_attachment_uploaded', $pid, $attid, $image_filepath);
                                     }
                                 }
                             }
                         }
                     }
                 }
                 // [/attachments]
                 // [custom taxonomies]
                 if (!empty($taxonomies)) {
                     foreach ($taxonomies as $tx_name => $txes) {
                         // Skip updating product attributes
                         if (PMXI_Admin_Addons::get_addon('PMWI_Plugin') and strpos($tx_name, "pa_") === 0) {
                             continue;
                         }
                         if (empty($articleData['ID']) or $this->options['update_all_data'] == "yes" or $this->options['update_all_data'] == "no" and $this->options['is_update_categories']) {
                             if (!empty($articleData['ID'])) {
                                 if ($this->options['update_all_data'] == "no" and $this->options['update_categories_logic'] == "all_except" and !empty($this->options['taxonomies_list']) and is_array($this->options['taxonomies_list']) and in_array($tx_name, $this->options['taxonomies_list'])) {
                                     continue;
                                 }
                                 if ($this->options['update_all_data'] == "no" and $this->options['update_categories_logic'] == "only" and (!empty($this->options['taxonomies_list']) and is_array($this->options['taxonomies_list']) and !in_array($tx_name, $this->options['taxonomies_list']) or empty($this->options['taxonomies_list']))) {
                                     continue;
                                 }
                             }
                             $assign_taxes = array();
                             if ($this->options['update_categories_logic'] == "add_new" and !empty($existing_taxonomies[$tx_name][$i])) {
                                 $assign_taxes = $existing_taxonomies[$tx_name][$i];
                                 unset($existing_taxonomies[$tx_name][$i]);
                             } elseif (!empty($existing_taxonomies[$tx_name][$i])) {
                                 unset($existing_taxonomies[$tx_name][$i]);
                             }
                             // create term if not exists
                             if (!empty($txes[$i])) {
                                 foreach ($txes[$i] as $key => $single_tax) {
                                     if (is_array($single_tax)) {
                                         $parent_id = !empty($single_tax['parent']) ? pmxi_recursion_taxes($single_tax['parent'], $tx_name, $txes[$i], $key) : '';
                                         $term = is_exists_term($tx_name, $single_tax['name'], (int) $parent_id);
                                         if (empty($term) and !is_wp_error($term)) {
                                             $term_attr = array('parent' => !empty($parent_id) ? $parent_id : 0);
                                             $term = wp_insert_term($single_tax['name'], $tx_name, $term_attr);
                                         }
                                         if (is_wp_error($term)) {
                                             $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: `%s`', 'pmxi_plugin'), $term->get_error_message()));
                                             $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                         } elseif (!empty($term)) {
                                             $cat_id = $term['term_id'];
                                             if ($cat_id and $single_tax['assign']) {
                                                 $term = get_term_by('id', $cat_id, $tx_name);
                                                 if (!in_array($term->slug, $assign_taxes)) {
                                                     $assign_taxes[] = $term->slug;
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                             if (!empty($assign_taxes)) {
                                 // associate taxes with post
                                 $term_ids = wp_set_object_terms($pid, $assign_taxes, $tx_name);
                                 if (is_wp_error($term_ids)) {
                                     $logger and call_user_func($logger, __('<b>WARNING</b>', 'pmxi_plugin') . ': ' . $term_ids->get_error_message());
                                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                 }
                             }
                         }
                     }
                     if (!empty($existing_taxonomies) and $this->options['update_all_data'] == "no" and $this->options['is_update_categories'] and $this->options['update_categories_logic'] != 'full_update') {
                         foreach ($existing_taxonomies as $tx_name => $txes) {
                             // Skip updating product attributes
                             if (PMXI_Admin_Addons::get_addon('PMWI_Plugin') and strpos($tx_name, "pa_") === 0) {
                                 continue;
                             }
                             if (!empty($txes[$i])) {
                                 $term_ids = wp_set_object_terms($pid, $txes[$i], $tx_name);
                                 if (is_wp_error($term_ids)) {
                                     $logger and call_user_func($logger, __('<b>WARNING</b>', 'pmxi_plugin') . ': ' . $term_ids->get_error_message());
                                     $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                 }
                             }
                         }
                     }
                 }
                 // [/custom taxonomies]
                 // [categories]
                 if (!empty($cats[$i])) {
                     if (empty($articleData['ID']) or $this->options['update_all_data'] == "yes" or $this->options['update_all_data'] == "no" and $this->options['is_update_categories']) {
                         wp_set_object_terms($pid, NULL, 'category');
                         $is_update_cats = true;
                         if (!empty($articleData['ID'])) {
                             if ($this->options['update_all_data'] == "no" and $this->options['update_categories_logic'] == "all_except" and !empty($this->options['taxonomies_list']) and is_array($this->options['taxonomies_list']) and in_array('category', $this->options['taxonomies_list'])) {
                                 $is_update_cats = false;
                             }
                             if ($this->options['update_all_data'] == "no" and $this->options['update_categories_logic'] == "only" and (!empty($this->options['taxonomies_list']) and is_array($this->options['taxonomies_list']) and !in_array('category', $this->options['taxonomies_list']) or empty($this->options['taxonomies_list']))) {
                                 $is_update_cats = false;
                             }
                         }
                         if ($is_update_cats) {
                             $assign_cats = array();
                             if ($this->options['update_categories_logic'] == "add_new" and !empty($existing_cats[$i])) {
                                 $assign_cats = $existing_cats[$i];
                                 unset($existing_cats[$i]);
                             } elseif (!empty($existing_cats[$i])) {
                                 unset($existing_cats[$i]);
                             }
                             // create categories if it's doesn't exists
                             foreach ($cats[$i] as $key => $single_cat) {
                                 if (is_array($single_cat)) {
                                     $parent_id = !empty($single_cat['parent']) ? pmxi_recursion_taxes($single_cat['parent'], 'category', $cats[$i], $key) : '';
                                     $term = is_exists_term('category', $single_cat['name'], (int) $parent_id);
                                     if (empty($term) and !is_wp_error($term)) {
                                         $term = wp_insert_term($single_cat['name'], 'category', array('parent' => !empty($parent_id) ? (int) $parent_id : 0));
                                     }
                                     if (is_wp_error($term)) {
                                         $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: `%s`', 'pmxi_plugin'), $term->get_error_message()));
                                         $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                                     } elseif (!empty($term)) {
                                         $cat_id = $term['term_id'];
                                         if ($cat_id and $single_cat['assign']) {
                                             $term = get_term_by('id', $cat_id, 'category');
                                             if (!in_array($term->slug, $assign_cats)) {
                                                 $assign_cats[] = $term->slug;
                                             }
                                         }
                                     }
                                 }
                             }
                             // associate categories with post
                             $cats_ids = wp_set_object_terms($pid, $assign_cats, 'category');
                             if (is_wp_error($cats_ids)) {
                                 $logger and call_user_func($logger, __('<b>WARNING</b>', 'pmxi_plugin') . ': ' . $cats_ids->get_error_message());
                                 $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                             }
                         }
                     }
                 }
                 if (!empty($existing_cats[$i]) and $this->options['update_all_data'] == "no" and (!$this->options['is_update_categories'] or $this->options['is_update_categories'] and $this->options['update_categories_logic'] != 'full_update')) {
                     $cats_ids = wp_set_object_terms($pid, $existing_cats[$i], 'category');
                     if (is_wp_error($cats_ids)) {
                         $logger and call_user_func($logger, __('<b>WARNING</b>', 'pmxi_plugin') . ': ' . $cats_ids->get_error_message());
                         $logger and PMXI_Plugin::$session['pmxi_import']['warnings'] = ++PMXI_Plugin::$session->data['pmxi_import']['warnings'];
                     }
                 }
                 // [/categories]
                 if (empty($articleData['ID'])) {
                     $logger and call_user_func($logger, sprintf(__('`%s` post created successfully', 'pmxi_plugin'), $articleData['post_title']));
                 } else {
                     $logger and call_user_func($logger, sprintf(__('`%s` post updated successfully', 'pmxi_plugin'), $articleData['post_title']));
                 }
                 // [addons import]
                 // prepare data for import
                 $importData = array('pid' => $pid, 'import' => $this, 'logger' => $logger);
                 // deligate operation to addons
                 foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
                     if (class_exists($class)) {
                         if (method_exists($addons[$class], 'saved_post')) {
                             $addons[$class]->saved_post($importData);
                         }
                     } else {
                         $saved_func = $class . '_saved_post';
                         if (function_exists($saved_func)) {
                             call_user_func($saved_func, $importData);
                         }
                     }
                 }
                 // [/addons import]
                 do_action('pmxi_saved_post', $pid);
                 // hook that was triggered immediately after post saved
                 if (empty($articleData['ID'])) {
                     $created++;
                 } else {
                     $updated++;
                 }
                 if (!$is_cron and "default" == $this->options['import_processing']) {
                     $processed_records = $created + $updated + $skipped + PMXI_Plugin::$session->data['pmxi_import']['errors'];
                     $logger and call_user_func($logger, sprintf(__('<span class="processing_info"><span class="created_count">%s</span><span class="updated_count">%s</span><span class="percents_count">%s</span></span>', 'pmxi_plugin'), $created, $updated, ceil($processed_records / $this->count * 100)));
                 }
             }
             do_action('pmxi_after_post_import', $this->id);
             $logger and PMXI_Plugin::$session['pmxi_import']['chunk_number'] = ++PMXI_Plugin::$session->data['pmxi_import']['chunk_number'];
         }
         wp_cache_flush();
         $this->set(array('imported' => $created + $updated, 'created' => $created, 'updated' => $updated, 'skipped' => $skipped, 'queue_chunk_number' => $created + $updated + $skipped))->update();
         if (!$is_cron) {
             pmxi_session_commit();
             $records_count = $this->created + $this->updated + $this->skipped + PMXI_Plugin::$session->data['pmxi_import']['errors'];
             $is_import_complete = $records_count == $this->count;
             // Delete posts that are no longer present in your file
             if ($is_import_complete and !empty($this->options['is_delete_missing']) and $this->options['duplicate_matching'] == 'auto') {
                 $logger and call_user_func($logger, 'Removing previously imported posts which are no longer actual...');
                 $postList = new PMXI_Post_List();
                 $missing_ids = array();
                 $missingPosts = $postList->getBy(array('import_id' => $this->id, 'iteration !=' => $this->iteration));
                 if (!$missingPosts->isEmpty()) {
                     foreach ($missingPosts as $missingPost) {
                         $missing_ids[] = $missingPost['post_id'];
                         // Instead of deletion, set Custom Field
                         if ($this->options['is_update_missing_cf']) {
                             update_post_meta($missingPost['post_id'], $this->options['update_missing_cf_name'], $this->options['update_missing_cf_value']);
                         }
                         // Instead of deletion, change post status to Draft
                         if ($this->options['set_missing_to_draft']) {
                             $this->wpdb->update($this->wpdb->posts, array('post_status' => 'draft'), array('ID' => $missingPost['post_id']));
                         }
                         // Delete posts that are no longer present in your file
                         if (!$this->options['is_update_missing_cf'] and !$this->options['set_missing_to_draft']) {
                             // Remove attachments
                             empty($this->options['is_keep_attachments']) and wp_delete_attachments($missingPost['post_id'], true, 'files');
                             // Remove images
                             empty($this->options['is_keep_imgs']) and wp_delete_attachments($missingPost['post_id'], $this->options['download_images']);
                             if (!empty($missingPost['id'])) {
                                 // Delete record form pmxi_posts
                                 $missingRecord = new PMXI_Post_Record();
                                 $missingRecord->getById($missingPost['id'])->delete();
                             } else {
                                 $sql = "DELETE FROM " . PMXI_Plugin::getInstance()->getTablePrefix() . "posts WHERE post_id = " . $missingPost['post_id'] . " AND import_id = " . $missingPost['import_id'];
                                 $this->wpdb->query($this->wpdb->prepare($sql, ''));
                             }
                             // Clear post's relationships
                             wp_delete_object_term_relationships($missingPost['post_id'], get_object_taxonomies('' != $this->options['custom_type'] ? $this->options['custom_type'] : 'post'));
                         }
                     }
                 }
                 // Delete posts from database
                 if (!empty($missing_ids) && is_array($missing_ids) and !$this->options['is_update_missing_cf'] and !$this->options['set_missing_to_draft']) {
                     $sql = "delete a,b,c\n\t\t\t\t\t\tFROM " . $this->wpdb->posts . " a\n\t\t\t\t\t\tLEFT JOIN " . $this->wpdb->term_relationships . " b ON ( a.ID = b.object_id )\n\t\t\t\t\t\tLEFT JOIN " . $this->wpdb->postmeta . " c ON ( a.ID = c.post_id )\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\tWHERE a.ID IN (" . implode(',', $missing_ids) . ")";
                     $this->wpdb->query($this->wpdb->prepare($sql, ''));
                     do_action('pmxi_delete_post', $missing_ids);
                 }
             }
             // Set out of stock status for missing records [Woocommerce add-on option]
             if ($is_import_complete and empty($this->options['is_delete_missing']) and $post_type == "product" and class_exists('PMWI_Plugin') and !empty($this->options['missing_records_stock_status'])) {
                 $logger and call_user_func($logger, 'Update stock status previously imported posts which are no longer actual...');
                 $postList = new PMXI_Post_List();
                 $missingPosts = $postList->getBy(array('import_id' => $this->id, 'iteration !=' => $this->iteration));
                 if (!$missingPosts->isEmpty()) {
                     foreach ($missingPosts as $missingPost) {
                         update_post_meta($missingPost['post_id'], '_stock_status', 'outofstock');
                         update_post_meta($missingPost['post_id'], '_stock', 0);
                     }
                 }
             }
         }
     } catch (XmlImportException $e) {
         $logger and call_user_func($logger, __('<b>ERROR</b>', 'pmxi_plugin') . ': ' . $e->getMessage());
         $logger and PMXI_Plugin::$session['pmxi_import']['errors'] = ++PMXI_Plugin::$session->data['pmxi_import']['errors'];
     }
     $logger and $is_import_complete and call_user_func($logger, __('Cleaning temporary data...', 'pmxi_plugin'));
     foreach ($tmp_files as $file) {
         // remove all temporary files created
         @unlink($file);
     }
     if (($is_cron or $is_import_complete) and $this->options['is_delete_source']) {
         $logger and call_user_func($logger, __('Deleting source XML file...', 'pmxi_plugin'));
         // Delete chunks
         foreach (PMXI_Helper::safe_glob($uploads['path'] . '/pmxi_chunk_*', PMXI_Helper::GLOB_RECURSE | PMXI_Helper::GLOB_PATH) as $filePath) {
             @file_exists($filePath) and @unlink($filePath);
         }
         if ($this->type != "ftp") {
             if (!@unlink($this->path)) {
                 $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Unable to remove %s', 'pmxi_plugin'), $this->path));
             }
         } else {
             $file_path_array = PMXI_Helper::safe_glob($this->path, PMXI_Helper::GLOB_NODIR | PMXI_Helper::GLOB_PATH);
             if (!empty($file_path_array)) {
                 foreach ($file_path_array as $path) {
                     if (!@unlink($path)) {
                         $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Unable to remove %s', 'pmxi_plugin'), $path));
                     }
                 }
             }
         }
     }
     if (!$is_cron and $is_import_complete) {
         $this->set(array('processing' => 0, 'triggered' => 0, 'queue_chunk_number' => 0, 'registered_on' => date('Y-m-d H:i:s'), 'iteration' => ++$this->iteration))->update();
         $logger and call_user_func($logger, 'Done');
     }
     remove_filter('user_has_cap', array($this, '_filter_has_cap_unfiltered_html'));
     kses_init();
     // return any filtering rules back if they has been disabled for import procedure
     return $this;
 }
 function make_simple_product($post_parent)
 {
     if (empty($this->articleData['ID']) or $this->import->options['is_update_product_type']) {
         $product_type_term = is_exists_term('simple', 'product_type', 0);
         if (!empty($product_type_term) and !is_wp_error($product_type_term)) {
             $this->associate_terms($post_parent, array((int) $product_type_term['term_taxonomy_id']), 'product_type');
         }
         $this->pmwi_update_prices($post_parent);
     }
 }
 public function import($importData = array())
 {
     extract($importData);
     if (!in_array($importData['post_type'], array('product', 'product_variation'))) {
         return;
     }
     $cxpath = $xpath_prefix . $import->xpath;
     global $woocommerce;
     extract($this->data);
     $is_new_product = empty($articleData['ID']);
     // Get types
     $product_type = 'simple';
     if ($this->options['update_all_data'] == 'no' and !$this->options['is_update_product_type'] and !$is_new_product) {
         $product = get_product($pid);
         if (!empty($product->product_type)) {
             $product_type = $product->product_type;
         }
     }
     $this->existing_meta_keys = array();
     foreach (get_post_meta($pid, '') as $cur_meta_key => $cur_meta_val) {
         $this->existing_meta_keys[] = $cur_meta_key;
     }
     $this->post_meta_to_update = array();
     // for bulk UPDATE SQL query
     $this->post_meta_to_insert = array();
     // for bulk INSERT SQL query
     $this->articleData = $articleData;
     $total_sales = get_post_meta($pid, 'total_sales', true);
     if (empty($total_sales)) {
         update_post_meta($pid, 'total_sales', '0');
     }
     $is_downloadable = $product_downloadable[$i];
     $is_virtual = $product_virtual[$i];
     $is_featured = $product_featured[$i];
     // Product type + Downloadable/Virtual
     if ($is_new_product or $this->options['update_all_data'] == 'yes' or $this->options['update_all_data'] == 'no' and $this->options['is_update_product_type']) {
         $product_type_term = is_exists_term($product_type, 'product_type', 0);
         if (!empty($product_type_term) and !is_wp_error($product_type_term)) {
             $this->associate_terms($pid, array((int) $product_type_term['term_taxonomy_id']), 'product_type');
         }
     }
     if (!$is_new_product) {
         delete_post_meta($pid, '_is_first_variation_created');
     }
     $this->pushmeta($pid, '_downloadable', $is_downloadable == "yes" ? 'yes' : 'no');
     $this->pushmeta($pid, '_virtual', $is_virtual == "yes" ? 'yes' : 'no');
     // Update post meta
     $this->pushmeta($pid, '_regular_price', $product_regular_price[$i] == "" ? '' : stripslashes($product_regular_price[$i]));
     $this->pushmeta($pid, '_sale_price', $product_sale_price[$i] == "" ? '' : stripslashes($product_sale_price[$i]));
     $this->pushmeta($pid, '_tax_status', stripslashes($product_tax_status[$i]));
     $this->pushmeta($pid, '_tax_class', stripslashes($product_tax_class[$i]));
     $this->pushmeta($pid, '_visibility', stripslashes($product_visibility[$i]));
     $this->pushmeta($pid, '_purchase_note', stripslashes($product_purchase_note[$i]));
     $this->pushmeta($pid, '_featured', $is_featured == "yes" ? 'yes' : 'no');
     // Dimensions
     if ($is_virtual == 'no') {
         $this->pushmeta($pid, '_weight', stripslashes($product_weight[$i]));
         $this->pushmeta($pid, '_length', stripslashes($product_length[$i]));
         $this->pushmeta($pid, '_width', stripslashes($product_width[$i]));
         $this->pushmeta($pid, '_height', stripslashes($product_height[$i]));
     } else {
         $this->pushmeta($pid, '_weight', '');
         $this->pushmeta($pid, '_length', '');
         $this->pushmeta($pid, '_width', '');
         $this->pushmeta($pid, '_height', '');
     }
     if ($is_new_product or $this->is_update_data_allowed('is_update_comment_status')) {
         $this->wpdb->update($this->wpdb->posts, array('comment_status' => $product_enable_reviews[$i] == 'yes' ? 'open' : 'closed'), array('ID' => $pid));
     }
     if ($is_new_product or $this->is_update_data_allowed('is_update_menu_order')) {
         $this->wpdb->update($this->wpdb->posts, array('menu_order' => $product_menu_order[$i] != '' ? (int) $product_menu_order[$i] : 0), array('ID' => $pid));
     }
     // Save shipping class
     if (pmwi_is_update_taxonomy($articleData, $this->options, 'product_shipping_class')) {
         $p_shipping_class = $product_type != 'external' ? $product_shipping_class[$i] : '';
         if ($p_shipping_class != '') {
             if ((int) $product_shipping_class[$i] !== 0) {
                 if ((int) $product_shipping_class[$i] > 0) {
                     $t_shipping_class = get_term_by('slug', $p_shipping_class, 'product_shipping_class');
                     // For compatibility with WPML plugin
                     $t_shipping_class = apply_filters('wp_all_import_term_exists', $t_shipping_class, 'product_shipping_class', $p_shipping_class, null);
                     if (!empty($t_shipping_class) and !is_wp_error($t_shipping_class)) {
                         $p_shipping_class = (int) $t_shipping_class->term_taxonomy_id;
                     } else {
                         $t_shipping_class = is_exists_term((int) $p_shipping_class, 'product_shipping_class', 0);
                         if (!empty($t_shipping_class) and !is_wp_error($t_shipping_class)) {
                             $p_shipping_class = (int) $t_shipping_class['term_taxonomy_id'];
                         } else {
                             $t_shipping_class = wp_insert_term($p_shipping_class, 'product_shipping_class');
                             if (!empty($t_shipping_class) and !is_wp_error($t_shipping_class)) {
                                 $p_shipping_class = (int) $t_shipping_class['term_taxonomy_id'];
                             }
                         }
                     }
                 } else {
                     $p_shipping_class = '';
                 }
             } else {
                 $t_shipping_class = is_exists_term($product_shipping_class[$i], 'product_shipping_class', 0);
                 if (!empty($t_shipping_class) and !is_wp_error($t_shipping_class)) {
                     $p_shipping_class = (int) $t_shipping_class['term_taxonomy_id'];
                 } else {
                     $t_shipping_class = is_exists_term(htmlspecialchars(strtolower($product_shipping_class[$i])), 'product_shipping_class', 0);
                     if (!empty($t_shipping_class) and !is_wp_error($t_shipping_class)) {
                         $p_shipping_class = (int) $t_shipping_class['term_taxonomy_id'];
                     } else {
                         $t_shipping_class = wp_insert_term($product_shipping_class[$i], 'product_shipping_class');
                         if (!empty($t_shipping_class) and !is_wp_error($t_shipping_class)) {
                             $p_shipping_class = (int) $t_shipping_class['term_taxonomy_id'];
                         }
                     }
                 }
             }
         }
         if ($p_shipping_class !== false and !is_wp_error($p_shipping_class)) {
             $this->associate_terms($pid, array($p_shipping_class), 'product_shipping_class');
         }
     }
     // Unique SKU
     $sku = $is_new_product ? '' : get_post_meta($pid, '_sku', true);
     $new_sku = wc_clean(trim(stripslashes($product_sku[$i])));
     if ($new_sku == '' and $this->options['disable_auto_sku_generation']) {
         $this->pushmeta($pid, '_sku', '');
     } elseif ($new_sku == '' and !$this->options['disable_auto_sku_generation']) {
         if ($is_new_product or $this->is_update_cf('_sku')) {
             $unique_keys = XmlImportParser::factory($xml, $cxpath, $this->options['unique_key'], $file)->parse();
             $tmp_files[] = $file;
             foreach ($tmp_files as $file) {
                 // remove all temporary files created
                 @unlink($file);
             }
             $new_sku = substr(md5($unique_keys[$i]), 0, 12);
         }
     }
     if ($new_sku != '' and $new_sku !== $sku) {
         if (!empty($new_sku)) {
             if (!$this->options['disable_sku_matching'] and $this->wpdb->get_var($this->wpdb->prepare("\n\t\t\t\t\t\tSELECT " . $this->wpdb->posts . ".ID\n\t\t\t\t\t    FROM " . $this->wpdb->posts . "\n\t\t\t\t\t    LEFT JOIN " . $this->wpdb->postmeta . " ON (" . $this->wpdb->posts . ".ID = " . $this->wpdb->postmeta . ".post_id)\n\t\t\t\t\t    WHERE " . $this->wpdb->posts . ".post_type = 'product'\n\t\t\t\t\t    AND " . $this->wpdb->posts . ".post_status = 'publish'\n\t\t\t\t\t    AND " . $this->wpdb->postmeta . ".meta_key = '_sku' AND " . $this->wpdb->postmeta . ".meta_value = '%s'\n\t\t\t\t\t ", $new_sku))) {
                 $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Product SKU must be unique.', 'wpai_woocommerce_addon_plugin')));
             } else {
                 $this->pushmeta($pid, '_sku', $new_sku);
             }
         } else {
             $this->pushmeta($pid, '_sku', '');
         }
     }
     $this->pushmeta($pid, '_variation_description', wp_kses_post($product_variation_description[$i]));
     // Save Attributes
     $attributes = array();
     $is_variation_attributes_defined = false;
     if ($this->options['update_all_data'] == "yes" or $this->options['update_all_data'] == "no" and $this->options['is_update_attributes'] or $is_new_product) {
         // Update Product Attributes
         $is_update_attributes = true;
         if (!empty($serialized_attributes)) {
             $attribute_position = 0;
             $attr_names = array();
             foreach ($serialized_attributes as $anum => $attr_data) {
                 $attr_name = $attr_data['names'][$i];
                 // if ( in_array( $attr_name, $this->reserved_terms ) ) {
                 // 	$attr_name .= 's';
                 // }
                 if (empty($attr_name) or in_array($attr_name, $attr_names)) {
                     continue;
                 }
                 $attr_names[] = $attr_name;
                 $is_visible = intval($attr_data['is_visible'][$i]);
                 $is_variation = intval($attr_data['in_variation'][$i]);
                 $is_taxonomy = intval($attr_data['in_taxonomy'][$i]);
                 if ($is_variation and $attr_data['value'][$i] != "") {
                     $is_variation_attributes_defined = true;
                 }
                 // Update only these Attributes, leave the rest alone
                 if (!$is_new_product and $this->options['update_all_data'] == "no" and $this->options['is_update_attributes'] and $this->options['update_attributes_logic'] == 'only') {
                     if (!empty($this->options['attributes_list']) and is_array($this->options['attributes_list'])) {
                         if (!in_array($is_taxonomy ? wc_attribute_taxonomy_name($attr_name) : $attr_name, array_filter($this->options['attributes_list'], 'trim'))) {
                             $attribute_position++;
                             continue;
                         }
                     } else {
                         $is_update_attributes = false;
                         break;
                     }
                 }
                 // Leave these attributes alone, update all other Attributes
                 if (!$is_new_product and $this->options['update_all_data'] == "no" and $this->options['is_update_attributes'] and $this->options['update_attributes_logic'] == 'all_except') {
                     if (!empty($this->options['attributes_list']) and is_array($this->options['attributes_list'])) {
                         if (in_array($is_taxonomy ? wc_attribute_taxonomy_name($attr_name) : $attr_name, array_filter($this->options['attributes_list'], 'trim'))) {
                             $attribute_position++;
                             continue;
                         }
                     }
                 }
                 if ($is_taxonomy) {
                     if (isset($attr_data['value'][$i])) {
                         $values = array_map('stripslashes', array_map('strip_tags', explode('|', $attr_data['value'][$i])));
                         // Remove empty items in the array
                         $values = array_filter($values, array($this, "filtering"));
                         if (intval($attr_data['is_create_taxonomy_terms'][$i])) {
                             $this->create_taxonomy($attr_name, $logger);
                         }
                         if (!empty($values) and taxonomy_exists(wc_attribute_taxonomy_name($attr_name))) {
                             $attr_values = array();
                             foreach ($values as $key => $val) {
                                 $value = substr($val, 0, 199);
                                 $term = get_term_by('name', $value, wc_attribute_taxonomy_name($attr_name), ARRAY_A);
                                 // For compatibility with WPML plugin
                                 $term = apply_filters('wp_all_import_term_exists', $term, wc_attribute_taxonomy_name($attr_name), $value, null);
                                 if (empty($term) and !is_wp_error($term)) {
                                     $term = is_exists_term($value, wc_attribute_taxonomy_name($attr_name));
                                     if (empty($term) and !is_wp_error($term)) {
                                         $term = is_exists_term(htmlspecialchars($value), wc_attribute_taxonomy_name($attr_name));
                                         if (empty($term) and !is_wp_error($term) and intval($attr_data['is_create_taxonomy_terms'][$i])) {
                                             $term = wp_insert_term($value, wc_attribute_taxonomy_name($attr_name));
                                         }
                                     }
                                 }
                                 if (!is_wp_error($term)) {
                                     $attr_values[] = (int) $term['term_taxonomy_id'];
                                 }
                             }
                             $values = $attr_values;
                             $values = array_map('intval', $values);
                             $values = array_unique($values);
                         } else {
                             $values = array();
                         }
                     }
                     // Update post terms
                     if (taxonomy_exists(wc_attribute_taxonomy_name($attr_name))) {
                         $this->associate_terms($pid, $values, wc_attribute_taxonomy_name($attr_name));
                     }
                     if (!empty($values)) {
                         // Add attribute to array, but don't set values
                         $attributes[sanitize_title(wc_attribute_taxonomy_name($attr_name))] = array('name' => wc_attribute_taxonomy_name($attr_name), 'value' => '', 'position' => $attribute_position, 'is_visible' => $is_visible, 'is_variation' => $is_variation, 'is_taxonomy' => 1, 'is_create_taxonomy_terms' => !empty($attr_data['is_create_taxonomy_terms'][$i]) ? 1 : 0);
                     }
                 } else {
                     if (taxonomy_exists(wc_attribute_taxonomy_name($attr_name))) {
                         //wp_set_object_terms( $pid, NULL, wc_attribute_taxonomy_name( $attr_name ) );
                         $this->associate_terms($pid, NULL, wc_attribute_taxonomy_name($attr_name));
                     }
                     if (!empty($attr_data['value'][$i])) {
                         // Custom attribute - Add attribute to array and set the values
                         $attributes[sanitize_title($attr_name)] = array('name' => sanitize_text_field($attr_name), 'value' => $attr_data['value'][$i], 'position' => $attribute_position, 'is_visible' => $is_visible, 'is_variation' => $is_variation, 'is_taxonomy' => 0);
                     }
                 }
                 $attribute_position++;
             }
         }
         if ($is_new_product or $is_update_attributes) {
             $current_product_attributes = get_post_meta($pid, '_product_attributes', true);
             update_post_meta($pid, '_product_attributes', !empty($current_product_attributes) ? array_merge($current_product_attributes, $attributes) : $attributes);
         }
     } else {
         $is_variation_attributes_defined = true;
     }
     // is update attributes
     // Sales and prices
     if (!in_array($product_type, array('grouped'))) {
         $date_from = isset($product_sale_price_dates_from[$i]) ? $product_sale_price_dates_from[$i] : '';
         $date_to = isset($product_sale_price_dates_to[$i]) ? $product_sale_price_dates_to[$i] : '';
         // Dates
         if ($date_from) {
             $this->pushmeta($pid, '_sale_price_dates_from', strtotime($date_from));
         } else {
             $this->pushmeta($pid, '_sale_price_dates_from', '');
         }
         if ($date_to) {
             $this->pushmeta($pid, '_sale_price_dates_to', strtotime($date_to));
         } else {
             $this->pushmeta($pid, '_sale_price_dates_to', '');
         }
         if ($date_to && !$date_from) {
             $this->pushmeta($pid, '_sale_price_dates_from', strtotime('NOW', current_time('timestamp')));
         }
         // Update price if on sale
         if (!empty($this->articleData['ID']) and !$this->is_update_cf('_sale_price')) {
             $product_sale_price[$i] = get_post_meta($pid, '_sale_price', true);
         }
         if ($product_sale_price[$i] != '' && $date_to == '' && $date_from == '') {
             $this->pushmeta($pid, '_price', empty($product_sale_price[$i]) ? '' : stripslashes($product_sale_price[$i]));
         } else {
             $this->pushmeta($pid, '_price', $product_regular_price[$i] == "" ? '' : stripslashes($product_regular_price[$i]));
         }
         if ($product_sale_price[$i] != '' && $date_from && strtotime($date_from) < strtotime('NOW', current_time('timestamp'))) {
             $this->pushmeta($pid, '_price', empty($product_sale_price[$i]) ? '' : stripslashes($product_sale_price[$i]));
         }
         if ($date_to && strtotime($date_to) < strtotime('NOW', current_time('timestamp'))) {
             $this->pushmeta($pid, '_price', $product_regular_price[$i] == "" ? '' : stripslashes($product_regular_price[$i]));
             $this->pushmeta($pid, '_sale_price_dates_from', '');
             $this->pushmeta($pid, '_sale_price_dates_to', '');
         }
     }
     if (in_array($product_type, array('simple', 'external'))) {
         if ($this->options['is_multiple_grouping_product'] != 'yes') {
             if ($this->options['grouping_indicator'] == 'xpath' and !is_numeric($product_grouping_parent[$i])) {
                 $dpost = pmxi_findDuplicates(array('post_type' => 'product', 'ID' => $pid, 'post_parent' => $articleData['post_parent'], 'post_title' => $product_grouping_parent[$i]));
                 if (!empty($dpost)) {
                     $product_grouping_parent[$i] = $dpost[0];
                 } else {
                     $product_grouping_parent[$i] = 0;
                 }
             } elseif ($this->options['grouping_indicator'] != 'xpath') {
                 $dpost = pmxi_findDuplicates($articleData, $custom_grouping_indicator_name[$i], $custom_grouping_indicator_value[$i], 'custom field');
                 if (!empty($dpost)) {
                     $product_grouping_parent[$i] = array_shift($dpost);
                 } else {
                     $product_grouping_parent[$i] = 0;
                 }
             }
         }
         if ("" != $product_grouping_parent[$i] and absint($product_grouping_parent[$i]) > 0) {
             $this->wpdb->update($this->wpdb->posts, array('post_parent' => absint($product_grouping_parent[$i])), array('ID' => $pid));
         }
     }
     // Update parent if grouped so price sorting works and stays in sync with the cheapest child
     if ($product_type == 'grouped' || ("" != $product_grouping_parent[$i] and absint($product_grouping_parent[$i]) > 0)) {
         $clear_parent_ids = array();
         if ($product_type == 'grouped') {
             $clear_parent_ids[] = $pid;
         }
         if ("" != $product_grouping_parent[$i] and absint($product_grouping_parent[$i]) > 0) {
             $clear_parent_ids[] = absint($product_grouping_parent[$i]);
         }
         if ($clear_parent_ids) {
             foreach ($clear_parent_ids as $clear_id) {
                 $children_by_price = get_posts(array('post_parent' => $clear_id, 'orderby' => 'meta_value_num', 'order' => 'asc', 'meta_key' => '_price', 'posts_per_page' => 1, 'post_type' => 'product', 'fields' => 'ids'));
                 if ($children_by_price) {
                     foreach ($children_by_price as $child) {
                         $child_price = get_post_meta($child, '_price', true);
                         update_post_meta($clear_id, '_price', $child_price);
                     }
                 }
                 // Clear cache/transients
                 //wc_delete_product_transients( $clear_id );
             }
         }
     }
     // Sold Individuall
     if ("yes" == $product_sold_individually[$i]) {
         $this->pushmeta($pid, '_sold_individually', 'yes');
     } else {
         $this->pushmeta($pid, '_sold_individually', '');
     }
     // Stock Data
     if ('yes' === get_option('woocommerce_manage_stock')) {
         $manage_stock = 'no';
         $backorders = 'no';
         $stock_status = wc_clean($product_stock_status[$i]);
         if ('external' === $product_type) {
             $stock_status = 'instock';
         } elseif ('variable' === $product_type and !$this->options['link_all_variations']) {
             // Stock status is always determined by children so sync later
             // $stock_status = '';
             if ($product_manage_stock[$i] == 'yes') {
                 $manage_stock = 'yes';
                 $backorders = wc_clean($product_allow_backorders[$i]);
             }
         } elseif ('grouped' !== $product_type && $product_manage_stock[$i] == 'yes') {
             $manage_stock = 'yes';
             $backorders = wc_clean($product_allow_backorders[$i]);
         }
         $this->pushmeta($pid, '_manage_stock', $manage_stock);
         $this->pushmeta($pid, '_backorders', $backorders);
         if ($stock_status) {
             $this->pushmeta($pid, '_stock_status', $stock_status);
         }
         $current_manage_stock = get_post_meta($pid, '_manage_stock', true);
         if ($product_manage_stock[$i] == 'yes' || !$this->is_update_cf('_manage_stock') && $current_manage_stock == 'yes') {
             $this->pushmeta($pid, '_stock', wc_stock_amount($product_stock_qty[$i]));
         } else {
             $this->pushmeta($pid, '_stock', '');
         }
     } else {
         update_post_meta($pid, '_stock_status', wc_clean($product_stock_status[$i]));
     }
     // Upsells
     $this->import_linked_products($pid, $product_up_sells[$i], '_upsell_ids', $is_new_product, $logger, $import->id);
     // Cross sells
     $this->import_linked_products($pid, $product_cross_sells[$i], '_crosssell_ids', $is_new_product, $logger, $import->id);
     // Downloadable options
     if ($is_downloadable == 'yes') {
         $_download_limit = absint($product_download_limit[$i]);
         if (!$_download_limit) {
             $_download_limit = '';
         }
         // 0 or blank = unlimited
         $_download_expiry = absint($product_download_expiry[$i]);
         if (!$_download_expiry) {
             $_download_expiry = '';
         }
         // 0 or blank = unlimited
         // file paths will be stored in an array keyed off md5(file path)
         if (!empty($product_files[$i])) {
             $_file_paths = array();
             $file_paths = explode($this->options['product_files_delim'], $product_files[$i]);
             $file_names = explode($this->options['product_files_names_delim'], $product_files_names[$i]);
             foreach ($file_paths as $fn => $file_path) {
                 $file_path = trim($file_path);
                 $_file_paths[md5($file_path)] = array('name' => !empty($file_names[$fn]) ? $file_names[$fn] : basename($file_path), 'file' => $file_path);
             }
             $this->pushmeta($pid, '_downloadable_files', $_file_paths);
         }
         if (isset($product_download_limit[$i])) {
             $this->pushmeta($pid, '_download_limit', esc_attr($_download_limit));
         }
         if (isset($product_download_expiry[$i])) {
             $this->pushmeta($pid, '_download_expiry', esc_attr($_download_expiry));
         }
         if (isset($product_download_type[$i])) {
             $this->pushmeta($pid, '_download_type', esc_attr($product_download_type[$i]));
         }
     }
     // prepare bulk SQL query
     //$this->executeSQL();
     wc_delete_product_transients($pid);
 }
Example #7
0
 public function import_field($pid, $i, $key, $field, $fieldContainerName = "")
 {
     $this->parsing_data['logger'] and call_user_func($this->parsing_data['logger'], sprintf(__('- Importing field `%s`', 'pmxi_plugin'), $fieldContainerName . $field['name']));
     // If update is not allowed
     if (!empty($this->articleData['ID']) and !pmai_is_acf_update_allowed($fieldContainerName . $field['name'], $this->parsing_data['import']->options)) {
         $this->parsing_data['logger'] and call_user_func($this->parsing_data['logger'], sprintf(__('- Field `%s` is skipped attempted to import options', 'pmxi_plugin'), $fieldContainerName . $field['name']));
         return false;
     }
     $this->update_post_meta($pid, "_" . $fieldContainerName . $field['name'], $key);
     switch ($field['type']) {
         case 'text':
         case 'textarea':
         case 'number':
         case 'email':
         case 'password':
         case 'wysiwyg':
         case 'color_picker':
         case 'message':
         case 'date_picker':
         case 'limiter':
         case 'wp_wysiwyg':
         case 'date_time_picker':
         case 'oembed':
         case 'url':
             $this->update_post_meta($pid, $fieldContainerName . $field['name'], $field['values'][$i]);
             //$this->parsing_data['logger'] and call_user_func($this->parsing_data['logger'], sprintf(__('- Field `%s` updated with value `%s`', 'pmxi_plugin'), $fieldContainerName . $field['name'], $field['values'][$i]));
             break;
         case 'google_map':
             $this->update_post_meta($pid, $fieldContainerName . $field['name'], array('address' => $field['values']['address'][$i], 'lat' => $field['values']['lat'][$i], 'lng' => $field['values']['lng'][$i]));
             break;
         case 'paypal_item':
             $this->update_post_meta($pid, $fieldContainerName . $field['name'], array('item_name' => $field['values']['item_name'][$i], 'item_description' => $field['values']['item_description'][$i], 'price' => $field['values']['price'][$i]));
             break;
         case 'location-field':
             $this->update_post_meta($pid, $fieldContainerName . $field['name'], $field['values']['address'][$i] . "|" . $field['values']['lat'][$i] . "," . $field['values']['lng'][$i]);
             break;
         case 'gallery':
             //$imgs = explode(",", $field['values'][$i]);
             $gallery_ids = array();
             if (!empty($field['values'][$i])) {
                 foreach ($field['values'][$i] as $url) {
                     if ("" != $url and $attid = $this->import_image($url, $pid, $this->parsing_data['logger'])) {
                         $gallery_ids[] = $attid;
                     }
                 }
             }
             $this->update_post_meta($pid, $fieldContainerName . $field['name'], $gallery_ids);
             break;
         case 'user':
             if (strpos($field['values'][$i], ",")) {
                 $users = array_map('trim', explode(",", $field['values'][$i]));
                 if (!empty($users)) {
                     foreach ($users as $key => $author) {
                         $user = get_user_by('login', $author) or $user = get_user_by('slug', $author) or $user = get_user_by('email', $author) or ctype_digit($author) and $user = get_user_by('id', $author);
                         $users[$key] = !empty($user) ? $user->ID : "";
                     }
                 }
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], $users);
             } else {
                 $author = $field['values'][$i];
                 $user = get_user_by('login', $author) or $user = get_user_by('slug', $author) or $user = get_user_by('email', $author) or ctype_digit($author) and $user = get_user_by('id', $author);
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], !empty($user) ? $user->ID : "");
             }
             break;
         case 'image':
             if ("" != $field['values'][$i] and $attid = $this->import_image($field['values'][$i], $pid, $this->parsing_data['logger'])) {
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], $attid);
             }
             break;
         case 'file':
             if ("" != $field['values'][$i] and $attid = $this->import_file($field['values'][$i], $pid, $this->parsing_data['logger'], $this->parsing_data['import']->options['is_fast_mode'])) {
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], $attid);
             }
             break;
         case 'checkbox':
         case 'select':
         case 'radio':
         case 'true_false':
             if ($field['is_multiple']) {
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], (!empty($field['values'][$i]) and is_array($field['values'][$i])) ? $field['values'][$i] : array());
             } else {
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], $field['values'][$i]);
             }
             break;
         case 'taxonomy':
             if ($field['is_multiple'] !== true and $field['is_multiple'] == 'nesting') {
                 if (!empty($field['values'])) {
                     foreach ($field['values'] as $tx_name => $txes) {
                         $assign_taxes = array();
                         // create term if not exists
                         if (!empty($txes[$i])) {
                             foreach ($txes[$i] as $key => $single_tax) {
                                 if (is_array($single_tax)) {
                                     $parent_id = !empty($single_tax['parent']) ? pmxi_recursion_taxes($single_tax['parent'], $tx_name, $txes[$i], $key) : '';
                                     $term = $parent_id ? is_exists_term($tx_name, $single_tax['name'], (int) $parent_id) : is_exists_term($tx_name, $single_tax['name']);
                                     if (empty($term) and !is_wp_error($term)) {
                                         $term_attr = array('parent' => !empty($parent_id) ? $parent_id : 0);
                                         $term = wp_insert_term($single_tax['name'], $tx_name, $term_attr);
                                     }
                                     if (is_wp_error($term)) {
                                     } elseif (!empty($term)) {
                                         $cat_id = $term['term_id'];
                                         if ($cat_id and $single_tax['assign']) {
                                             if (!in_array($cat_id, $assign_taxes)) {
                                                 $assign_taxes[] = $cat_id;
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                         if (!empty($assign_taxes)) {
                             $this->update_post_meta($pid, $fieldContainerName . $field['name'], $assign_taxes);
                         }
                     }
                 }
             } elseif ($field['is_multiple']) {
                 $mult_values = array();
                 foreach ($field['values'] as $number => $values) {
                     $mult_values[] = trim($values[$i]);
                 }
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], $mult_values);
             } else {
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], $field['values'][$i]);
             }
             break;
         case 'page_link':
             if ("" != $field['values'][$i]) {
                 $post_ids = array();
                 $entries = explode(",", $field['values'][$i]);
                 if (!empty($entries) and is_array($entries)) {
                     foreach ($entries as $ev) {
                         $args = array('name' => $ev, 'post_type' => 'any', 'post_status' => 'any', 'numberposts' => 1);
                         //$the_query = new WP_Query( $args );
                         $my_posts = get_posts($args);
                         if ($my_posts) {
                             $post_ids[] = get_permalink($my_posts[0]->ID);
                         } elseif (ctype_digit($ev)) {
                             $my_post = get_post($ev);
                             if ($my_post) {
                                 $post_ids[] = get_permalink($my_post->ID);
                             }
                         }
                         //wp_reset_postdata();
                     }
                 }
                 if (!empty($post_ids)) {
                     if ($field['multiple']) {
                         $this->update_post_meta($pid, $fieldContainerName . $field['name'], $post_ids);
                     } else {
                         $this->update_post_meta($pid, $fieldContainerName . $field['name'], array_shift($post_ids));
                     }
                 } else {
                     $this->update_post_meta($pid, $fieldContainerName . $field['name'], '');
                 }
             } else {
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], '');
             }
             break;
         case 'post_object':
             if ("" != $field['values'][$i]) {
                 $post_ids = array();
                 $entries = explode(",", $field['values'][$i]);
                 if (!empty($entries) and is_array($entries)) {
                     foreach ($entries as $ev) {
                         $args = array('name' => $ev, 'post_type' => 'any', 'post_status' => 'any', 'numberposts' => 1);
                         $my_posts = get_posts($args);
                         if ($my_posts) {
                             $post_ids[] = $my_posts[0]->ID;
                         } elseif (ctype_digit($ev)) {
                             $post_ids[] = $ev;
                         }
                     }
                 }
                 if (!empty($post_ids)) {
                     if ($field['multiple']) {
                         $this->update_post_meta($pid, $fieldContainerName . $field['name'], $post_ids);
                     } else {
                         $this->update_post_meta($pid, $fieldContainerName . $field['name'], array_shift($post_ids));
                     }
                 } else {
                     $this->update_post_meta($pid, $fieldContainerName . $field['name'], '');
                 }
             } else {
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], '');
             }
             break;
         case 'relationship':
             if ("" != $field['values'][$i]) {
                 $post_ids = array();
                 $entries = explode(",", $field['values'][$i]);
                 if (!empty($entries) and is_array($entries)) {
                     foreach ($entries as $ev) {
                         if (ctype_digit($ev)) {
                             $post_ids[] = $ev;
                         } else {
                             $args = array('name' => $ev, 'post_type' => 'any', 'post_status' => 'any', 'numberposts' => 1);
                             $my_posts = get_posts($args);
                             if ($my_posts) {
                                 $post_ids[] = $my_posts[0]->ID;
                             }
                             wp_reset_postdata();
                         }
                     }
                 }
                 if (!empty($post_ids)) {
                     $this->update_post_meta($pid, $fieldContainerName . $field['name'], $post_ids);
                 } else {
                     $this->update_post_meta($pid, $fieldContainerName . $field['name'], '');
                 }
             } else {
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], '');
             }
             break;
         case 'gravity_forms_field':
         case 'acf_cf7':
             if ($field['is_multiple']) {
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], explode(",", $field['values'][$i]));
             } else {
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], $field['values'][$i]);
             }
             break;
         case 'repeater':
             if (!empty($field['values'])) {
                 if ($field['is_variable'] == 'xml') {
                     // is variable repeater mode enabled
                     for ($k = 0; $k < $field['values'][$i]['countRows']; $k++) {
                         foreach ($field['values'][$i]['vals'] as $sub_field_key => $sub_field) {
                             $this->import_field($pid, $k, $sub_field_key, $sub_field, $fieldContainerName . $field['name'] . "_" . $k . "_");
                         }
                     }
                     $this->update_post_meta($pid, $fieldContainerName . $field['name'], $field['values'][$i]['countRows']);
                 } else {
                     // is fixed repeater mode enabled
                     $countRows = 0;
                     foreach ($field['values'] as $row_number => $row) {
                         if (!empty($row)) {
                             $countRows++;
                             $is_row_import_allowed = true;
                             if ($field['is_ignore_empties'] and $field['is_variable'] === false or $field['is_variable']) {
                                 $is_row_import_allowed = false;
                                 foreach ($row as $sub_field_key_check => $sub_field_check) {
                                     if (!empty($sub_field_check['xpath']) and !empty($sub_field_check['values'][$i]) and !in_array($sub_field_check['type'], array('repeater'))) {
                                         $is_row_import_allowed = true;
                                         break;
                                     }
                                 }
                             }
                             if ($is_row_import_allowed) {
                                 if ($field['is_variable'] !== false and $field['is_variable'] != '') {
                                     $countCSVrows = 0;
                                     foreach ($row as $sub_field_key => $sub_field) {
                                         $entries = explode($field['is_variable'], $sub_field['values'][$i]);
                                         if (count($entries) > $countCSVrows) {
                                             $countCSVrows = count($entries);
                                         }
                                     }
                                     for ($k = 0; $k < $countCSVrows; $k++) {
                                         foreach ($row as $sub_field_key => $sub_field) {
                                             $entries = explode($field['is_variable'], $sub_field['values'][$i]);
                                             $sub_field['values'][$i] = empty($entries[$k]) ? '' : $entries[$k];
                                             $this->import_field($pid, $i, $sub_field_key, $sub_field, $fieldContainerName . $field['name'] . "_" . $k . "_");
                                         }
                                     }
                                     $countRows = $countCSVrows;
                                 } else {
                                     foreach ($row as $sub_field_key => $sub_field) {
                                         $this->import_field($pid, $i, $sub_field_key, $sub_field, $fieldContainerName . $field['name'] . "_" . $row_number . "_");
                                     }
                                 }
                             } else {
                                 $countRows--;
                             }
                         }
                     }
                     $this->update_post_meta($pid, $fieldContainerName . $field['name'], $countRows);
                 }
             }
             break;
         case 'flexible_content':
             if (!empty($field['values'])) {
                 $layouts = array();
                 foreach ($field['values'] as $layout_number => $layout) {
                     if (!empty($layout['fields'])) {
                         $layouts[] = $layout['acf_fc_layout'];
                         foreach ($layout['fields'] as $sub_field_key => $sub_field) {
                             $this->import_field($pid, $i, $sub_field_key, $sub_field, $fieldContainerName . $field['name'] . "_" . $layout_number . "_");
                         }
                     }
                 }
                 $this->update_post_meta($pid, $fieldContainerName . $field['name'], $layouts);
             }
             break;
         default:
             # code...
             break;
     }
     $v = get_post_meta($pid, $fieldContainerName . $field['name'], true);
     $this->parsing_data['logger'] and call_user_func($this->parsing_data['logger'], sprintf(__('- Field `%s` updated with value `%s`', 'pmxi_plugin'), $fieldContainerName . $field['name'], maybe_serialize($v)));
 }