Exemple #1
0
 public function http_curl()
 {
     $url = "http://www.baidu.com";
     $data['info'] = get_file_curl($url);
     $data['menus'] = $this->get_menu_data();
     $this->render('http/view_http_curl', $data);
 }
 function wp_all_import_get_gz($filename, $use_include_path = 0, $targetDir = false)
 {
     $type = 'csv';
     $uploads = wp_upload_dir();
     $targetDir = !$targetDir ? wp_all_import_secure_file($uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::UPLOADS_DIRECTORY) : $targetDir;
     $tmpname = wp_unique_filename($targetDir, strlen(basename($filename)) < 30 ? basename($filename) : time());
     $localPath = $targetDir . '/' . urldecode(sanitize_file_name($tmpname));
     $fp = @fopen($localPath, 'w');
     $file = @gzopen($filename, 'rb', $use_include_path);
     if ($file) {
         $first_chunk = true;
         while (!gzeof($file)) {
             $chunk = gzread($file, 1024);
             if ($first_chunk and strpos($chunk, "<?") !== false and strpos($chunk, "</") !== false) {
                 $type = 'xml';
                 $first_chunk = false;
             }
             // if it's a 1st chunk, then chunk <? symbols to detect XML file
             @fwrite($fp, $chunk);
         }
         gzclose($file);
     } else {
         $tmpname = wp_unique_filename($targetDir, strlen(basename($filename)) < 30 ? basename($filename) : time());
         $localGZpath = $targetDir . '/' . urldecode(sanitize_file_name($tmpname));
         $request = get_file_curl($filename, $localGZpath, false, true);
         if (!is_wp_error($request)) {
             $file = @gzopen($localGZpath, 'rb', $use_include_path);
             if ($file) {
                 $first_chunk = true;
                 while (!gzeof($file)) {
                     $chunk = gzread($file, 1024);
                     if ($first_chunk and strpos($chunk, "<?") !== false and strpos($chunk, "</") !== false) {
                         $type = 'xml';
                         $first_chunk = false;
                     }
                     // if it's a 1st chunk, then chunk <? symbols to detect XML file
                     @fwrite($fp, $chunk);
                 }
                 gzclose($file);
             }
             @unlink($localGZpath);
         } else {
             return $request;
         }
     }
     @fclose($fp);
     if (preg_match('%\\W(gz)$%i', basename($localPath))) {
         if (@rename($localPath, str_replace('.gz', '.' . $type, $localPath))) {
             $localPath = str_replace('.gz', '.' . $type, $localPath);
         }
     } else {
         if (@rename($localPath, $localPath . '.' . $type)) {
             $localPath = $localPath . '.' . $type;
         }
     }
     return array('type' => $type, 'localPath' => $localPath);
 }
 function get_file_curl($url, $fullpath, $to_variable = false, $iteration = false)
 {
     if (!preg_match('%^(http|ftp)s?://%i', $url)) {
         return;
     }
     $response = wp_remote_get($url);
     if (!is_wp_error($response) and (!isset($response['response']['code']) or isset($response['response']['code']) and !in_array($response['response']['code'], array(401, 403, 404)))) {
         $rawdata = wp_remote_retrieve_body($response);
         if (empty($rawdata)) {
             $result = pmxi_curl_download($url, $fullpath, $to_variable);
             if (!$result and $iteration === false) {
                 $new_url = wp_all_import_translate_uri($url);
                 return $new_url !== $url ? get_file_curl($new_url, $fullpath, $to_variable, true) : $result;
             }
             return $result;
         }
         if (!@file_put_contents($fullpath, $rawdata)) {
             $fp = fopen($fullpath, 'w');
             fwrite($fp, $rawdata);
             fclose($fp);
         }
         if (preg_match('%\\W(svg)$%i', basename($fullpath)) or preg_match('%\\W(jpg|jpeg|gif|png)$%i', basename($fullpath)) and (!($image_info = apply_filters('pmxi_getimagesize', @getimagesize($fullpath), $fullpath)) or !in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG)))) {
             $result = pmxi_curl_download($url, $fullpath, $to_variable);
             if (!$result and $iteration === false) {
                 $new_url = wp_all_import_translate_uri($url);
                 return $new_url !== $url ? get_file_curl($new_url, $fullpath, $to_variable, true) : $result;
             }
             return $result;
         }
         return $to_variable ? $rawdata : true;
     } else {
         $curl = pmxi_curl_download($url, $fullpath, $to_variable);
         if ($curl === false and $iteration === false) {
             $new_url = wp_all_import_translate_uri($url);
             return $new_url !== $url ? get_file_curl($new_url, $fullpath, $to_variable, true) : (is_wp_error($response) ? $response : false);
         }
         return $curl === false ? is_wp_error($response) ? $response : false : $curl;
     }
 }
 function get_file_curl($url, $fullpath, $to_variable = false, $iteration = 0)
 {
     if (!preg_match('%^(http|ftp)s?://%i', $url)) {
         return;
     }
     $request = wp_remote_get($url);
     if (!is_wp_error($request)) {
         $rawdata = wp_remote_retrieve_body($request);
         if (empty($rawdata)) {
             $result = pmxi_curl_download($url, $fullpath, $to_variable);
             if (!$result and !$iteration) {
                 $url = wp_all_import_translate_uri($url);
                 return get_file_curl($url, $fullpath, $to_variable, 1);
             }
             return $result;
         }
         if (!@file_put_contents($fullpath, $rawdata)) {
             $fp = fopen($fullpath, 'w');
             fwrite($fp, $rawdata);
             fclose($fp);
         }
         if (preg_match('%\\W(jpg|jpeg|gif|png)$%i', basename($fullpath)) and (!($image_info = @getimagesize($fullpath)) or !in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG)))) {
             $result = pmxi_curl_download($url, $fullpath, $to_variable);
             if (!$result and !$iteration) {
                 $url = wp_all_import_translate_uri($url);
                 return get_file_curl($url, $fullpath, $to_variable, 1);
             }
             return $result;
         }
         return $to_variable ? $rawdata : true;
     } else {
         $curl = pmxi_curl_download($url, $fullpath, $to_variable);
         if ($curl === false and !$iteration) {
             $url = wp_all_import_translate_uri($url);
             return get_file_curl($url, $fullpath, $to_variable, 1);
         }
         return $curl === false ? $request : $curl;
     }
 }
function pmxi_wp_ajax_test_images()
{
    if (!check_ajax_referer('wp_all_import_secure', 'security', false)) {
        exit(json_encode(array('result' => array(), 'failed_msgs' => array(__('Security check', 'wp_all_import_plugin')))));
    }
    if (!current_user_can('manage_options')) {
        exit(json_encode(array('result' => array(), 'failed_msgs' => array(__('Security check', 'wp_all_import_plugin')))));
    }
    $input = new PMXI_Input();
    $post = $input->post(array('download' => 'yes', 'imgs' => array()));
    $result = array();
    $wp_uploads = wp_upload_dir();
    $imgs_basedir = $wp_uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::FILES_DIRECTORY . DIRECTORY_SEPARATOR;
    $targetDir = $wp_uploads['path'];
    $success_images = 0;
    $success_msg = '';
    $failed_msgs = array();
    if (!@is_writable($targetDir)) {
        $failed_msgs[] = sprintf(__('Uploads folder `%s` is not writable.', 'wp_all_import_plugin'), $targetDir);
    } else {
        if ('no' == $post['download']) {
            if (!empty($post['imgs'])) {
                foreach ($post['imgs'] as $img) {
                    if (preg_match('%^(http|https|ftp|ftps)%i', $img)) {
                        $failed_msgs[] = sprintf(__('Use image name instead of URL `%s`.', 'wp_all_import_plugin'), $img);
                        continue;
                    }
                    if (@file_exists($imgs_basedir . $img)) {
                        if (@is_readable($imgs_basedir . $img)) {
                            $success_images++;
                        } else {
                            $failed_msgs[] = sprintf(__('File `%s` isn\'t readable'), preg_replace('%.*/wp-content%', '/wp-content', $imgs_basedir . $img));
                        }
                    } else {
                        $failed_msgs[] = sprintf(__('File `%s` doesn\'t exist'), preg_replace('%.*/wp-content%', '/wp-content', $imgs_basedir . $img));
                    }
                }
            }
            if ((int) $success_images === 1) {
                $success_msg = sprintf(__('%d image was successfully retrieved from `%s`', 'wp_all_import_plugin'), $success_images, preg_replace('%.*/wp-content%', '/wp-content', $wp_uploads['basedir']) . DIRECTORY_SEPARATOR . PMXI_Plugin::FILES_DIRECTORY);
            } elseif ((int) $success_images > 1) {
                $success_msg = sprintf(__('%d images were successfully retrieved from `%s`', 'wp_all_import_plugin'), $success_images, preg_replace('%.*/wp-content%', '/wp-content', $wp_uploads['basedir']) . DIRECTORY_SEPARATOR . PMXI_Plugin::FILES_DIRECTORY);
            }
        } else {
            $start = time();
            if (!empty($post['imgs'])) {
                foreach ($post['imgs'] as $img) {
                    if (!preg_match('%^(http|https|ftp|ftps)%i', $img)) {
                        $failed_msgs[] = sprintf(__('URL `%s` is not valid.', 'wp_all_import_plugin'), $img);
                        continue;
                    }
                    $image_name = wp_unique_filename($targetDir, 'test');
                    $image_filepath = $targetDir . '/' . $image_name;
                    $url = str_replace(" ", "%20", trim($img));
                    $request = get_file_curl($url, $image_filepath);
                    if ((is_wp_error($request) or $request === false) and !@file_put_contents($image_filepath, @file_get_contents($img))) {
                        $failed_msgs[] = is_wp_error($request) ? $request->get_error_message() : sprintf(__('File `%s` cannot be saved locally', 'wp_all_import_plugin'), $img);
                    } elseif (!($image_info = @getimagesize($image_filepath)) or !in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                        $failed_msgs[] = sprintf(__('File `%s` is not a valid image.', 'wp_all_import_plugin'), $img);
                    } else {
                        $success_images++;
                    }
                    @unlink($image_filepath);
                }
            }
            $time = time() - $start;
            if ((int) $success_images === 1) {
                $success_msg = sprintf(__('%d image was successfully downloaded in %s seconds', 'wp_all_import_plugin'), $success_images, number_format($time, 2));
            } elseif ((int) $success_images > 1) {
                $success_msg = sprintf(__('%d images were successfully downloaded in %s seconds', 'wp_all_import_plugin'), $success_images, number_format($time, 2));
            }
        }
    }
    exit(json_encode(array('success_images' => $success_images, 'success_msg' => $success_msg, 'failed_msgs' => $failed_msgs)));
    die;
}
Exemple #6
0
 public function url($feed_type = '', $feed_xpath = '')
 {
     $uploads = wp_upload_dir();
     $template = false;
     if (empty($this->file)) {
         $this->errors->add('form-validation', __('Please specify a file to import.', 'wp_all_import_plugin'));
     } elseif (!preg_match('%^https?://%i', $this->file)) {
         $this->errors->add('form-validation', __('The URL to your file is not valid.<br/><br/>Please make sure the URL starts with http:// or https://. To import from https://, your server must have OpenSSL installed.'), 'wp_all_import_plugin');
     } elseif (!is_writeable($this->uploadsPath)) {
         $this->errors->add('form-validation', __('Uploads folder ' . $this->uploadsPath . ' is not writable.'), 'wp_all_import_plugin');
     }
     $this->file = trim($this->file);
     $csv_path = '';
     if (empty($this->errors->errors)) {
         if ('' == $feed_type and !preg_match('%\\W(xml|csv|zip|gz|xls|xlsx)$%i', trim($this->file))) {
             $feed_type = wp_all_import_get_remote_file_name(trim($this->file));
         }
         if ('zip' == $feed_type or empty($feed_type) and preg_match('%\\W(zip)$%i', trim($this->file))) {
             $tmpname = $this->uploadsPath . '/' . wp_unique_filename($this->uploadsPath, basename($this->file));
             @copy($this->file, $tmpname);
             if (!file_exists($tmpname)) {
                 $request = get_file_curl($this->file, $tmpname);
                 if (is_wp_error($request)) {
                     $this->errors->add('form-validation', $request->get_error_message());
                 }
                 if (!file_exists($tmpname)) {
                     $this->errors->add('form-validation', __('Failed upload ZIP archive', 'wp_all_import_plugin'));
                 }
             }
             if (!class_exists('PclZip')) {
                 include_once PMXI_Plugin::ROOT_DIR . '/libraries/pclzip.lib.php';
             }
             $archive = new PclZip($tmpname);
             if (($v_result_list = $archive->extract(PCLZIP_OPT_PATH, $this->uploadsPath, PCLZIP_OPT_REPLACE_NEWER)) == 0) {
                 $this->errors->add('form-validation', __('WP All Import couldn\'t find a file to import inside your ZIP.<br/><br/>Either the .ZIP file is broken, or doesn\'t contain a file with an extension of  XML, CSV, PSV, DAT, or TXT. <br/>Please attempt to unzip your .ZIP file on your computer to ensure it is a valid .ZIP file which can actually be unzipped, and that it contains a file which WP All Import can import.', 'wp_all_import_plugin'));
             } else {
                 $filePath = '';
                 if (!empty($v_result_list)) {
                     foreach ($v_result_list as $unzipped_file) {
                         if ($unzipped_file['status'] == 'ok' and preg_match('%\\W(xml|csv|txt|dat|psv|json|xls|xlsx)$%i', trim($unzipped_file['stored_filename'])) and strpos($unzipped_file['stored_filename'], 'readme.txt') === false) {
                             if (strpos(basename($unzipped_file['stored_filename']), 'WP All Import Template') === 0 || strpos(basename($unzipped_file['stored_filename']), 'templates_') === 0) {
                                 $template = file_get_contents($unzipped_file['filename']);
                             } elseif ($filePath == '') {
                                 $filePath = $unzipped_file['filename'];
                             }
                         }
                     }
                 }
                 if ($this->uploadsPath === false) {
                     $this->errors->add('form-validation', __('WP All Import can\'t access your WordPress uploads folder.', 'wp_all_import_plugin'));
                 }
                 if (empty($filePath)) {
                     $zip = zip_open(trim($tmpname));
                     if (is_resource($zip)) {
                         while ($zip_entry = zip_read($zip)) {
                             $filePath = zip_entry_name($zip_entry);
                             $fp = fopen($this->uploadsPath . "/" . $filePath, "w");
                             if (zip_entry_open($zip, $zip_entry, "r")) {
                                 $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                                 fwrite($fp, "{$buf}");
                                 zip_entry_close($zip_entry);
                                 fclose($fp);
                             }
                             break;
                         }
                         zip_close($zip);
                     } else {
                         $this->errors->add('form-validation', __('WP All Import couldn\'t find a file to import inside your ZIP.<br/><br/>Either the .ZIP file is broken, or doesn\'t contain a file with an extension of  XML, CSV, PSV, DAT, or TXT. <br/>Please attempt to unzip your .ZIP file on your computer to ensure it is a valid .ZIP file which can actually be unzipped, and that it contains a file which WP All Import can import.', 'wp_all_import_plugin'));
                     }
                 }
                 // Detect if file is very large
                 $source = array('name' => basename(parse_url($this->file, PHP_URL_PATH)), 'type' => 'url', 'path' => $feed_xpath);
                 if (preg_match('%\\W(csv|txt|dat|psv)$%i', trim($filePath))) {
                     include_once PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportCsvParse.php';
                     $csv = new PMXI_CsvParser(array('filename' => $filePath, 'targetDir' => $this->uploadsPath));
                     // create chunks
                     //wp_all_import_remove_source($filePath, false);
                     $csv_path = $filePath;
                     $filePath = $csv->xml_path;
                     $this->is_csv = $csv->is_csv;
                     $this->root_element = 'node';
                 } elseif (preg_match('%\\W(json)$%i', trim($filePath))) {
                     $json_str = file_get_contents($filePath);
                     $is_json = wp_all_import_is_json($json_str);
                     if (is_wp_error($is_json)) {
                         $this->errors->add('form-validation', $is_json->get_error_message(), 'wp_all_import_plugin');
                     } else {
                         $xml_data = wp_all_import_json_to_xml(json_decode($json_str, true));
                         if (empty($xml_data)) {
                             $this->errors->add('form-validation', __('Can not import this file. JSON to XML convertation failed.', 'wp_all_import_plugin'));
                         } else {
                             $jsontmpname = $this->uploadsPath . '/' . wp_all_import_url_title(wp_unique_filename($this->uploadsPath, str_replace("json", "xml", basename($filePath))));
                             file_put_contents($jsontmpname, $xml_data);
                             wp_all_import_remove_source($filePath, false);
                             $filePath = $jsontmpname;
                         }
                     }
                 } elseif (preg_match('%\\W(sql)$%i', trim($filePath))) {
                     include_once PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportSQLParse.php';
                     $localSQLPath = $filePath;
                     $sql = new PMXI_SQLParser($localSQLPath, $this->uploadsPath);
                     $filePath = $sql->parse();
                     wp_all_import_remove_source($localSQLPath, false);
                 } elseif (preg_match('%\\W(xls|xlsx)$%i', trim($filePath))) {
                     include_once PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportXLSParse.php';
                     $localXLSPath = $filePath;
                     $xls = new PMXI_XLSParser($localXLSPath, $this->uploadsPath);
                     $filePath = $xls->parse();
                     wp_all_import_remove_source($localXLSPath, false);
                 }
             }
             if (file_exists($tmpname)) {
                 wp_all_import_remove_source($tmpname, false);
             }
         } elseif ('csv' == $feed_type or '' == $feed_type and preg_match('%\\W(csv|txt|dat|psv)$%i', trim($this->file))) {
             $source = array('name' => basename(parse_url($this->file, PHP_URL_PATH)), 'type' => 'url', 'path' => $feed_xpath);
             // copy remote file in binary mode
             $filePath = wp_all_import_get_url($this->file, $this->uploadsPath, 'csv');
             if (!is_wp_error($filePath)) {
                 if (!file_exists($filePath)) {
                     $this->errors->add('form-validation', __('WP All Import was not able to download your file.<br/><br/>Please make sure the URL to your file is valid.<br/>You can test this by pasting it into your browser.<br/>Other reasons for this error can include some server setting on your host restricting access to this particular URL or external URLs in general, or some setting on the server hosting the file you are trying to access preventing your server from accessing it.', 'wp_all_import_plugin'));
                 }
                 // Detect if file is very large
                 include_once PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportCsvParse.php';
                 $csv = new PMXI_CsvParser(array('filename' => $filePath, 'targetDir' => $this->uploadsPath));
                 // create chunks
                 //wp_all_import_remove_source($filePath, false);
                 $csv_path = $filePath;
                 $filePath = $csv->xml_path;
                 $this->is_csv = $csv->is_csv;
                 $this->root_element = 'node';
             } else {
                 $this->errors->add('form-validation', $filePath->get_error_message());
             }
         } elseif (preg_match('%\\W(json)$%i', trim($this->file))) {
             $source = array('name' => basename(parse_url($this->file, PHP_URL_PATH)), 'type' => 'url', 'path' => $feed_xpath);
             // copy remote file in binary mode
             $filePath = wp_all_import_get_url($this->file, $this->uploadsPath, 'json');
             $json_str = file_get_contents($filePath);
             $is_json = wp_all_import_is_json($json_str);
             if (is_wp_error($is_json)) {
                 $this->errors->add('form-validation', $is_json->get_error_message(), 'wp_all_import_plugin');
             } else {
                 $xml_data = wp_all_import_json_to_xml(json_decode($json_str, true));
                 if (empty($xml_data)) {
                     $this->errors->add('form-validation', __('Can not import this file. JSON to XML convertation failed.', 'wp_all_import_plugin'));
                 } else {
                     $tmpname = $this->uploadsPath . '/' . wp_all_import_url_title(wp_unique_filename($this->uploadsPath, str_replace("json", "xml", basename($filePath))));
                     file_put_contents($tmpname, $xml_data);
                     wp_all_import_remove_source($filePath, false);
                     $filePath = $tmpname;
                 }
             }
         } elseif (preg_match('%\\W(sql)$%i', trim($this->file))) {
             $source = array('name' => basename($this->file), 'type' => 'url', 'path' => $feed_xpath);
             // copy remote file in binary mode
             $localSQLPath = wp_all_import_get_url($this->file, $this->uploadsPath, 'sql');
             include_once PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportSQLParse.php';
             $sql = new PMXI_SQLParser($localSQLPath, $this->uploadsPath);
             $filePath = $sql->parse();
             wp_all_import_remove_source($localSQLPath, false);
         } elseif (preg_match('%\\W(xls|xlsx)$%i', trim($this->file))) {
             $source = array('name' => basename($this->file), 'type' => 'url', 'path' => $feed_xpath);
             // copy remote file in binary mode
             $localXLSPath = wp_all_import_get_url($this->file, $this->uploadsPath, 'xls');
             include_once PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportXLSParse.php';
             $xls = new PMXI_XLSParser($localXLSPath, $this->uploadsPath);
             $filePath = $xls->parse();
             wp_all_import_remove_source($localXLSPath, false);
         } else {
             if ('gz' == $feed_type or '' == $feed_type and preg_match('%\\W(gz|gzip)$%i', trim($this->file))) {
                 $fileInfo = wp_all_import_get_gz($this->file, 0, $this->uploadsPath);
             } else {
                 $headers = wp_all_import_get_feed_type($this->file);
                 if ($headers['Content-Type'] and in_array($headers['Content-Type'], array('gz', 'gzip')) or $headers['Content-Encoding'] and in_array($headers['Content-Encoding'], array('gz', 'gzip'))) {
                     $fileInfo = wp_all_import_get_gz($this->file, 0, $this->uploadsPath);
                 } else {
                     $fileInfo = wp_all_import_get_url($this->file, $this->uploadsPath, $headers['Content-Type'], $headers['Content-Encoding'], true);
                 }
             }
             if (!is_wp_error($fileInfo)) {
                 $filePath = $fileInfo['localPath'];
                 if (!file_exists($filePath)) {
                     $this->errors->add('form-validation', __('WP All Import was not able to download your file.<br/><br/>Please make sure the URL to your file is valid.<br/>You can test this by pasting it into your browser.<br/>Other reasons for this error can include some server setting on your host restricting access to this particular URL or external URLs in general, or some setting on the server hosting the file you are trying to access preventing your server from accessing it.', 'wp_all_import_plugin'));
                 }
                 // Detect if file is very large
                 $source = array('name' => basename(parse_url($this->file, PHP_URL_PATH)), 'type' => 'url', 'path' => $feed_xpath);
                 $fileInfo['type'] = apply_filters('wp_all_import_feed_type', $fileInfo['type'], $this->file);
                 // detect CSV or XML
                 switch ($fileInfo['type']) {
                     case 'csv':
                         include_once PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportCsvParse.php';
                         $csv = new PMXI_CsvParser(array('filename' => $filePath, 'targetDir' => $this->uploadsPath));
                         // create chunks
                         $csv_path = $filePath;
                         //wp_all_import_remove_source($filePath, false);
                         $filePath = $csv->xml_path;
                         $this->is_csv = $csv->is_csv;
                         $this->root_element = 'node';
                         break;
                     case 'json':
                         $json_str = file_get_contents($filePath);
                         $is_json = wp_all_import_is_json($json_str);
                         if (is_wp_error($is_json)) {
                             $this->errors->add('form-validation', $is_json->get_error_message(), 'wp_all_import_plugin');
                         } else {
                             $xml_data = wp_all_import_json_to_xml(json_decode($json_str, true));
                             if (empty($xml_data)) {
                                 $this->errors->add('form-validation', __('Can not import this file. JSON to XML convertation failed.', 'wp_all_import_plugin'));
                             } else {
                                 $tmpname = $this->uploadsPath . '/' . wp_all_import_url_title(wp_unique_filename($this->uploadsPath, str_replace("json", "xml", basename($filePath))));
                                 file_put_contents($tmpname, $xml_data);
                                 wp_all_import_remove_source($filePath, false);
                                 $filePath = $tmpname;
                             }
                         }
                         break;
                     case 'sql':
                         include_once PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportSQLParse.php';
                         $sql = new PMXI_SQLParser($filePath, $this->uploadsPath);
                         $filePath = $sql->parse();
                         break;
                     default:
                         # code...
                         break;
                 }
             } else {
                 $this->errors->add('form-validation', $fileInfo->get_error_message());
             }
         }
     }
     if ($this->errors->get_error_codes()) {
         return $this->errors;
     }
     $templateOptions = json_decode($template, true);
     $options = maybe_unserialize($templateOptions[0]['options']);
     return array('filePath' => $filePath, 'source' => $source, 'root_element' => $this->root_element, 'feed_type' => $feed_type, 'is_csv' => $this->is_csv, 'csv_path' => $csv_path, 'template' => $template, 'post_type' => !empty($options) ? $options['custom_type'] : false);
 }
function pmxi_wp_ajax_test_images()
{
    if (!check_ajax_referer('wp_all_import_secure', 'security', false)) {
        exit(json_encode(array('result' => array(), 'failed_msgs' => array(__('Security check', 'wp_all_import_plugin')))));
    }
    if (!current_user_can(PMXI_Plugin::$capabilities)) {
        exit(json_encode(array('result' => array(), 'failed_msgs' => array(__('Security check', 'wp_all_import_plugin')))));
    }
    $input = new PMXI_Input();
    $post = $input->post(array('download' => 'yes', 'imgs' => array()));
    $result = array();
    $wp_uploads = wp_upload_dir();
    $imgs_basedir = $wp_uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::FILES_DIRECTORY . DIRECTORY_SEPARATOR;
    $targetDir = $wp_uploads['path'];
    $success_images = 0;
    $success_msg = '';
    $failed_msgs = array();
    if (!@is_writable($targetDir)) {
        $failed_msgs[] = sprintf(__('Uploads folder `%s` is not writable.', 'wp_all_import_plugin'), $targetDir);
    } else {
        switch ($post['download']) {
            // Use images currently uploaded in wp-content/uploads/wpallimport/files/
            case 'no':
                if (!empty($post['imgs'])) {
                    foreach ($post['imgs'] as $img) {
                        if (preg_match('%^(http|https|ftp|ftps)%i', $img)) {
                            $failed_msgs[] = sprintf(__('Use image name instead of URL `%s`.', 'wp_all_import_plugin'), $img);
                            continue;
                        }
                        if (@file_exists($imgs_basedir . $img)) {
                            if (@is_readable($imgs_basedir . $img)) {
                                $success_images++;
                            } else {
                                $failed_msgs[] = sprintf(__('File `%s` isn\'t readable', 'wp_all_import_plugin'), preg_replace('%.*/wp-content%', '/wp-content', $imgs_basedir . $img));
                            }
                        } else {
                            $failed_msgs[] = sprintf(__('File `%s` doesn\'t exist', 'wp_all_import_plugin'), preg_replace('%.*/wp-content%', '/wp-content', $imgs_basedir . $img));
                        }
                    }
                }
                if ((int) $success_images === 1) {
                    $success_msg = sprintf(__('%d image was successfully retrieved from `%s`', 'wp_all_import_plugin'), $success_images, preg_replace('%.*/wp-content%', '/wp-content', $wp_uploads['basedir']) . DIRECTORY_SEPARATOR . PMXI_Plugin::FILES_DIRECTORY);
                } elseif ((int) $success_images > 1) {
                    $success_msg = sprintf(__('%d images were successfully retrieved from `%s`', 'wp_all_import_plugin'), $success_images, preg_replace('%.*/wp-content%', '/wp-content', $wp_uploads['basedir']) . DIRECTORY_SEPARATOR . PMXI_Plugin::FILES_DIRECTORY);
                }
                break;
                // 	Use images currently in Media Library
            // 	Use images currently in Media Library
            case 'gallery':
                if (!empty($post['imgs'])) {
                    global $wpdb;
                    foreach ($post['imgs'] as $img) {
                        $bn = wp_all_import_sanitize_filename(basename($img));
                        $img_ext = pmxi_getExtensionFromStr($img);
                        $default_extension = pmxi_getExtension($bn);
                        $image_name = apply_filters("wp_all_import_image_filename", urldecode(sanitize_file_name($img_ext ? str_replace("." . $default_extension, "", $bn) : $bn)) . ("" != $img_ext ? '.' . $img_ext : ''));
                        $attch = wp_all_import_get_image_from_gallery($image_name, $targetDir);
                        if (!empty($attch)) {
                            $success_images++;
                        } else {
                            $failed_msgs[] = sprintf(__('Image `%s` not found in media library.', 'wp_all_import_plugin'), $image_name);
                        }
                    }
                }
                if ((int) $success_images === 1) {
                    $success_msg = sprintf(__('%d image was successfully founded in media gallery', 'wp_all_import_plugin'), $success_images);
                } elseif ((int) $success_images > 1) {
                    $success_msg = sprintf(__('%d images were successfully founded in media gallery', 'wp_all_import_plugin'), $success_images);
                }
                break;
                // Download images hosted elsewhere
            // Download images hosted elsewhere
            default:
                $start = time();
                if (!empty($post['imgs'])) {
                    foreach ($post['imgs'] as $img) {
                        if (!preg_match('%^(http|https|ftp|ftps)%i', $img)) {
                            $failed_msgs[] = sprintf(__('URL `%s` is not valid.', 'wp_all_import_plugin'), $img);
                            continue;
                        }
                        $image_name = wp_unique_filename($targetDir, 'test');
                        $image_filepath = $targetDir . '/' . $image_name;
                        $url = trim($img);
                        $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($img, false, $get_ctx))) {
                            $failed_msgs[] = is_wp_error($request) ? $request->get_error_message() : sprintf(__('File `%s` cannot be saved locally', 'wp_all_import_plugin'), $img);
                        } elseif (!($image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath)) or !in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                            $failed_msgs[] = sprintf(__('File `%s` is not a valid image.', 'wp_all_import_plugin'), $img);
                        } else {
                            $success_images++;
                        }
                        @unlink($image_filepath);
                    }
                }
                $time = time() - $start;
                if ((int) $success_images === 1) {
                    $success_msg = sprintf(__('%d image was successfully downloaded in %s seconds', 'wp_all_import_plugin'), $success_images, number_format($time, 2));
                } elseif ((int) $success_images > 1) {
                    $success_msg = sprintf(__('%d images were successfully downloaded in %s seconds', 'wp_all_import_plugin'), $success_images, number_format($time, 2));
                }
                break;
        }
    }
    exit(json_encode(array('success_images' => $success_images, 'success_msg' => $success_msg, 'failed_msgs' => $failed_msgs)));
    die;
}
    $url = $sportscapping_site_path . '/new/export/?' . $params_array[4] . '/export/capper/' . $params_array[2] . '/overall';
}
if ($params_array[0] == 'top_trends') {
    $url = $sportscapping_site_path . '/new/export/?' . $your_partner_code . '/export/top_trends/menu/' . $named_param['leg'] . '/10';
}
if ($params_array[0] == 'top_cappers') {
    $url = $sportscapping_site_path . '/new/export/?' . $your_partner_code . '/export/top_cappers/full/menu/' . $named_param['leg'];
}
if ($mode == 'standard') {
    echo file_get_contents($url);
}
if ($mode == 'fopen') {
    echo get_file($url);
}
if ($mode == 'curl') {
    echo get_file_curl($url);
}
if ($mode == 'iframe') {
    if ($params_array[0] == 'premium_picks') {
        $url = $sportscapping_site_path . '/new/export/?' . $your_partner_code . '/export/premium_picks/menu/' . $named_param['leg'] . '/' . $params_array[1];
    }
    if ($params_array[0] == 'free_picks') {
        $url = $sportscapping_site_path . '/new/export/?' . $your_partner_code . '/export/free_picks';
    }
    if ($params_array[0] == 'leaderboard') {
        $url = $sportscapping_site_path . '/new/export/?' . $your_partner_code . '/export/leaderboard/menu/5/' . $named_param['leg'];
    }
    if ($params_array[0] == 'capper') {
        $url = $sportscapping_site_path . '/new/export/?' . $params_array[4] . '/export/capper/' . $params_array[2] . '/overall';
    }
    if ($params_array[0] == 'top_trends') {
Exemple #9
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 pmxi_wp_ajax_test_images()
{
    extract($_POST);
    $result = array();
    $wp_uploads = wp_upload_dir();
    $imgs_basedir = $wp_uploads['basedir'] . '/wpallimport/files/';
    $targetDir = $wp_uploads['path'];
    // . '/wpallimport/uploads';
    $success_images = 0;
    $success_msg = '';
    $failed_msgs = array();
    if (!@is_writable($targetDir)) {
        $failed_msgs[] = sprintf(__('Uploads folder `%s` is not writable.', 'pmxi_plugin'), $targetDir);
    } else {
        if ('no' == $download) {
            if (!empty($imgs)) {
                foreach ($imgs as $img) {
                    if (preg_match('%^(http|https|ftp|ftps)%i', $img)) {
                        $failed_msgs[] = sprintf(__('Use image name instead of URL `%s`.', 'pmxi_plugin'), $img);
                        continue;
                    }
                    if (@file_exists($imgs_basedir . $img)) {
                        if (@is_readable($imgs_basedir . $img)) {
                            $success_images++;
                        } else {
                            $failed_msgs[] = sprintf(__('File `%s` isn\'t readable'), preg_replace('%.*/wp-content%', '/wp-content', $imgs_basedir . $img));
                        }
                    } else {
                        $failed_msgs[] = sprintf(__('File `%s` doesn\'t exist'), preg_replace('%.*/wp-content%', '/wp-content', $imgs_basedir . $img));
                    }
                }
            }
            if ((int) $success_images === 1) {
                $success_msg = sprintf(__('%d image was successfully retrieved from `%s/wpallimport/files`', 'pmxi_plugin'), $success_images, preg_replace('%.*/wp-content%', '/wp-content', $wp_uploads['basedir']));
            } elseif ((int) $success_images > 1) {
                $success_msg = sprintf(__('%d images were successfully retrieved from `%s/wpallimport/files`', 'pmxi_plugin'), $success_images, preg_replace('%.*/wp-content%', '/wp-content', $wp_uploads['basedir']));
            }
        } else {
            $start = time();
            if (!empty($imgs)) {
                foreach ($imgs as $img) {
                    if (!preg_match('%^(http|https|ftp|ftps)%i', $img)) {
                        $failed_msgs[] = sprintf(__('URL `%s` is not valid.', 'pmxi_plugin'), $img);
                        continue;
                    }
                    $image_name = wp_unique_filename($targetDir, 'test');
                    $image_filepath = $targetDir . '/' . $image_name;
                    $request = get_file_curl($img, $image_filepath);
                    if ((is_wp_error($request) or $request === false) and !@file_put_contents($image_filepath, @file_get_contents($img))) {
                        $failed_msgs[] = is_wp_error($request) ? $request->get_error_message() : sprintf(__('File `%s` cannot be saved locally', 'pmxi_plugin'), $img);
                    } elseif (!($image_info = @getimagesize($image_filepath)) or !in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                        $failed_msgs[] = sprintf(__('File `%s` is not a valid image.', 'pmxi_plugin'), $img);
                    } else {
                        $success_images++;
                    }
                    @unlink($image_filepath);
                }
            }
            $time = time() - $start;
            if ((int) $success_images === 1) {
                $success_msg = sprintf(__('%d image was successfully downloaded in %s seconds', 'pmxi_plugin'), $success_images, number_format($time, 2));
            } elseif ((int) $success_images > 1) {
                $success_msg = sprintf(__('%d images were successfully downloaded in %s seconds', 'pmxi_plugin'), $success_images, number_format($time, 2));
            }
        }
    }
    exit(json_encode(array('success_images' => $success_images, 'success_msg' => $success_msg, 'failed_msgs' => $failed_msgs)));
    die;
}
 public function import($importData)
 {
     extract($importData);
     $cxpath = $xpath_prefix . $this->import->xpath;
     global $woocommerce;
     extract($this->data);
     $is_new_product = empty($articleData['ID']);
     $product_type = empty($product_types[$i]) ? 'simple' : sanitize_title(stripslashes($product_types[$i]));
     if ($this->import->options['update_all_data'] == 'no' and !$this->import->options['is_update_product_type'] and !$is_new_product) {
         $product = get_product($pid);
         if (!empty($product->product_type)) {
             $product_type = $product->product_type;
         }
     }
     $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->import->options['update_all_data'] == 'yes' or $this->import->options['update_all_data'] == 'no' and $this->import->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' => in_array($product_enable_reviews[$i], array('yes', 'open')) ? '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->import->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->import->options['disable_auto_sku_generation']) {
         $this->pushmeta($pid, '_sku', '');
     } elseif ($new_sku == '' and !$this->import->options['disable_auto_sku_generation']) {
         if ($is_new_product or $this->is_update_cf('_sku')) {
             $unique_keys = XmlImportParser::factory($xml, $cxpath, $this->import->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->import->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->import->options['update_all_data'] == "yes" or $this->import->options['update_all_data'] == "no" and $this->import->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)) {
                     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->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] and $this->import->options['update_attributes_logic'] == 'only') {
                     if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                         if (!in_array($is_taxonomy ? wc_attribute_taxonomy_name($attr_name) : $attr_name, array_filter($this->import->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->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] and $this->import->options['update_attributes_logic'] == 'all_except') {
                     if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                         if (in_array($is_taxonomy ? wc_attribute_taxonomy_name($attr_name) : $attr_name, array_filter($this->import->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' => $attr_data['value'][$i], '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 (trim($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' => trim($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', $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', $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->import->options['is_multiple_grouping_product'] != 'yes') {
             if ($this->import->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->import->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->import->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);
     // Cross sells
     $this->import_linked_products($pid, $product_cross_sells[$i], '_crosssell_ids', $is_new_product);
     // 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->import->options['product_files_delim'], $product_files[$i]);
             $file_names = explode($this->import->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]));
         }
     }
     // Product url
     if ($product_type == 'external') {
         if (isset($product_url[$i]) && $product_url[$i]) {
             $this->auto_cloak_links($import, $product_url[$i]);
             $this->pushmeta($pid, '_product_url', esc_url_raw($product_url[$i]));
         }
         if (isset($product_button_text[$i]) && $product_button_text[$i]) {
             $this->pushmeta($pid, '_button_text', esc_attr($product_button_text[$i]));
         }
     }
     // prepare bulk SQL query
     //$this->executeSQL();
     wc_delete_product_transients($pid);
     // VARIATIONS
     if ((in_array($product_type, array('variation', 'variable')) or $product_types[$i] == "variable") and !$this->import->options['link_all_variations'] and "xml" != $this->import->options['matching_parent']) {
         $set_defaults = false;
         $product_parent_post_id = false;
         //[search parent product]
         $first_is_parent = in_array($this->import->options['matching_parent'], array("auto", "first_is_parent_title")) ? "yes" : "no";
         if ("manual" != $this->import->options['duplicate_matching'] or $is_new_product) {
             // find corresponding article among previously imported
             if (!empty($single_product_parent_ID[$i])) {
                 $postRecord = $this->wpdb->get_row($this->wpdb->prepare("SELECT * FROM " . $this->wpdb->prefix . "pmxi_posts WHERE `import_id` = %d AND `product_key` = %s ORDER BY post_id ASC", $this->import->id, $single_product_parent_ID[$i]));
                 $product_parent_post = !empty($postRecord) ? get_post($product_parent_post_id = $postRecord->post_id) : false;
             } else {
                 $product_parent_post = false;
             }
         } else {
             if (empty($articleData['post_parent'])) {
                 $product_parent_post_id = $pid;
                 $args = array('post_type' => 'product_variation', 'meta_query' => array(array('key' => '_sku', 'value' => get_post_meta($pid, '_sku', true))));
                 $query = new WP_Query($args);
                 if ($query->have_posts()) {
                     $duplicate_id = $query->post->ID;
                     if ($duplicate_id) {
                         $pid = $duplicate_id;
                         $this->duplicate_post_meta($pid, $product_parent_post_id);
                         $tmp = get_post_meta($product_parent_post_id, '_stock', true);
                         $this->pushmeta($product_parent_post_id, '_stock_tmp', $tmp);
                         if (empty($this->import->options['set_parent_stock'])) {
                             $this->pushmeta($product_parent_post_id, '_stock', '');
                         }
                         $tmp = get_post_meta($product_parent_post_id, '_regular_price', true);
                         $this->pushmeta($product_parent_post_id, '_regular_price_tmp', $tmp);
                         $this->pushmeta($product_parent_post_id, '_regular_price', '');
                         $tmp = get_post_meta($product_parent_post_id, '_price', true);
                         $this->pushmeta($product_parent_post_id, '_price_tmp', $tmp);
                         $this->pushmeta($product_parent_post_id, '_price', '');
                     }
                 }
                 wp_reset_postdata();
             } else {
                 if (!empty($articleData['post_parent'])) {
                     $product_parent_post_id = $articleData['post_parent'];
                 } elseif ($articleData['post_type'] == 'product_variation') {
                     $variation_post = get_post($pid);
                     $product_parent_post_id = $variation_post->post_parent;
                 }
             }
             $product_parent_post = $product_parent_post_id ? get_post($product_parent_post_id) : false;
         }
         //[\search parent product]
         if (in_array($product_type, array('variation', 'variable'))) {
             //$first_is_parent = ( in_array($this->import->options['matching_parent'], array("auto", "first_is_parent_title")) ) ? "yes" : "no";
             if (!empty($product_parent_post_id) and ((int) $product_parent_post_id != (int) $pid or (int) $product_parent_post_id == (int) $pid and $first_is_parent == "no" and (!$this->import->options['make_simple_product'] and ("manual" != $this->import->options['duplicate_matching'] or $is_new_product)))) {
                 $create_new_variation = false;
                 $product_ids = array();
                 if ($first_is_parent == "no") {
                     $is_first_variation_created = get_post_meta($product_parent_post_id, '_is_first_variation_created', true);
                     if (!$is_first_variation_created) {
                         $create_new_variation = true;
                         update_post_meta($product_parent_post_id, '_is_first_variation_created', 1);
                         $product_ids[] = ("manual" == $this->import->options['duplicate_matching'] and !$is_new_product) ? $pid : $product_parent_post_id;
                     }
                     if (!in_array($pid, $product_ids)) {
                         $product_ids[] = $pid;
                     }
                 } else {
                     $product_ids[] = $pid;
                 }
                 foreach ($product_ids as $iter => $pid) {
                     $create_new_variation = $create_new_variation && !$iter ? true : false;
                     $parent_sku = get_post_meta($product_parent_post_id, '_sku', true);
                     if ($create_new_variation) {
                         $postRecord = new PMXI_Post_Record();
                         $postRecord->clear();
                         if ("manual" != $this->import->options['duplicate_matching'] or $is_new_product) {
                             // find corresponding article among previously imported
                             $postRecord->getBy(array('unique_key' => 'Variation ' . $parent_sku, 'import_id' => $this->import->id));
                             $pid = !$postRecord->isEmpty() ? $postRecord->post_id : false;
                         }
                     }
                     $is_product_enabled = ($create_new_variation and $this->import->options['make_simple_product']) ? get_post_meta($product_parent_post_id, '_v_variation_enabled', true) : $product_enabled[$i];
                     $variable_enabled = $is_product_enabled == "yes" ? 'yes' : 'no';
                     $attributes = array();
                     // Enabled or disabled
                     $post_status = $variable_enabled == 'yes' ? 'publish' : 'private';
                     // Generate a useful post title
                     $variation_post_title = sprintf(__('Variation #%s of %s', 'wpai_woocommerce_addon_plugin'), absint($pid), $product_parent_post->post_title);
                     // Update or Add post
                     $variation = array('post_title' => $variation_post_title, 'post_content' => '', 'post_status' => $post_status, 'post_parent' => $product_parent_post_id, 'post_type' => 'product_variation');
                     if ($pid and !$is_new_product and !$this->is_update_data_allowed('is_update_status')) {
                         $variation['post_status'] = get_post_status($pid);
                     }
                     if (!$pid) {
                         if ($this->import->options['create_new_records']) {
                             $pid = wp_insert_post($variation);
                             //$logger and call_user_func($logger, sprintf(__('<b>CREATED</b>: %s variation from parent product %s.', 'wpai_woocommerce_addon_plugin'), $variation_post_title, $articleData['post_title']));
                             if ($create_new_variation) {
                                 $this->duplicate_post_meta($pid, $product_parent_post_id);
                                 //$this->pushmeta($pid, '_sku', 'v' . get_post_meta($pid, '_sku', true));
                                 // associate variation with import
                                 $postRecord->isEmpty() and $postRecord->set(array('post_id' => $pid, 'import_id' => $this->import->id, 'unique_key' => 'Variation ' . $parent_sku, 'product_key' => ''))->insert();
                                 $postRecord->set(array('iteration' => $this->import->iteration))->update();
                             }
                         }
                     } else {
                         if ($create_new_variation) {
                             if ("manual" != $this->import->options['duplicate_matching'] or $is_new_product) {
                                 $this->duplicate_post_meta($pid, $product_parent_post_id);
                             }
                             if (!$postRecord->isEmpty()) {
                                 $postRecord->set(array('iteration' => $this->import->iteration))->update();
                             }
                             if ("manual" == $this->import->options['duplicate_matching'] and !$is_new_product) {
                                 $create_new_variation = false;
                             }
                         }
                         $this->wpdb->update($this->wpdb->posts, $variation, array('ID' => $pid));
                         //$logger and call_user_func($logger, sprintf(__('<b>UPDATED</b>: %s variation for parent product %s.', 'wpai_woocommerce_addon_plugin'), $variation_post_title, $articleData['post_title']));
                     }
                     if (!$this->import->options['make_simple_product']) {
                         $create_new_variation = false;
                     }
                     if ($pid) {
                         if ($this->import->options['create_draft'] == "yes") {
                             $this->wpdb->update($this->wpdb->posts, array('post_status' => 'publish'), array('ID' => $pid));
                         }
                         if ($first_is_parent == "no") {
                             // if ($this->is_update_data_allowed('is_update_status'))
                             // {
                             // 	$this->wpdb->update( $this->wpdb->posts, array('post_status' => get_post_status($product_parent_post_id) ), array('ID' => $pid));
                             // }
                             $_v_product_manage_stock = $create_new_variation ? get_post_meta($product_parent_post_id, '_v_product_manage_stock', true) : $v_product_manage_stock[$i];
                             $_v_stock = $create_new_variation ? get_post_meta($product_parent_post_id, '_v_stock', true) : $v_stock[$i];
                             $_v_stock_status = $create_new_variation ? get_post_meta($product_parent_post_id, '_v_stock_status', true) : $v_stock_status[$i];
                             // Stock handling
                             $this->pushmeta($pid, '_manage_stock', $_v_product_manage_stock);
                             if ('yes' === $_v_product_manage_stock) {
                                 $this->is_update_cf('_stock') and update_post_meta($pid, '_stock', wc_stock_amount($_v_stock));
                             } else {
                                 $this->is_update_cf('_backorders') and delete_post_meta($pid, '_backorders');
                                 $this->is_update_cf('_stock') and delete_post_meta($pid, '_stock');
                             }
                             if (empty($this->import->options['set_parent_stock'])) {
                                 $this->pmwi_buf_prices($product_parent_post_id);
                                 $this->is_update_cf('_stock') and delete_post_meta($product_parent_post_id, '_stock');
                             }
                             // Only update stock status to user setting if changed by the user, but do so before looking at stock levels at variation level
                             if (!empty($_v_stock_status) and $this->is_update_cf('_stock_status')) {
                                 update_post_meta($pid, '_stock_status', $_v_stock_status);
                             }
                             if (pmwi_is_update_taxonomy($articleData, $this->import->options, 'product_shipping_class')) {
                                 if ($create_new_variation) {
                                     $v_shipping_class = get_post_meta($product_parent_post_id, '_v_shipping_class', true);
                                     $this->associate_terms($pid, array($v_shipping_class), 'product_shipping_class');
                                 } else {
                                     $this->associate_terms($pid, array($p_shipping_class), 'product_shipping_class');
                                 }
                             }
                         } else {
                             $stock_status = wc_clean($product_stock_status[$i]);
                             if ($stock_status and $this->is_update_cf('_stock_status')) {
                                 update_post_meta($pid, '_stock_status', $stock_status);
                             }
                             if (empty($articleData['ID']) or $this->is_update_cf('_tax_class')) {
                                 if ($product_tax_class[$i] !== 'parent') {
                                     $this->pushmeta($pid, '_tax_class', sanitize_text_field($product_tax_class[$i]));
                                 } else {
                                     delete_post_meta($pid, '_tax_class');
                                 }
                             }
                             if ($is_downloadable == 'yes') {
                                 $this->pushmeta($pid, '_download_limit', sanitize_text_field($product_download_limit[$i]));
                                 $this->pushmeta($pid, '_download_expiry', sanitize_text_field($product_download_expiry[$i]));
                                 $this->pushmeta($pid, '_download_type', sanitize_text_field($product_download_type[$i]));
                                 $_file_paths = array();
                                 if (!empty($product_files[$i])) {
                                     $file_paths = explode($this->import->options['product_files_delim'], $product_files[$i]);
                                     $file_names = explode($this->import->options['product_files_names_delim'], $product_files_names[$i]);
                                     foreach ($file_paths as $fn => $file_path) {
                                         $file_path = sanitize_text_field($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);
                             } else {
                                 $this->pushmeta($pid, '_download_limit', '');
                                 $this->pushmeta($pid, '_download_expiry', '');
                                 $this->pushmeta($pid, '_download_type', '');
                                 $this->pushmeta($pid, '_downloadable_files', '');
                             }
                         }
                         if ($this->import->options['update_all_data'] == 'yes' or $this->import->options['update_all_data'] == 'no' and $this->import->options['is_update_product_type']) {
                             //wp_set_object_terms( $pid, NULL, 'product_type' );
                             $this->associate_terms($pid, NULL, 'product_type');
                         }
                         // Remove old taxonomies attributes so data is kept up to date
                         if ($pid and ($this->import->options['update_all_data'] == "yes" or $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'])) {
                             // Update all Attributes
                             if ($this->import->options['update_all_data'] == "yes" or $this->import->options['update_attributes_logic'] == 'full_update') {
                                 $this->wpdb->query($this->wpdb->prepare("DELETE FROM {$this->wpdb->postmeta} WHERE meta_key LIKE 'attribute_%%' AND post_id = %d;", $pid));
                             }
                             wp_cache_delete($pid, 'post_meta');
                         }
                         // Update taxonomies
                         if ($this->import->options['update_all_data'] == "yes" or $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] or $is_new_product) {
                             if ($create_new_variation) {
                                 $parent_attributes = get_post_meta($product_parent_post_id, '_first_variation_attributes', true);
                                 if (!empty($parent_attributes)) {
                                     foreach ($parent_attributes as $key => $attr_data) {
                                         $attr_name = $key;
                                         if (intval($attr_data['is_taxonomy']) and (strpos($attr_name, "pa_") === false or strpos($attr_name, "pa_") !== 0)) {
                                             $attr_name = "pa_" . $attr_name;
                                         }
                                         // Update only these Attributes, leave the rest alone
                                         if (!$is_new_product and $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] and $this->import->options['update_attributes_logic'] == 'only') {
                                             if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                                 if (!in_array($attr_name, array_filter($this->import->options['attributes_list'], 'trim'))) {
                                                     continue;
                                                 }
                                             } else {
                                                 break;
                                             }
                                         }
                                         // Leave these attributes alone, update all other Attributes
                                         if (!$is_new_product and $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] and $this->import->options['update_attributes_logic'] == 'all_except') {
                                             if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                                 if (in_array($attr_name, array_filter($this->import->options['attributes_list'], 'trim'))) {
                                                     continue;
                                                 }
                                             }
                                         }
                                         $is_variation = intval($attr_data['is_variation']);
                                         if (intval($attr_data['is_taxonomy'])) {
                                             $cname = wc_attribute_taxonomy_name(preg_replace("%^pa_%", "", $attr_name));
                                             $this->associate_terms($pid, NULL, $cname);
                                         }
                                         if ($is_variation) {
                                             // Don't use woocommerce_clean as it destroys sanitized characters
                                             $values = substr(intval($attr_data['is_taxonomy']) ? $attr_data['value'] : $attr_data['value'], 0, 199);
                                             if (intval($attr_data['is_taxonomy'])) {
                                                 $cname = wc_attribute_taxonomy_name(preg_replace("%^pa_%", "", $attr_name));
                                                 $term = get_term_by('name', $values, $cname, ARRAY_A);
                                                 // For compatibility with WPML plugin
                                                 $term = apply_filters('wp_all_import_term_exists', $term, $cname, $values, null);
                                                 if (empty($term) and !is_wp_error($term)) {
                                                     $term = is_exists_term($values, $cname);
                                                     if (empty($term) and !is_wp_error($term)) {
                                                         $term = is_exists_term(htmlspecialchars($values), $cname);
                                                     }
                                                 }
                                                 if (!empty($term) and !is_wp_error($term)) {
                                                     $term = get_term_by('id', $term['term_id'], $cname);
                                                     if (!empty($term) and !is_wp_error($term)) {
                                                         update_post_meta($pid, 'attribute_' . sanitize_title($attr_name), $term->slug);
                                                     }
                                                 } else {
                                                     update_post_meta($pid, 'attribute_' . sanitize_title($attr_name), '');
                                                 }
                                             } else {
                                                 $attr_value = trim($attr_data['value']);
                                                 if ($attr_value != "") {
                                                     update_post_meta($pid, 'attribute_' . sanitize_title($attr_name), $attr_value);
                                                 } else {
                                                     delete_post_meta($pid, 'attribute_' . sanitize_title($attr_name));
                                                 }
                                             }
                                         } else {
                                             delete_post_meta($pid, 'attribute_' . sanitize_title($attr_name));
                                         }
                                     }
                                 }
                             } else {
                                 // $attr_names = array();
                                 foreach ($serialized_attributes as $anum => $attr_data) {
                                     $attr_name = $attr_data['names'][$i];
                                     if (empty($attr_name)) {
                                         continue;
                                     }
                                     // $attr_names[] = $attr_name;
                                     // Update only these Attributes, leave the rest alone
                                     if (!$is_new_product and $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] and $this->import->options['update_attributes_logic'] == 'only') {
                                         if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                             if (!in_array(intval($attr_data['in_taxonomy'][$i]) ? wc_attribute_taxonomy_name($attr_name) : $attr_name, array_filter($this->import->options['attributes_list'], 'trim'))) {
                                                 continue;
                                             }
                                         } else {
                                             break;
                                         }
                                     }
                                     // Leave these attributes alone, update all other Attributes
                                     if (!$is_new_product and $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] and $this->import->options['update_attributes_logic'] == 'all_except') {
                                         if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                             if (in_array($is_taxonomy ? wc_attribute_taxonomy_name($attr_name) : $attr_name, array_filter($this->import->options['attributes_list'], 'trim'))) {
                                                 continue;
                                             }
                                         }
                                     }
                                     if (intval($attr_data['in_taxonomy'][$i]) and (strpos($attr_name, "pa_") === false or strpos($attr_name, "pa_") !== 0)) {
                                         $attr_name = "pa_" . $attr_name;
                                     }
                                     $is_variation = intval($attr_data['in_variation'][$i]);
                                     if (intval($attr_data['in_taxonomy'][$i])) {
                                         $cname = wc_attribute_taxonomy_name(preg_replace("%^pa_%", "", $attr_name));
                                         $this->associate_terms($pid, NULL, $cname);
                                     }
                                     if ($is_variation) {
                                         // Don't use woocommerce_clean as it destroys sanitized characters
                                         $values = substr(intval($attr_data['in_taxonomy'][$i]) ? $attr_data['value'][$i] : $attr_data['value'][$i], 0, 199);
                                         if (intval($attr_data['in_taxonomy'][$i])) {
                                             $cname = wc_attribute_taxonomy_name(preg_replace("%^pa_%", "", $attr_name));
                                             $term = get_term_by('name', $values, $cname, ARRAY_A);
                                             // For compatibility with WPML plugin
                                             $term = apply_filters('wp_all_import_term_exists', $term, $cname, $values, null);
                                             if (empty($term) and !is_wp_error($term)) {
                                                 $term = is_exists_term($values, $cname);
                                                 if (empty($term) and !is_wp_error($term)) {
                                                     $term = is_exists_term(htmlspecialchars($values), $cname);
                                                 }
                                             }
                                             if (!empty($term) and !is_wp_error($term)) {
                                                 $term = get_term_by('id', $term['term_id'], $cname);
                                                 if (!empty($term) and !is_wp_error($term)) {
                                                     update_post_meta($pid, 'attribute_' . sanitize_title($attr_name), $term->slug);
                                                 }
                                             } else {
                                                 //$this->pushmeta($pid, 'attribute_' . sanitize_title( $attr_name ), '');
                                                 update_post_meta($pid, 'attribute_' . sanitize_title($attr_name), '');
                                             }
                                         } else {
                                             $attr_value = trim($values);
                                             if ($attr_value != "") {
                                                 update_post_meta($pid, 'attribute_' . sanitize_title($attr_name), $attr_value);
                                             } else {
                                                 delete_post_meta($pid, 'attribute_' . sanitize_title($attr_name));
                                             }
                                         }
                                     } else {
                                         delete_post_meta($pid, 'attribute_' . sanitize_title($attr_name));
                                     }
                                 }
                             }
                         }
                     }
                     $this->pmwi_buf_prices($product_parent_post_id);
                     if ($product_parent_post_id) {
                         wc_delete_product_transients($product_parent_post_id);
                     }
                     if ($create_new_variation) {
                         do_action('pmxi_saved_post', $pid, null);
                     }
                     do_action('pmxi_update_product_variation', $pid);
                     $create_new_variation = false;
                 }
             } else {
                 if ($first_is_parent == "no") {
                     update_post_meta($product_parent_post_id, '_v_product_manage_stock', $v_product_manage_stock[$i]);
                     update_post_meta($product_parent_post_id, '_v_stock', $v_stock[$i]);
                     update_post_meta($product_parent_post_id, '_v_stock_status', $v_stock_status[$i]);
                     update_post_meta($product_parent_post_id, '_v_variation_enabled', $product_enabled[$i]);
                     if (!empty($serialized_attributes)) {
                         $attributes = array();
                         $attribute_position = 0;
                         foreach ($serialized_attributes as $anum => $attr_data) {
                             $attr_name = $attr_data['names'][$i];
                             $is_visible = intval($attr_data['is_visible'][$i]);
                             $is_variation = intval($attr_data['in_variation'][$i]);
                             $is_taxonomy = intval($attr_data['in_taxonomy'][$i]);
                             // Custom attribute - Add attribute to array and set the values
                             $attributes[sanitize_title($attr_name)] = array('name' => sanitize_text_field($attr_name), 'value' => empty($attr_data['value'][$i]) ? '' : trim($attr_data['value'][$i]), 'position' => $attribute_position, 'is_visible' => $is_visible, 'is_variation' => $is_variation, 'is_taxonomy' => $is_taxonomy);
                             $attribute_position++;
                         }
                         update_post_meta($product_parent_post_id, '_first_variation_attributes', $attributes);
                     }
                     $this->pmwi_buf_prices($product_parent_post_id);
                     if (pmwi_is_update_taxonomy($articleData, $this->import->options, 'product_shipping_class')) {
                         update_post_meta($product_parent_post_id, '_v_shipping_class', $p_shipping_class);
                     }
                 }
             }
         }
         $previousID = get_option('wp_all_import_' . $this->import->id . '_parent_product');
         // [execute only for parent products]
         if (!isset($product_types[$i + 1]) or isset($product_types[$i + 1]) and !in_array($product_types[$i + 1], array('variation', 'variable')) or !empty($previousID) and (empty($product_parent_post_id) or $product_parent_post_id != $previousID or "yes" == $this->import->options['is_keep_former_posts'])) {
             $parent_product_ids = empty($previousID) ? array() : array($previousID);
             if (!isset($product_types[$i + 1]) and !empty($product_parent_post_id) and !in_array($product_parent_post_id, $parent_product_ids)) {
                 $parent_product_ids[] = $product_parent_post_id;
             }
             if (!isset($product_types[$i + 1]) and !empty($pid) and !in_array($pid, $parent_product_ids)) {
                 $parent_product_ids[] = $pid;
             }
             foreach ($parent_product_ids as $post_parent) {
                 $children = get_posts(array('post_parent' => $post_parent, 'posts_per_page' => -1, 'post_type' => 'product_variation', 'fields' => 'ids', 'orderby' => 'ID', 'order' => 'ASC', 'post_status' => array('draft', 'publish', 'trash', 'pending', 'future', 'private')));
                 if (count($children)) {
                     $product_type_term = is_exists_term('variable', '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');
                     }
                     $lowest_price = $lowest_regular_price = $lowest_sale_price = $highest_price = $highest_regular_price = $highest_sale_price = '';
                     $lowest_price_id = $lowest_regular_price_id = $lowest_sale_price_id = $highest_price_id = $highest_regular_price_id = $highest_sale_price_id = '';
                     $total_instock = 0;
                     if ($children) {
                         foreach ($children as $n => $child) {
                             $_variation_stock = get_post_meta($child, '_stock_status', true);
                             $total_instock += $_variation_stock == 'instock' ? 1 : 0;
                             $child_price = get_post_meta($child, '_price', true);
                             $child_regular_price = get_post_meta($child, '_regular_price', true);
                             $child_sale_price = get_post_meta($child, '_sale_price', true);
                             // Regular prices
                             if (empty($lowest_regular_price) || (double) $child_regular_price < (double) $lowest_regular_price) {
                                 $lowest_regular_price = $child_regular_price;
                                 $lowest_regular_price_id = $child;
                             }
                             if (empty($highest_regular_price) || (double) $child_regular_price > (double) $highest_regular_price) {
                                 $highest_regular_price = $child_regular_price;
                                 $highest_regular_price_id = $child;
                             }
                             // Sale prices
                             if ($child_price == $child_sale_price) {
                                 if ($child_sale_price !== '' && (!is_numeric($lowest_sale_price) || (double) $child_sale_price < (double) $lowest_sale_price)) {
                                     $lowest_sale_price = $child_sale_price;
                                     $lowest_sale_price_id = $child;
                                 }
                                 if ($child_sale_price !== '' && (!is_numeric($highest_sale_price) || (double) $child_sale_price > (double) $highest_sale_price)) {
                                     $highest_sale_price = $child_sale_price;
                                     $highest_sale_price_id = $child;
                                 }
                             }
                         }
                         $lowest_price = $lowest_sale_price === '' || (double) $lowest_regular_price < (double) $lowest_sale_price ? $lowest_regular_price : $lowest_sale_price;
                         $highest_price = $highest_sale_price === '' || (double) $highest_regular_price > (double) $highest_sale_price ? $highest_regular_price : $highest_sale_price;
                         $lowest_price_id = $lowest_sale_price === '' || (double) $lowest_regular_price < (double) $lowest_sale_price ? $lowest_regular_price_id : $lowest_sale_price_id;
                         $highest_price_id = $highest_sale_price === '' || (double) $highest_regular_price > (double) $highest_sale_price ? $highest_regular_price_id : $highest_sale_price_id;
                     }
                     //$parent_manage_stock = get_post_meta($post_parent, '_manage_stock', true);
                     $this->pushmeta($post_parent, '_stock_status', $total_instock > 0 ? 'instock' : 'outofstock');
                     $this->pushmeta($post_parent, '_price', $lowest_price);
                     update_post_meta($post_parent, '_min_variation_price', $lowest_price);
                     update_post_meta($post_parent, '_max_variation_price', $highest_price);
                     update_post_meta($post_parent, '_min_variation_regular_price', $lowest_regular_price);
                     update_post_meta($post_parent, '_max_variation_regular_price', $highest_regular_price);
                     update_post_meta($post_parent, '_min_variation_sale_price', $lowest_sale_price);
                     update_post_meta($post_parent, '_max_variation_sale_price', $highest_sale_price);
                     update_post_meta($post_parent, '_min_price_variation_id', $lowest_price_id);
                     update_post_meta($post_parent, '_max_price_variation_id', $highest_price_id);
                     update_post_meta($post_parent, '_min_regular_price_variation_id', $lowest_regular_price_id);
                     update_post_meta($post_parent, '_max_regular_price_variation_id', $highest_regular_price_id);
                     update_post_meta($post_parent, '_min_sale_price_variation_id', $lowest_sale_price_id);
                     update_post_meta($post_parent, '_max_sale_price_variation_id', $highest_sale_price_id);
                     // Update default attribute options setting
                     if ($this->import->options['update_all_data'] == "yes" or $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] or $is_new_product) {
                         $default_attributes = array();
                         $parent_attributes = array();
                         $unique_attributes = array();
                         $attribute_position = 0;
                         $is_update_attributes = true;
                         foreach ($children as $child) {
                             $child_attributes = (array) maybe_unserialize(get_post_meta($child, '_product_attributes', true));
                             foreach ($child_attributes as $attr) {
                                 if (empty($attr['name'])) {
                                     continue;
                                 }
                                 if (!in_array($attr['name'], $unique_attributes)) {
                                     $attributes[] = $attr;
                                     $unique_attributes[] = $attr['name'];
                                 }
                             }
                         }
                         foreach ($attributes as $attribute) {
                             $default_attributes[sanitize_title($attribute['name'])] = "";
                             $values = array();
                             foreach ($children as $child_number => $child) {
                                 $value = array();
                                 if ($attribute['is_variation']) {
                                     $value = array_map('stripslashes', array_map('strip_tags', explode("|", trim(get_post_meta($child, 'attribute_' . sanitize_title($attribute['name']), true)))));
                                 } else {
                                     $child_attributes = (array) maybe_unserialize(get_post_meta($child, '_product_attributes', true));
                                     if (!empty($child_attributes[sanitize_title($attribute['name'])])) {
                                         $value = array_map('stripslashes', array_map('strip_tags', explode("|", trim($child_attributes[sanitize_title($attribute['name'])]['value']))));
                                     }
                                 }
                                 if (is_array($value) and isset($value[0])) {
                                     //$this->pushmeta($child, 'attribute_' . sanitize_title( $attribute['name'] ), $value[0]);
                                     foreach ($value as $val) {
                                         if ($attribute['is_taxonomy']) {
                                             $term = get_term_by('slug', $val, $attribute['name'], ARRAY_A);
                                             // For compatibility with WPML plugin
                                             $term = apply_filters('wp_all_import_term_exists', $term, $attribute['name'], $val, null);
                                             if (!empty($term) and !is_wp_error($term)) {
                                                 $val = $term['name'];
                                             }
                                         }
                                         if (trim($val) != "" and !in_array($val, $values, true)) {
                                             $values[] = trim($val);
                                         }
                                     }
                                 }
                                 if ($attribute['is_variation']) {
                                     if (isset($values[0]) and empty($default_attributes[$attribute['name']])) {
                                         switch ($this->import->options['default_attributes_type']) {
                                             case 'instock':
                                                 $is_instock = get_post_meta($child, '_stock_status', true);
                                                 if ($is_instock == 'instock') {
                                                     $default_attributes[sanitize_title($attribute['name'])] = sanitize_title(is_array($value) ? $value[0] : $value);
                                                 }
                                                 break;
                                             case 'first':
                                                 if ($first_is_parent != "no" or $first_is_parent == "no" and !$this->import->options['make_simple_product']) {
                                                     $default_attributes[sanitize_title($attribute['name'])] = sanitize_title(is_array($values) ? $values[0] : $values);
                                                 } elseif ($first_is_parent == "no" and $child_number) {
                                                     if (is_array($values) and isset($values[1])) {
                                                         $default_attributes[sanitize_title($attribute['name'])] = sanitize_title($values[1]);
                                                     } else {
                                                         $default_attributes[sanitize_title($attribute['name'])] = sanitize_title(is_array($values) ? $values[0] : $values);
                                                     }
                                                 }
                                                 break;
                                             default:
                                                 # code...
                                                 break;
                                         }
                                     }
                                 }
                             }
                             // Update only these Attributes, leave the rest alone
                             if (!$is_new_product and $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] and $this->import->options['update_attributes_logic'] == 'only') {
                                 if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                     if (!in_array($attribute['name'], array_filter($this->import->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->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] and $this->import->options['update_attributes_logic'] == 'all_except') {
                                 if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                     if (in_array($attribute['name'], array_filter($this->import->options['attributes_list'], 'trim'))) {
                                         $attribute_position++;
                                         continue;
                                     }
                                 }
                             }
                             // $values = array_filter($values);
                             if ($attribute['is_taxonomy']) {
                                 if (!empty($values)) {
                                     // Remove empty items in the array
                                     $values = array_filter($values, array($this, "filtering"));
                                     $attr_values = array();
                                     foreach ($values as $key => $value) {
                                         $term = get_term_by('name', $value, $attribute['name'], ARRAY_A);
                                         // For compatibility with WPML plugin
                                         $term = apply_filters('wp_all_import_term_exists', $term, $attribute['name'], $value, null);
                                         if (empty($term) and !is_wp_error($term)) {
                                             $term = is_exists_term($value, $attribute['name']);
                                             if (empty($term) and !is_wp_error($term)) {
                                                 $term = is_exists_term(htmlspecialchars($value), $attribute['name']);
                                                 if (empty($term) and !is_wp_error($term) and $attribute['is_create_taxonomy_terms']) {
                                                     $term = wp_insert_term($value, $attribute['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 ($values and taxonomy_exists($attribute['name'])) {
                                     $this->associate_terms($post_parent, $values, $attribute['name']);
                                 }
                                 //do_action('wpai_parent_set_object_terms', $post_parent, $attribute['name']);
                                 if ($values) {
                                     // Add attribute to array, but don't set values
                                     $parent_attributes[sanitize_title($attribute['name'])] = array('name' => $attribute['name'], 'value' => '', 'position' => $attribute_position, 'is_visible' => $attribute['is_visible'], 'is_variation' => $attribute['is_variation'], 'is_taxonomy' => 1, 'is_create_taxonomy_terms' => $attribute['is_create_taxonomy_terms']);
                                 }
                             } else {
                                 if (!empty($values)) {
                                     $parent_attributes[sanitize_title($attribute['name'])] = array('name' => sanitize_text_field($attribute['name']), 'value' => implode('|', $values), 'position' => $attribute_position, 'is_visible' => $attribute['is_visible'], 'is_variation' => $attribute['is_variation'], 'is_taxonomy' => 0);
                                 }
                             }
                             $attribute_position++;
                         }
                         if ($this->import->options['is_default_attributes'] and (empty($articleData['ID']) or $this->import->options['update_all_data'] == "yes" or $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'])) {
                             $this->pushmeta($post_parent, '_default_attributes', $default_attributes);
                         }
                         if ($is_new_product or $this->import->options['update_all_data'] == "yes" or $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes']) {
                             $current_product_attributes = get_post_meta($post_parent, '_product_attributes', true);
                             update_post_meta($post_parent, '_product_attributes', !empty($current_product_attributes) ? array_merge($current_product_attributes, $parent_attributes) : $parent_attributes);
                         }
                     }
                     if (count($children) == 1 and $this->import->options['make_simple_product'] and $first_is_parent == "no") {
                         // and "manual" != $this->import->options['duplicate_matching']
                         $this->make_simple_product($post_parent);
                     }
                     if ($this->import->options['make_simple_product']) {
                         // and "manual" != $this->import->options['duplicate_matching']
                         $product_attributes = get_post_meta($post_parent, '_product_attributes', true);
                         if (empty($product_attributes)) {
                             $this->make_simple_product($post_parent);
                         }
                     }
                 } elseif ($this->import->options['make_simple_product']) {
                     // and "manual" != $this->import->options['duplicate_matching']
                     $this->make_simple_product($post_parent);
                 }
                 wc_delete_product_transients($post_parent);
                 do_action('wp_all_import_variable_product_imported', $post_parent);
             }
         }
         // \[execute only for parent products]
         update_option('wp_all_import_' . $this->import->id . '_parent_product', $product_parent_post_id ? $product_parent_post_id : $pid);
     } elseif (in_array($product_type, array('variable'))) {
         // Link All Variations
         if ("variable" == $product_type and $this->import->options['link_all_variations'] and ($this->import->options['update_all_data'] == "yes" or $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_attributes'] or $is_new_product)) {
             $added_variations = $this->pmwi_link_all_variations($pid, $this->import->options, $this->import->id, $this->import->iteration);
             $logger and call_user_func($logger, sprintf(__('<b>CREATED</b>: %s variations for parent product %s.', 'wpai_woocommerce_addon_plugin'), $added_variations, $articleData['post_title']));
         }
         // Variable products have no prices
         $this->pmwi_buf_prices($pid);
     }
     if (in_array($product_type, array('grouped'))) {
         $this->pushmeta($pid, '_regular_price', '');
         $this->pushmeta($pid, '_sale_price', '');
         $this->pushmeta($pid, '_sale_price_dates_from', '');
         $this->pushmeta($pid, '_sale_price_dates_to', '');
         $this->pushmeta($pid, '_price', '');
     }
     //$this->executeSQL();
     // Find children elements by XPath and create variations
     if ("variable" == $product_type and "xml" == $this->import->options['matching_parent'] and "" != $this->import->options['variations_xpath'] and !$this->import->options['link_all_variations'] and ("" != $this->import->options['variable_sku'] or empty($this->import->options['disable_auto_sku_generation']))) {
         $logger and call_user_func($logger, __('- Importing Variations', 'wpai_woocommerce_addon_plugin'));
         $variation_xpath = $cxpath . '[' . ($i + 1) . ']/' . ltrim(trim(str_replace("[*]", "", $this->import->options['variations_xpath']), '{}'), '/');
         $records = array();
         $variations = XmlImportParser::factory($xml, $variation_xpath, '/', $file)->parse($records);
         $tmp_files[] = $file;
         $count_variations = count($variations);
         if ($count_variations > 0) {
             // Variation SKUs
             if ($this->import->options['variable_sku'] != "") {
                 $variation_sku = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_sku'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 $count_variations and $variation_sku = array_fill(0, $count_variations, '');
             }
             // Composing product is Manage stock
             if ($this->import->options['is_variable_product_manage_stock'] == 'xpath' and "" != $this->import->options['single_variable_product_manage_stock']) {
                 if ($this->import->options['single_variable_product_manage_stock_use_parent']) {
                     $parent_variable_product_manage_stock = XmlImportParser::factory($xml, $cxpath, $this->import->options['single_variable_product_manage_stock'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_product_manage_stock = array_fill(0, $count_variations, $parent_variable_product_manage_stock[$i]);
                 } else {
                     $variation_product_manage_stock = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['single_variable_product_manage_stock'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_product_manage_stock = array_fill(0, $count_variations, $this->import->options['is_variable_product_manage_stock']);
             }
             // Variation Description
             if ($this->import->options['variable_description'] != "") {
                 if ($this->import->options['variable_description_use_parent']) {
                     $parent_variation_description = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_description'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_description = array_fill(0, $count_variations, $parent_variation_description[$i]);
                 } else {
                     $variation_description = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_description'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_description = array_fill(0, $count_variations, '');
             }
             // Stock Qty
             if ($this->import->options['variable_stock'] != "") {
                 if ($this->import->options['variable_stock_use_parent']) {
                     $parent_variation_stock = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_stock'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_stock = array_fill(0, $count_variations, $parent_variation_stock[$i]);
                 } else {
                     $variation_stock = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_stock'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_stock = array_fill(0, $count_variations, '');
             }
             // Stock Status
             if ($this->import->options['variable_stock_status'] == 'xpath' and "" != $this->import->options['single_variable_stock_status']) {
                 $variable_stock_status = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['single_variable_stock_status'], $file)->parse($records);
                 $tmp_files[] = $file;
             } elseif ($this->import->options['variable_stock_status'] == 'auto') {
                 $count_variations and $variable_stock_status = array_fill(0, $count_variations, $this->import->options['variable_stock_status']);
                 foreach ($variation_stock as $key => $value) {
                     $variable_stock_status[$key] = (int) $value <= 0 ? 'outofstock' : 'instock';
                 }
             } else {
                 $count_variations and $variable_stock_status = array_fill(0, $count_variations, $this->import->options['variable_stock_status']);
             }
             // Composing product Allow Backorders?
             if ($import->options['variable_allow_backorders'] == 'xpath' and "" != $import->options['single_variable_allow_backorders']) {
                 $variable_allow_backorders = XmlImportParser::factory($xml, $variation_xpath, $import->options['single_variable_allow_backorders'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 $count_variations and $variable_allow_backorders = array_fill(0, $count_variations, $import->options['variable_allow_backorders']);
             }
             // Image
             $variation_image = array();
             if ($this->import->options['variable_image']) {
                 if ($this->import->options['variable_image_use_parent']) {
                     $parent_image = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_image'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_image = array_fill(0, $count_variations, $parent_image[$i]);
                 } else {
                     $variation_image = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_image'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_image = array_fill(0, $count_variations, '');
             }
             // Regular Price
             if (!empty($this->import->options['variable_regular_price'])) {
                 if ($this->import->options['variable_regular_price_use_parent']) {
                     $parent_regular_price = array_map(array($this, 'adjust_price'), array_map(array($this, 'prepare_price'), XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_regular_price'], $file)->parse($records)), array_fill(0, $count_variations, "variable_regular_price"));
                     $tmp_files[] = $file;
                     $count_variations and $variation_regular_price = array_fill(0, $count_variations, $parent_regular_price[$i]);
                 } else {
                     $variation_regular_price = array_map(array($this, 'prepare_price'), XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_regular_price'], $file)->parse($records));
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_regular_price = array_fill(0, $count_variations, '');
             }
             // Sale Price
             if (!empty($this->import->options['variable_sale_price'])) {
                 if ($this->import->options['variable_sale_price_use_parent']) {
                     $parent_sale_price = array_map(array($this, 'adjust_price'), array_map(array($this, 'prepare_price'), XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_sale_price'], $file)->parse($records)), array_fill(0, $count_variations, "variable_sale_price"));
                     $tmp_files[] = $file;
                     $count_variations and $variation_sale_price = array_fill(0, $count_variations, $parent_sale_price[$i]);
                 } else {
                     $variation_sale_price = array_map(array($this, 'prepare_price'), XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_sale_price'], $file)->parse($records));
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_sale_price = array_fill(0, $count_variations, '');
             }
             // Who Sale Price
             if (!empty($this->import->options['variable_whosale_price'])) {
                 if ($this->import->options['variable_whosale_price_use_parent']) {
                     $parent_whosale_price = array_map(array($this, 'prepare_price'), XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_whosale_price'], $file)->parse($records));
                     $tmp_files[] = $file;
                     $count_variations and $variation_whosale_price = array_fill(0, $count_variations, $parent_whosale_price[$i]);
                 } else {
                     $variation_whosale_price = array_map(array($this, 'prepare_price'), XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_whosale_price'], $file)->parse($records));
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_whosale_price = array_fill(0, $count_variations, '');
             }
             if ($this->import->options['is_variable_sale_price_shedule']) {
                 // Sale price dates from
                 if (!empty($this->import->options['variable_sale_price_dates_from'])) {
                     if ($this->import->options['variable_sale_dates_use_parent']) {
                         $parent_sale_date_start = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_sale_price_dates_from'], $file)->parse($records);
                         $tmp_files[] = $file;
                         $count_variations and $variation_sale_price_dates_from = array_fill(0, $count_variations, $parent_sale_date_start[$i]);
                     } else {
                         $variation_sale_price_dates_from = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_sale_price_dates_from'], $file)->parse($records);
                         $tmp_files[] = $file;
                     }
                 } else {
                     $count_variations and $variation_sale_price_dates_from = array_fill(0, $count_variations, '');
                 }
                 // Sale price dates to
                 if (!empty($this->import->options['variable_sale_price_dates_to'])) {
                     if ($this->import->options['variable_sale_dates_use_parent']) {
                         $parent_sale_date_end = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_sale_price_dates_to'], $file)->parse($records);
                         $tmp_files[] = $file;
                         $count_variations and $variation_sale_price_dates_to = array_fill(0, $count_variations, $parent_sale_date_end[$i]);
                     } else {
                         $variation_sale_price_dates_to = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_sale_price_dates_to'], $file)->parse($records);
                         $tmp_files[] = $file;
                     }
                 } else {
                     $count_variations and $variation_sale_price_dates_to = array_fill(0, $count_variations, '');
                 }
             }
             // Composing product is Virtual
             if ($this->import->options['is_variable_product_virtual'] == 'xpath' and "" != $this->import->options['single_variable_product_virtual']) {
                 if ($this->import->options['single_variable_product_virtual_use_parent']) {
                     $parent_variable_product_virtual = XmlImportParser::factory($xml, $cxpath, $this->import->options['single_variable_product_virtual'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_product_virtual = array_fill(0, $count_variations, $parent_variable_product_virtual[$i]);
                 } else {
                     $variation_product_virtual = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['single_variable_product_virtual'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_product_virtual = array_fill(0, $count_variations, $this->import->options['is_variable_product_virtual']);
             }
             // Composing product is Downloadable
             if ($this->import->options['is_variable_product_downloadable'] == 'xpath' and "" != $this->import->options['single_variable_product_downloadable']) {
                 if ($this->import->options['single_variable_product_downloadable_use_parent']) {
                     $parent_variable_product_downloadable = XmlImportParser::factory($xml, $cxpath, $this->import->options['single_variable_product_downloadable'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_product_downloadable = array_fill(0, $count_variations, $parent_variable_product_downloadable[$i]);
                 } else {
                     $variation_product_downloadable = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['single_variable_product_downloadable'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_product_downloadable = array_fill(0, $count_variations, $this->import->options['is_variable_product_downloadable']);
             }
             // Weigth
             if (!empty($this->import->options['variable_weight'])) {
                 if ($this->import->options['variable_weight_use_parent']) {
                     $parent_weight = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_weight'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_weight = array_fill(0, $count_variations, $parent_weight[$i]);
                 } else {
                     $variation_weight = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_weight'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_weight = array_fill(0, $count_variations, '');
             }
             // Length
             if (!empty($this->import->options['variable_length'])) {
                 if ($this->import->options['variable_dimensions_use_parent']) {
                     $parent_length = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_length'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_length = array_fill(0, $count_variations, $parent_length[$i]);
                 } else {
                     $variation_length = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_length'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_length = array_fill(0, $count_variations, '');
             }
             // Width
             if (!empty($this->import->options['variable_width'])) {
                 if ($this->import->options['variable_dimensions_use_parent']) {
                     $parent_width = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_width'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_width = array_fill(0, $count_variations, $parent_width[$i]);
                 } else {
                     $variation_width = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_width'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_width = array_fill(0, $count_variations, '');
             }
             // Heigth
             if (!empty($this->import->options['variable_height'])) {
                 if ($this->import->options['variable_dimensions_use_parent']) {
                     $parent_heigth = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_height'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_height = array_fill(0, $count_variations, $parent_heigth[$i]);
                 } else {
                     $variation_height = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_height'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_height = array_fill(0, $count_variations, '');
             }
             // Composing product Shipping Class
             if ($this->import->options['is_multiple_variable_product_shipping_class'] != 'yes' and "" != $this->import->options['single_variable_product_shipping_class']) {
                 if ($this->import->options['single_variable_product_shipping_class_use_parent']) {
                     $parent_shipping_class = XmlImportParser::factory($xml, $cxpath, $this->import->options['single_variable_product_shipping_class'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_product_shipping_class = array_fill(0, $count_variations, $parent_shipping_class[$i]);
                 } else {
                     $variation_product_shipping_class = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['single_variable_product_shipping_class'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_product_shipping_class = array_fill(0, $count_variations, $this->import->options['multiple_variable_product_shipping_class']);
             }
             // Composing product Tax Class
             if ($this->import->options['is_multiple_variable_product_tax_class'] != 'yes' and "" != $this->import->options['single_variable_product_tax_class']) {
                 if ($this->import->options['single_variable_product_tax_class_use_parent']) {
                     $parent_tax_class = XmlImportParser::factory($xml, $cxpath, $this->import->options['single_variable_product_tax_class'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_product_tax_class = array_fill(0, $count_variations, $parent_tax_class[$i]);
                 } else {
                     $variation_product_tax_class = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['single_variable_product_tax_class'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_product_tax_class = array_fill(0, $count_variations, $this->import->options['multiple_variable_product_tax_class']);
             }
             // Download limit
             if (!empty($this->import->options['variable_download_limit'])) {
                 if ($this->import->options['variable_download_limit_use_parent']) {
                     $parent_download_limit = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_download_limit'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_download_limit = array_fill(0, $count_variations, $parent_download_limit[$i]);
                 } else {
                     $variation_download_limit = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_download_limit'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_download_limit = array_fill(0, $count_variations, '');
             }
             // Download expiry
             if (!empty($this->import->options['variable_download_expiry'])) {
                 if ($this->import->options['variable_download_expiry_use_parent']) {
                     $parent_download_expiry = XmlImportParser::factory($xml, $cxpath, $this->import->options['variable_download_expiry'], $file)->parse($records);
                     $tmp_files[] = $file;
                     $count_variations and $variation_download_expiry = array_fill(0, $count_variations, $parent_download_expiry[$i]);
                 } else {
                     $variation_download_expiry = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_download_expiry'], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             } else {
                 $count_variations and $variation_download_expiry = array_fill(0, $count_variations, '');
             }
             // File paths
             if (!empty($this->import->options['variable_file_paths'])) {
                 $variation_file_paths = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_file_paths'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 $count_variations and $variation_file_paths = array_fill(0, $count_variations, '');
             }
             // File names
             if (!empty($this->import->options['variable_file_names'])) {
                 $variation_file_names = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_file_names'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 $count_variations and $variation_file_names = array_fill(0, $count_variations, '');
             }
             // Variation enabled
             if ($this->import->options['is_variable_product_enabled'] == 'xpath' and "" != $this->import->options['single_variable_product_enabled']) {
                 $variation_product_enabled = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['single_variable_product_enabled'], $file)->parse($records);
                 $tmp_files[] = $file;
             } else {
                 $count_variations and $variation_product_enabled = array_fill(0, $count_variations, $this->import->options['is_variable_product_enabled']);
             }
             $variation_attribute_keys = array();
             $variation_attribute_values = array();
             $variation_attribute_in_variation = array();
             $variation_attribute_is_visible = array();
             $variation_attribute_in_taxonomy = array();
             $variable_create_terms_in_not_exists = array();
             if (!empty($this->import->options['variable_attribute_name'][0])) {
                 foreach ($this->import->options['variable_attribute_name'] as $j => $attribute_name) {
                     if ($attribute_name == "") {
                         continue;
                     }
                     $variation_attribute_keys[$j] = XmlImportParser::factory($xml, $variation_xpath, $attribute_name, $file)->parse($records);
                     $tmp_files[] = $file;
                     $variation_attribute_values[$j] = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_attribute_value'][$j], $file)->parse($records);
                     $tmp_files[] = $file;
                     $variation_attribute_in_variation[$j] = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_in_variations'][$j], $file)->parse($records);
                     $tmp_files[] = $file;
                     $variation_attribute_is_visible[$j] = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_is_visible'][$j], $file)->parse($records);
                     $tmp_files[] = $file;
                     $variation_attribute_in_taxonomy[$j] = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_is_taxonomy'][$j], $file)->parse($records);
                     $tmp_files[] = $file;
                     $variable_create_terms_in_not_exists[$j] = XmlImportParser::factory($xml, $variation_xpath, $this->import->options['variable_create_taxonomy_in_not_exists'][$j], $file)->parse($records);
                     $tmp_files[] = $file;
                 }
             }
             // serialized attributes for product variations
             $variation_serialized_attributes = array();
             if (!empty($variation_attribute_keys)) {
                 foreach ($variation_attribute_keys as $j => $attribute_name) {
                     if (!in_array($attribute_name[0], array_keys($variation_serialized_attributes))) {
                         $variation_serialized_attributes[$attribute_name[0]] = array('value' => $variation_attribute_values[$j], 'is_visible' => $variation_attribute_is_visible[$j], 'in_variation' => $variation_attribute_in_variation[$j], 'in_taxonomy' => $variation_attribute_in_taxonomy[$j], 'is_create_taxonomy_terms' => $variable_create_terms_in_not_exists[$j]);
                     }
                 }
             }
             // Create Variations
             foreach ($variations as $j => $void) {
                 $variation_sku_for_title = "" == $variation_sku[$j] ? $j : $variation_sku[$j];
                 if ($this->import->options['variable_sku_add_parent']) {
                     $variation_sku[$j] = $product_sku[$i] . '-' . $variation_sku[$j];
                     $variation_sku_for_title = $product_sku[$i] . '-' . $variation_sku[$j];
                 }
                 $is_variation_have_attributes = false;
                 foreach ($variation_serialized_attributes as $attr => $attr_options) {
                     if ($attr_options['in_variation'][$j] && $attr_options['value'][$j] != '') {
                         $is_variation_have_attributes = true;
                         break;
                     }
                 }
                 // do not create variation if it doesn't have attributes
                 if (!$is_variation_have_attributes && $this->import->options['make_simple_product']) {
                     continue;
                 }
                 $variable_enabled = $variation_product_enabled[$j] == "yes" ? 'yes' : 'no';
                 // Enabled or disabled
                 $post_status = $variable_enabled == 'yes' ? 'publish' : 'private';
                 $variation_to_update_id = false;
                 $postRecord = new PMXI_Post_Record();
                 $postRecord->clear();
                 // Generate a useful post title
                 $variation_post_title = sprintf(__('Variation #%s of %s', 'wpai_woocommerce_addon_plugin'), $variation_sku_for_title, $articleData['post_title']);
                 // handle duplicates according to import settings
                 /*if ($duplicates = pmxi_findDuplicates(array('post_title' => $variation_post_title, 'post_type' => 'product_variation', 'post_parent' => $pid),'','','parent')) {															
                 			$duplicate_id = array_shift($duplicates);							
                 			if ($duplicate_id) {														
                 				$variation_to_update = get_post($variation_to_update_id = $duplicate_id);
                 			}						
                 		}	*/
                 // Update or Add post
                 $variation = array('post_title' => $variation_post_title, 'post_content' => '', 'post_status' => $post_status, 'post_parent' => $pid, 'post_type' => 'product_variation');
                 $variation_just_created = false;
                 $postRecord->getBy(array('unique_key' => 'Variation ' . $variation_sku_for_title . ' of ' . $pid, 'import_id' => $this->import->id));
                 if (!$postRecord->isEmpty()) {
                     $variation_to_update_id = $postRecord->post_id;
                     $postRecord->set(array('iteration' => $this->import->iteration))->update();
                 }
                 if (!$variation_to_update_id) {
                     $variation_to_update_id = wp_insert_post($variation);
                     // associate variation with import
                     $postRecord->isEmpty() and $postRecord->set(array('post_id' => $variation_to_update_id, 'import_id' => $this->import->id, 'unique_key' => 'Variation ' . $variation_sku_for_title . ' of ' . $pid, 'product_key' => ''))->insert();
                     $postRecord->set(array('iteration' => $this->import->iteration))->update();
                     $variation_just_created = true;
                     $logger and call_user_func($logger, sprintf(__('- `%s`: variation created successfully', 'wpai_woocommerce_addon_plugin'), sprintf(__('Variation #%s of %s', 'wpai_woocommerce_addon_plugin'), absint($variation_to_update_id), esc_html(get_the_title($pid)))));
                 } else {
                     $this->wpdb->update($this->wpdb->posts, $variation, array('ID' => $variation_to_update_id));
                     //do_action( 'woocommerce_update_product_variation', $variation_to_update_id );
                     $logger and call_user_func($logger, sprintf(__('- `%s`: variation updated successfully', 'wpai_woocommerce_addon_plugin'), $variation_post_title));
                     if ($this->import->options['update_all_data'] == 'yes' or $this->import->options['update_all_data'] == 'no' and $this->import->options['is_update_attachments']) {
                         $logger and call_user_func($logger, sprintf(__('Deleting attachments for `%s`', 'wp_all_import_plugin'), $variation_post_title));
                         wp_delete_attachments($variation_to_update_id, true, 'files');
                     }
                     // handle obsolete attachments (i.e. delete or keep) according to import settings
                     if ($this->import->options['update_all_data'] == 'yes' or $this->import->options['update_all_data'] == 'no' and $this->import->options['is_update_images'] and $this->import->options['update_images_logic'] == "full_update") {
                         $logger and call_user_func($logger, sprintf(__('Deleting images for `%s`', 'wp_all_import_plugin'), $variation_post_title));
                         wp_delete_attachments($variation_to_update_id, !$this->import->options['do_not_remove_images'], 'images');
                     }
                 }
                 do_action('pmxi_update_product_variation', $variation_to_update_id);
                 $existing_variation_meta_keys = array();
                 foreach (get_post_meta($variation_to_update_id, '') as $cur_meta_key => $cur_meta_val) {
                     $existing_variation_meta_keys[] = $cur_meta_key;
                 }
                 // delete keys which are no longer correspond to import settings
                 if (!empty($existing_variation_meta_keys)) {
                     foreach ($existing_variation_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;
                         }
                         // Update all data
                         if ($this->import->options['update_all_data'] == 'yes' or $variation_just_created) {
                             delete_post_meta($variation_to_update_id, $cur_meta_key);
                             continue;
                         }
                         // Do not update attributes
                         if (!$this->import->options['is_update_attributes'] and (in_array($cur_meta_key, array('_default_attributes', '_product_attributes')) or strpos($cur_meta_key, "attribute_") === 0)) {
                             continue;
                         }
                         // Update only these Attributes, leave the rest alone
                         if ($this->import->options['is_update_attributes'] and $this->import->options['update_attributes_logic'] == 'only') {
                             if ($cur_meta_key == '_product_attributes') {
                                 $current_product_attributes = get_post_meta($variation_to_update_id, '_product_attributes', true);
                                 if (!empty($current_product_attributes) and !empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                     foreach ($current_product_attributes as $attr_name => $attr_value) {
                                         if (in_array($attr_name, array_filter($this->import->options['attributes_list'], 'trim'))) {
                                             unset($current_product_attributes[$attr_name]);
                                         }
                                     }
                                 }
                                 update_post_meta($variation_to_update_id, '_product_attributes', $current_product_attributes);
                                 continue;
                             }
                             if (strpos($cur_meta_key, "attribute_") === 0 and !empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list']) and !in_array(str_replace("attribute_", "", $cur_meta_key), array_filter($this->import->options['attributes_list'], 'trim'))) {
                                 continue;
                             }
                             if (in_array($cur_meta_key, array('_default_attributes'))) {
                                 continue;
                             }
                         }
                         // Leave these attributes alone, update all other Attributes
                         if ($this->import->options['is_update_attributes'] and $this->import->options['update_attributes_logic'] == 'all_except') {
                             if ($cur_meta_key == '_product_attributes') {
                                 if (empty($this->import->options['attributes_list'])) {
                                     delete_post_meta($variation_to_update_id, $cur_meta_key);
                                     continue;
                                 }
                                 $current_product_attributes = get_post_meta($variation_to_update_id, '_product_attributes', true);
                                 if (!empty($current_product_attributes) and !empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                     foreach ($current_product_attributes as $attr_name => $attr_value) {
                                         if (!in_array($attr_name, array_filter($this->import->options['attributes_list'], 'trim'))) {
                                             unset($current_product_attributes[$attr_name]);
                                         }
                                     }
                                 }
                                 update_post_meta($variation_to_update_id, '_product_attributes', $current_product_attributes);
                                 continue;
                             }
                             if (strpos($cur_meta_key, "attribute_") === 0 and !empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list']) and in_array(str_replace("attribute_", "", $cur_meta_key), array_filter($this->import->options['attributes_list'], 'trim'))) {
                                 continue;
                             }
                             if (in_array($cur_meta_key, array('_default_attributes'))) {
                                 continue;
                             }
                         }
                         // Update all Custom Fields is defined
                         if ($this->import->options['update_custom_fields_logic'] == "full_update") {
                             delete_post_meta($variation_to_update_id, $cur_meta_key);
                         } elseif ($this->import->options['update_custom_fields_logic'] == "only") {
                             if (!empty($this->import->options['custom_fields_list']) and is_array($this->import->options['custom_fields_list']) and in_array($cur_meta_key, $this->import->options['custom_fields_list'])) {
                                 delete_post_meta($variation_to_update_id, $cur_meta_key);
                             }
                         } elseif ($this->import->options['update_custom_fields_logic'] == "all_except") {
                             if (empty($this->import->options['custom_fields_list']) or !in_array($cur_meta_key, $this->import->options['custom_fields_list'])) {
                                 delete_post_meta($variation_to_update_id, $cur_meta_key);
                             }
                         }
                     }
                 }
                 // Add any default post meta
                 //add_post_meta( $variation_to_update_id, 'total_sales', '0', true );
                 $v_total_sales = get_post_meta($variation_to_update_id, 'total_sales', true);
                 if (empty($v_total_sales)) {
                     update_post_meta($variation_to_update_id, 'total_sales', '0');
                 }
                 // Product type + Downloadable/Virtual
                 wp_set_object_terms($variation_to_update_id, NULL, 'product_type');
                 update_post_meta($variation_to_update_id, '_downloadable', $variation_product_downloadable[$j] == "yes" ? 'yes' : 'no');
                 update_post_meta($variation_to_update_id, '_virtual', $variation_product_virtual[$j] == "yes" ? 'yes' : 'no');
                 // Update post meta
                 if ($variation_just_created or $this->is_update_cf('_regular_price')) {
                     update_post_meta($variation_to_update_id, '_regular_price', stripslashes($variation_regular_price[$j]));
                 }
                 if ($variation_just_created or $this->is_update_cf('_sale_price')) {
                     update_post_meta($variation_to_update_id, '_sale_price', stripslashes($variation_sale_price[$j]));
                 }
                 if (class_exists('woocommerce_wholesale_pricing')) {
                     update_post_meta($variation_to_update_id, 'pmxi_wholesale_price', stripslashes($variation_whosale_price[$j]));
                 }
                 // Dimensions
                 if ($variation_product_virtual[$j] == 'no') {
                     if ($variation_just_created or $this->is_update_cf('_weight')) {
                         update_post_meta($variation_to_update_id, '_weight', stripslashes($variation_weight[$j]));
                     }
                     if ($variation_just_created or $this->is_update_cf('_length')) {
                         update_post_meta($variation_to_update_id, '_length', stripslashes($variation_length[$j]));
                     }
                     if ($variation_just_created or $this->is_update_cf('_width')) {
                         update_post_meta($variation_to_update_id, '_width', stripslashes($variation_width[$j]));
                     }
                     if ($variation_just_created or $this->is_update_cf('_height')) {
                         update_post_meta($variation_to_update_id, '_height', stripslashes($variation_height[$j]));
                     }
                 } else {
                     if ($variation_just_created or $this->is_update_cf('_weight')) {
                         update_post_meta($variation_to_update_id, '_weight', '');
                     }
                     if ($variation_just_created or $this->is_update_cf('_length')) {
                         update_post_meta($variation_to_update_id, '_length', '');
                     }
                     if ($variation_just_created or $this->is_update_cf('_width')) {
                         update_post_meta($variation_to_update_id, '_width', '');
                     }
                     if ($variation_just_created or $this->is_update_cf('_height')) {
                         update_post_meta($variation_to_update_id, '_height', '');
                     }
                 }
                 // Save shipping class
                 if (ctype_digit($variation_product_shipping_class[$j])) {
                     $v_shipping_class = $variation_product_shipping_class[$j] > 0 ? absint($variation_product_shipping_class[$j]) : '';
                 } else {
                     $vt_shipping_class = is_exists_term($variation_product_shipping_class[$j], 'product_shipping_class', 0);
                     if (empty($vt_shipping_class) and !is_wp_error($vt_shipping_class)) {
                         $vt_shipping_class = is_exists_term(htmlspecialchars($variation_product_shipping_class[$j]), 'product_shipping_class', 0);
                     }
                     if (!is_wp_error($vt_shipping_class)) {
                         $v_shipping_class = (int) $vt_shipping_class['term_id'];
                     }
                 }
                 wp_set_object_terms($variation_to_update_id, $v_shipping_class, 'product_shipping_class');
                 // Unique SKU
                 $sku = get_post_meta($variation_to_update_id, '_sku', true);
                 $new_sku = esc_html(trim(stripslashes($variation_sku[$j])));
                 if ($new_sku == '' and $this->import->options['disable_auto_sku_generation']) {
                     if ($variation_just_created or $this->is_update_cf('_sku')) {
                         update_post_meta($variation_to_update_id, '_sku', '');
                     }
                 } elseif ($new_sku == '' and !$this->import->options['disable_auto_sku_generation']) {
                     if ($variation_just_created or $this->is_update_cf('_sku')) {
                         $new_sku = substr(md5($variation_post_title), 0, 12);
                     }
                 }
                 if ($new_sku == '') {
                     update_post_meta($variation_to_update_id, '_sku', '');
                 } elseif ($new_sku !== $sku) {
                     if (!empty($new_sku)) {
                         if (!$this->import->options['disable_sku_matching'] and $this->wpdb->get_var($this->wpdb->prepare("\n\t\t\t\t\t\t\t\t\tSELECT " . $this->wpdb->posts . ".ID\n\t\t\t\t\t\t\t\t    FROM " . $this->wpdb->posts . "\n\t\t\t\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\t\t\t    WHERE " . $this->wpdb->posts . ".post_type = 'product'\n\t\t\t\t\t\t\t\t    AND " . $this->wpdb->posts . ".post_status = 'publish'\n\t\t\t\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\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 {
                             update_post_meta($variation_to_update_id, '_sku', $new_sku);
                         }
                     } else {
                         update_post_meta($variation_to_update_id, '_sku', '');
                     }
                 }
                 $date_from = isset($variation_sale_price_dates_from[$j]) ? $variation_sale_price_dates_from[$j] : '';
                 $date_to = isset($variation_sale_price_dates_to[$i]) ? $variation_sale_price_dates_to[$i] : '';
                 // Variable Description
                 $this->pushmeta($variation_to_update_id, '_variation_description', wp_kses_post($variation_description[$j]));
                 // Dates
                 if ($date_from) {
                     update_post_meta($variation_to_update_id, '_sale_price_dates_from', strtotime($date_from));
                 } else {
                     update_post_meta($variation_to_update_id, '_sale_price_dates_from', '');
                 }
                 if ($date_to) {
                     update_post_meta($variation_to_update_id, '_sale_price_dates_to', strtotime($date_to));
                 } else {
                     update_post_meta($variation_to_update_id, '_sale_price_dates_to', '');
                 }
                 if ($date_to && !$date_from) {
                     update_post_meta($variation_to_update_id, '_sale_price_dates_from', strtotime('NOW', current_time('timestamp')));
                 }
                 // Update price if on sale
                 if ($variation_sale_price[$j] == '') {
                     if (!empty($this->articleData['ID']) and !$this->is_update_cf('_sale_price')) {
                         $variation_sale_price[$j] = get_post_meta($variation_to_update_id, '_sale_price', true);
                     }
                 }
                 if ($variation_sale_price[$j] != '' && $date_to == '' && $date_from == '') {
                     $this->pushmeta($variation_to_update_id, '_price', stripslashes($variation_sale_price[$j]));
                 } else {
                     $this->pushmeta($variation_to_update_id, '_price', stripslashes($variation_regular_price[$j]));
                 }
                 // if ( $variation_sale_price[$j] != '' && $date_from && strtotime( $date_from ) < strtotime( 'NOW', current_time( 'timestamp' ) ) )
                 // 	update_post_meta( $variation_to_update_id, '_price', stripslashes($variation_sale_price[$j]) );
                 // if ( $date_to && strtotime( $date_to ) < strtotime( 'NOW', current_time( 'timestamp' ) ) ) {
                 // 	if (empty($articleData['ID']) or $this->is_update_cf('_price')) update_post_meta( $variation_to_update_id, '_price', stripslashes($variation_regular_price[$j]) );
                 // 	update_post_meta( $variation_to_update_id, '_sale_price_dates_from', '');
                 // 	update_post_meta( $variation_to_update_id, '_sale_price_dates_to', '');
                 // }
                 // Stock Data
                 if (strtolower($variation_product_manage_stock[$j]) == 'yes') {
                     // Manage stock
                     if (empty($articleData['ID']) or $this->is_update_cf('_manage_stock')) {
                         update_post_meta($variation_to_update_id, '_manage_stock', 'yes');
                     }
                     if (empty($articleData['ID']) or $this->is_update_cf('_stock_status')) {
                         update_post_meta($variation_to_update_id, '_stock_status', stripslashes($variable_stock_status[$j]));
                     }
                     if (empty($articleData['ID']) or $this->is_update_cf('_stock')) {
                         update_post_meta($variation_to_update_id, '_stock', (int) $variation_stock[$j]);
                     }
                     if (empty($articleData['ID']) or $this->is_update_cf('_backorders')) {
                         $backorders = wc_clean($variable_allow_backorders[$j]);
                         update_post_meta($variation_to_update_id, '_backorders', $backorders);
                     }
                 } else {
                     if (empty($articleData['ID']) or $this->is_update_cf('_manage_stock')) {
                         update_post_meta($variation_to_update_id, '_manage_stock', 'no');
                     }
                     if (empty($articleData['ID']) or $this->is_update_cf('_stock_status')) {
                         update_post_meta($variation_to_update_id, '_stock_status', stripslashes($variable_stock_status[$j]));
                     }
                     delete_post_meta($variation_to_update_id, '_backorders');
                     delete_post_meta($variation_to_update_id, '_stock');
                 }
                 if ($variation_product_tax_class[$j] !== 'parent') {
                     update_post_meta($variation_to_update_id, '_tax_class', sanitize_text_field($variation_product_tax_class[$j]));
                 } else {
                     delete_post_meta($variation_to_update_id, '_tax_class');
                 }
                 if ($variation_product_downloadable[$j] == 'yes') {
                     update_post_meta($variation_to_update_id, '_download_limit', sanitize_text_field($variation_download_limit[$j]));
                     update_post_meta($variation_to_update_id, '_download_expiry', sanitize_text_field($variation_download_expiry[$j]));
                     $_file_paths = array();
                     if (!empty($variation_file_paths[$j])) {
                         $file_paths = explode($this->import->options['variable_product_files_delim'], $variation_file_paths[$j]);
                         $file_names = explode($this->import->options['variable_product_files_names_delim'], $variation_file_names[$j]);
                         foreach ($file_paths as $fn => $file_path) {
                             $file_path = sanitize_text_field($file_path);
                             $_file_paths[md5($file_path)] = array('name' => !empty($file_names[$fn]) ? $file_names[$fn] : basename($file_path), 'file' => $file_path);
                         }
                     }
                     // grant permission to any newly added files on any existing orders for this product
                     update_post_meta($variation_to_update_id, '_downloadable_files', $_file_paths);
                 } else {
                     update_post_meta($variation_to_update_id, '_download_limit', '');
                     update_post_meta($variation_to_update_id, '_download_expiry', '');
                     update_post_meta($variation_to_update_id, '_downloadable_files', '');
                     update_post_meta($variation_to_update_id, '_download_type', '');
                 }
                 // Remove old taxonomies attributes so data is kept up to date
                 if ($variation_to_update_id and ($this->import->options['update_all_data'] == 'yes' or $this->import->options['update_all_data'] == 'no' and $this->import->options['is_update_attributes'] or $variation_just_created)) {
                     if ($this->import->options['update_all_data'] == 'yes' or $this->import->options['update_attributes_logic'] == 'full_update') {
                         $this->wpdb->query($this->wpdb->prepare("DELETE FROM {$this->wpdb->postmeta} WHERE meta_key LIKE 'attribute_%%' AND post_id = %d;", $variation_to_update_id));
                     }
                     wp_cache_delete($variation_to_update_id, 'post_meta');
                 }
                 // Update taxonomies
                 if ($this->import->options['update_all_data'] == 'yes' or $this->import->options['update_all_data'] == 'no' and $this->import->options['is_update_attributes'] or $variation_just_created) {
                     foreach ($variation_serialized_attributes as $a_name => $attr_data) {
                         $attr_name = $a_name;
                         // Update only these Attributes, leave the rest alone
                         if ($this->import->options['update_all_data'] == 'no' and $this->import->options['update_attributes_logic'] == 'only' and !$variation_just_created) {
                             if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                 if (!in_array(intval($attr_data['in_taxonomy'][$j]) ? wc_attribute_taxonomy_name($attr_name) : $attr_name, array_filter($this->import->options['attributes_list'], 'trim'))) {
                                     continue;
                                 }
                             } else {
                                 break;
                             }
                         }
                         // Leave these attributes alone, update all other Attributes
                         if ($this->import->options['update_all_data'] == 'no' and $this->import->options['update_attributes_logic'] == 'all_except' and !$variation_just_created) {
                             if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                 if (in_array(intval($attr_data['in_taxonomy'][$j]) ? wc_attribute_taxonomy_name($attr_name) : $attr_name, array_filter($this->import->options['attributes_list'], 'trim'))) {
                                     continue;
                                 }
                             }
                         }
                         if (intval($attr_data['in_taxonomy'][$j]) and (strpos($attr_name, "pa_") === false or strpos($attr_name, "pa_") !== 0)) {
                             $attr_name = "pa_" . $attr_name;
                         }
                         $is_variation = intval($attr_data['in_variation'][$j]);
                         // Don't use woocommerce_clean as it destroys sanitized characters
                         $values = intval($attr_data['in_taxonomy'][$j]) ? $attr_data['value'][$j] : $attr_data['value'][$j];
                         if (intval($attr_data['in_taxonomy'][$j])) {
                             if (intval($attr_data['is_create_taxonomy_terms'][0])) {
                                 $this->create_taxonomy($a_name, $logger);
                             }
                             $term = get_term_by('name', $values, wc_attribute_taxonomy_name($a_name), ARRAY_A);
                             // For compatibility with WPML plugin
                             $term = apply_filters('wp_all_import_term_exists', $term, wc_attribute_taxonomy_name($a_name), $values, null);
                             if (empty($term) and !is_wp_error($term)) {
                                 $term = is_exists_term($values, wc_attribute_taxonomy_name($a_name));
                                 if (empty($term) and !is_wp_error($term)) {
                                     $term = is_exists_term(htmlspecialchars($values), wc_attribute_taxonomy_name($a_name));
                                     if (empty($term) and !is_wp_error($term) and intval($attr_data['is_create_taxonomy_terms'][0])) {
                                         $term = wp_insert_term($values, wc_attribute_taxonomy_name($a_name));
                                     }
                                 }
                             }
                             if (!is_wp_error($term)) {
                                 $term = get_term_by('id', $term['term_id'], wc_attribute_taxonomy_name($a_name));
                                 update_post_meta($variation_to_update_id, 'attribute_' . sanitize_title($attr_name), $term->slug);
                             }
                         } else {
                             update_post_meta($variation_to_update_id, 'attribute_' . sanitize_title($attr_name), $values);
                         }
                     }
                 }
                 if (!is_array($variation_image[$j])) {
                     $variation_image[$j] = array($variation_image[$j]);
                 }
                 $uploads = wp_upload_dir();
                 if (!empty($uploads) and false === $uploads['error'] and !empty($variation_image[$j]) and (empty($articleData['ID']) or $this->import->options['update_all_data'] == "yes" or $this->import->options['update_all_data'] == "no" and $this->import->options['is_update_images'])) {
                     require_once ABSPATH . 'wp-admin/includes/image.php';
                     $targetDir = $uploads['path'];
                     $targetUrl = $uploads['url'];
                     $gallery_attachment_ids = array();
                     foreach ($variation_image[$j] as $featured_image) {
                         $imgs = explode(',', $featured_image);
                         if (!empty($imgs)) {
                             foreach ($imgs as $img_url) {
                                 if (empty($img_url)) {
                                     continue;
                                 }
                                 $attid = false;
                                 $attch = null;
                                 $url = str_replace(" ", "%20", trim($img_url));
                                 $bn = wp_all_import_sanitize_filename(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 = apply_filters("wp_all_import_image_filename", urldecode(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;
                                 $image_filename = wp_unique_filename($uploads['path'], $image_name);
                                 $image_filepath = $uploads['path'] . DIRECTORY_SEPARATOR . $image_filename;
                                 // search existing attachment
                                 if ($this->import->options['search_existing_images'] or "gallery" == $this->import->options['download_images']) {
                                     $image_filename = $image_name;
                                     $attch = wp_all_import_get_image_from_gallery($image_name, $targetDir, "images");
                                     if ("gallery" == $this->import->options['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), $variation_post_title));
                                         $download_image = false;
                                         $create_image = false;
                                         $attid = $attch->ID;
                                     }
                                 }
                                 if ($download_image && "gallery" != $this->import->options['download_images']) {
                                     // do not download images
                                     if ("no" == $this->import->options['download_images']) {
                                         $image_filename = $image_name;
                                         $image_filepath = $targetDir . DIRECTORY_SEPARATOR . $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 (!($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', 'wp_all_import_plugin'), $image_filepath));
                                                 @unlink($image_filepath);
                                             } else {
                                                 $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(__('- Downloading image from `%s`', 'wp_all_import_plugin'), $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))) {
                                             @unlink($image_filepath);
                                             // delete file since failed upload may result in empty file created
                                         } else {
                                             if ($image_info = @getimagesize($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));
                                             }
                                         }
                                         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', 'wp_all_import_plugin'), $url, $image_filepath));
                                                 @unlink($image_filepath);
                                                 // delete file since failed upload may result in empty file created
                                             } else {
                                                 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', 'wp_all_import_plugin'), $url));
                                                     @unlink($image_filepath);
                                                 } else {
                                                     $create_image = true;
                                                     $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
                                                 }
                                             }
                                         }
                                     }
                                 }
                                 $handle_image = false;
                                 if ($create_image) {
                                     $handle_image = array('file' => $image_filepath, 'url' => $targetUrl . '/' . $image_filename, 'type' => image_type_to_mime_type($image_info[2]));
                                     $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' => '');
                                     if ($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'], $variation_to_update_id);
                                     if (is_wp_error($attid)) {
                                         $logger and call_user_func($logger, __('- <b>WARNING</b>', 'wp_all_import_plugin') . ': ' . $attid->get_error_message());
                                     } else {
                                         wp_update_attachment_metadata($attid, wp_generate_attachment_metadata($attid, $handle_image['file']));
                                     }
                                 }
                                 if ($attid) {
                                     if ($attch != null and empty($attch->post_parent)) {
                                         wp_update_post(array('ID' => $attch->ID, 'post_parent' => $variation_to_update_id));
                                     }
                                     do_action('pmxi_gallery_image', $variation_to_update_id, $attid, $handle_image ? $handle_image['file'] : $image_filepath);
                                     $success_images = true;
                                     $post_thumbnail_id = get_post_thumbnail_id($variation_to_update_id);
                                     if (empty($post_thumbnail_id) and $this->import->options['is_featured']) {
                                         set_post_thumbnail($variation_to_update_id, $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));
                                     }
                                 }
                             }
                         }
                     }
                 }
                 wc_delete_product_transients($variation_to_update_id);
             }
             foreach ($tmp_files as $file) {
                 // remove all temporary files created
                 if (file_exists($file)) {
                     @unlink($file);
                 }
             }
             // Update parent if variable so price sorting works and stays in sync with the cheapest child
             $children = get_posts(array('post_parent' => $pid, 'posts_per_page' => -1, 'post_type' => 'product_variation', 'fields' => 'ids', 'post_status' => array('draft', 'publish', 'trash', 'pending', 'future', 'private')));
             $lowest_price = $lowest_regular_price = $lowest_sale_price = $highest_price = $highest_regular_price = $highest_sale_price = '';
             $total_instock = 0;
             if ($children) {
                 foreach ($children as $child) {
                     $_variation_stock = get_post_meta($child, '_stock_status', true);
                     $total_instock += $_variation_stock == 'instock' ? 1 : 0;
                     $child_price = get_post_meta($child, '_price', true);
                     $child_regular_price = get_post_meta($child, '_regular_price', true);
                     $child_sale_price = get_post_meta($child, '_sale_price', true);
                     // Regular prices
                     if (!is_numeric($lowest_regular_price) || $child_regular_price < $lowest_regular_price) {
                         $lowest_regular_price = $child_regular_price;
                     }
                     if (!is_numeric($highest_regular_price) || $child_regular_price > $highest_regular_price) {
                         $highest_regular_price = $child_regular_price;
                     }
                     // Sale prices
                     if ($child_price == $child_sale_price) {
                         if ($child_sale_price !== '' && (!is_numeric($lowest_sale_price) || $child_sale_price < $lowest_sale_price)) {
                             $lowest_sale_price = $child_sale_price;
                         }
                         if ($child_sale_price !== '' && (!is_numeric($highest_sale_price) || $child_sale_price > $highest_sale_price)) {
                             $highest_sale_price = $child_sale_price;
                         }
                     }
                 }
                 $lowest_price = $lowest_sale_price === '' || $lowest_regular_price < $lowest_sale_price ? $lowest_regular_price : $lowest_sale_price;
                 $highest_price = $highest_sale_price === '' || $highest_regular_price > $highest_sale_price ? $highest_regular_price : $highest_sale_price;
                 $this->pushmeta($pid, '_stock_status', $total_instock > 0 ? 'instock' : 'outofstock');
                 $this->pushmeta($pid, '_price', $lowest_price);
                 update_post_meta($pid, '_min_variation_price', $lowest_price);
                 update_post_meta($pid, '_max_variation_price', $highest_price);
                 update_post_meta($pid, '_min_variation_regular_price', $lowest_regular_price);
                 update_post_meta($pid, '_max_variation_regular_price', $highest_regular_price);
                 update_post_meta($pid, '_min_variation_sale_price', $lowest_sale_price);
                 update_post_meta($pid, '_max_variation_sale_price', $highest_sale_price);
                 // Update default attribute options setting
                 if ($this->import->options['update_all_data'] == 'yes' or $this->import->options['update_all_data'] == 'no' and $this->import->options['is_update_attributes'] or $variation_just_created) {
                     $default_attributes = array();
                     $parent_attributes = array();
                     $attribute_position = 0;
                     $is_update_attributes = true;
                     foreach ($variation_serialized_attributes as $a_name => $attr_data) {
                         $attr_name = $a_name;
                         $values = array();
                         // Update only these Attributes, leave the rest alone
                         if ($this->import->options['update_all_data'] == 'no' and $this->import->options['update_attributes_logic'] == 'only') {
                             if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                 if (!in_array(intval($attr_data['in_taxonomy'][$j]) ? wc_attribute_taxonomy_name($attr_name) : $attr_name, array_filter($this->import->options['attributes_list'], 'trim'))) {
                                     $attribute_position++;
                                     continue;
                                 }
                             } else {
                                 $is_update_attributes = false;
                                 break;
                             }
                         }
                         // Leave these attributes alone, update all other Attributes
                         if ($this->import->options['update_all_data'] == 'no' and $this->import->options['update_attributes_logic'] == 'all_except') {
                             if (!empty($this->import->options['attributes_list']) and is_array($this->import->options['attributes_list'])) {
                                 if (in_array(intval($attr_data['in_taxonomy'][$j]) ? wc_attribute_taxonomy_name($attr_name) : $attr_name, array_filter($this->import->options['attributes_list'], 'trim'))) {
                                     $attribute_position++;
                                     continue;
                                 }
                             }
                         }
                         foreach ($variation_sku as $j => $void) {
                             $is_variation = intval($attr_data['in_variation'][$j]) ? 1 : 0;
                             $value = esc_attr(trim($attr_data['value'][$j]));
                             if (!in_array($value, $values, true)) {
                                 $values[] = $value;
                             }
                             if ($is_variation) {
                                 if (!empty($value) and empty($default_attributes[intval($attr_data['in_taxonomy'][$j]) ? wc_attribute_taxonomy_name($attr_name) : sanitize_title($attr_name)])) {
                                     switch ($this->import->options['default_attributes_type']) {
                                         case 'instock':
                                             if ($variable_stock_status[$j] == 'instock') {
                                                 $default_attributes[intval($attr_data['in_taxonomy'][$j]) ? wc_attribute_taxonomy_name($attr_name) : sanitize_title($attr_name)] = sanitize_title($value);
                                             }
                                             break;
                                         case 'first':
                                             $default_attributes[intval($attr_data['in_taxonomy'][$j]) ? wc_attribute_taxonomy_name($attr_name) : sanitize_title($attr_name)] = sanitize_title($value);
                                             break;
                                         default:
                                             # code...
                                             break;
                                     }
                                 }
                             }
                         }
                         if (intval($attr_data['in_taxonomy'][0])) {
                             if (intval($attr_data['is_create_taxonomy_terms'][0])) {
                                 $this->create_taxonomy($attr_name, $logger);
                             }
                             if (isset($values) and taxonomy_exists(wc_attribute_taxonomy_name($attr_name))) {
                                 // Remove empty items in the array
                                 $values = array_filter($values, array($this, "filtering"));
                                 if (!empty($values)) {
                                     $attr_values = array();
                                     foreach ($values as $key => $value) {
                                         $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'][0])) {
                                                     $term = wp_insert_term($value, wc_attribute_taxonomy_name($attr_name));
                                                 }
                                             }
                                         }
                                         if (!is_wp_error($term)) {
                                             $attr_values[] = (int) $term['term_id'];
                                         }
                                     }
                                     $values = $attr_values;
                                 }
                             } else {
                                 $values = array();
                             }
                             // Update post terms
                             if (taxonomy_exists(wc_attribute_taxonomy_name($attr_name))) {
                                 wp_set_object_terms($pid, $values, wc_attribute_taxonomy_name($attr_name));
                             }
                             if ($values) {
                                 // Add attribute to array, but don't set values
                                 $parent_attributes[wc_attribute_taxonomy_name($attr_name)] = array('name' => wc_attribute_taxonomy_name($attr_name), 'value' => '', 'position' => $attribute_position, 'is_visible' => !empty($attr_data['is_visible'][0]) ? 1 : 0, 'is_variation' => !empty($attr_data['in_variation'][0]) ? 1 : 0, 'is_taxonomy' => 1, 'is_create_taxonomy_terms' => !empty($attr_data['is_create_taxonomy_terms'][0]) ? 1 : 0);
                             }
                         } else {
                             if (taxonomy_exists(wc_attribute_taxonomy_name($attr_name))) {
                                 wp_set_object_terms($pid, NULL, wc_attribute_taxonomy_name($attr_name));
                             }
                             $parent_attributes[sanitize_title($attr_name)] = array('name' => sanitize_text_field($attr_name), 'value' => implode('|', $values), 'position' => $attribute_position, 'is_visible' => !empty($attr_data['is_visible'][0]) ? 1 : 0, 'is_variation' => !empty($attr_data['in_variation'][0]) ? 1 : 0, 'is_taxonomy' => 0);
                         }
                         $attribute_position++;
                     }
                     if ($this->import->options['is_default_attributes'] and $is_update_attributes) {
                         $current_default_attributes = get_post_meta($pid, '_default_attributes', true);
                         update_post_meta($pid, '_default_attributes', !empty($current_default_attributes) ? array_merge($current_default_attributes, $default_attributes) : $default_attributes);
                     }
                     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, $parent_attributes) : $parent_attributes);
                     }
                 }
             } elseif ($this->import->options['make_simple_product']) {
                 $this->make_simple_product($pid);
             }
         } elseif ($this->import->options['make_simple_product']) {
             $this->make_simple_product($pid);
         }
     }
 }
 function wp_all_import_get_url($filePath, $targetDir = false, $contentType = false, $contentEncoding = false, $detect = false)
 {
     $type = $contentType;
     $uploads = wp_upload_dir();
     $targetDir = !$targetDir ? wp_all_import_secure_file($uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::UPLOADS_DIRECTORY) : $targetDir;
     $tmpname = wp_unique_filename($targetDir, ($type and strlen(basename($filePath)) < 30) ? basename($filePath) : time());
     $localPath = $targetDir . '/' . urldecode(sanitize_file_name($tmpname)) . (!$type ? '.tmp' : '');
     if ($contentEncoding == 'gzip') {
         $file = @fopen($filePath);
     } else {
         $file = @fopen($filePath, "rb");
     }
     $is_valid = false;
     if (is_resource($file)) {
         $fp = @fopen($localPath, 'w');
         $first_chunk = true;
         while (!@feof($file)) {
             $chunk = @fread($file, 1024);
             if (!$type and $first_chunk and (strpos($chunk, "<?") !== false or strpos($chunk, "<rss") !== false) or strpos($chunk, "xmlns") !== false) {
                 $type = 'xml';
             } elseif (!$type and $first_chunk) {
                 $type = 'csv';
             }
             // if it's a 1st chunk, then chunk <? symbols to detect XML file
             $first_chunk = false;
             @fwrite($fp, $chunk);
         }
         @fclose($file);
         @fclose($fp);
         $chunk = new PMXI_Chunk($localPath);
         $is_valid = true;
         if (!empty($chunk->options['element'])) {
             $defaultXpath = "/" . $chunk->options['element'];
         } else {
             $is_valid = false;
         }
         if ($is_valid) {
             while ($xml = $chunk->read()) {
                 if (!empty($xml)) {
                     PMXI_Import_Record::preprocessXml($xml);
                     $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" . "\n" . $xml;
                     $dom = new DOMDocument('1.0', 'UTF-8');
                     $old = libxml_use_internal_errors(true);
                     $dom->loadXML($xml);
                     libxml_use_internal_errors($old);
                     $xpath = new DOMXPath($dom);
                     if ($elements = $xpath->query($defaultXpath) and $elements->length) {
                         break;
                     }
                 }
             }
             if (empty($xml)) {
                 $is_valid = false;
             }
         }
         unset($chunk);
     }
     if (!$is_valid) {
         $request = get_file_curl($filePath, $localPath);
         if (!is_wp_error($request)) {
             if (!$type) {
                 if ($contentEncoding == 'gzip') {
                     $file = @fopen($localPath);
                 } else {
                     $file = @fopen($localPath, "rb");
                 }
                 while (!@feof($file)) {
                     $chunk = @fread($file, 1024);
                     if (strpos($chunk, "<?") !== false or strpos($chunk, "<rss") !== false or strpos($chunk, "xmlns") !== false) {
                         $type = 'xml';
                     } else {
                         $type = 'csv';
                     }
                     // if it's a 1st chunk, then chunk <? symbols to detect XML file
                     break;
                 }
                 @fclose($file);
             }
         } else {
             return $request;
         }
     }
     if (!preg_match('%\\W(' . $type . ')$%i', basename($localPath))) {
         if (@rename($localPath, $localPath . '.' . $type)) {
             $localPath = $localPath . '.' . $type;
         }
     }
     return $detect ? array('type' => $type, 'localPath' => $localPath) : $localPath;
 }
 function wp_all_import_get_gz($filename, $use_include_path = 0, $targetDir = false, $headers = false)
 {
     $type = 'csv';
     $uploads = wp_upload_dir();
     $targetDir = !$targetDir ? wp_all_import_secure_file($uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::UPLOADS_DIRECTORY) : $targetDir;
     $tmpname = wp_unique_filename($targetDir, strlen(basename($filename)) < 30 ? basename($filename) : time());
     $localPath = $targetDir . '/' . urldecode(sanitize_file_name($tmpname));
     $fp = @fopen($localPath, 'w');
     $file = @gzopen($filename, 'rb', $use_include_path);
     if ($file) {
         $first_chunk = true;
         while (!gzeof($file)) {
             $chunk = gzread($file, 1024);
             if ($first_chunk and strpos($chunk, "<?") !== false and strpos($chunk, "</") !== false) {
                 $type = 'xml';
                 $first_chunk = false;
             }
             // if it's a 1st chunk, then chunk <? symbols to detect XML file
             @fwrite($fp, $chunk);
         }
         gzclose($file);
     } else {
         $tmpname = wp_unique_filename($targetDir, strlen(basename($filename)) < 30 ? basename($filename) : time());
         $localGZpath = $targetDir . '/' . urldecode(sanitize_file_name($tmpname));
         $request = get_file_curl($filename, $localGZpath, false, true);
         if (!is_wp_error($request)) {
             $file = @gzopen($localGZpath, 'rb', $use_include_path);
             if ($file) {
                 $first_chunk = true;
                 while (!gzeof($file)) {
                     $chunk = gzread($file, 1024);
                     if ($first_chunk and strpos($chunk, "<?") !== false and strpos($chunk, "</") !== false) {
                         $type = 'xml';
                         $first_chunk = false;
                     }
                     // if it's a 1st chunk, then chunk <? symbols to detect XML file
                     @fwrite($fp, $chunk);
                 }
                 gzclose($file);
             }
             @unlink($localGZpath);
         } else {
             return $request;
         }
     }
     @fclose($fp);
     if (strpos($headers['Content-Disposition'], 'tar.gz') !== false && class_exists('PharData')) {
         rename($localPath, $localPath . '.tar');
         $phar = new PharData($localPath . '.tar');
         $phar->extractTo($targetDir);
         @unlink($localPath . '.tar');
         $scanned_files = @scandir($targetDir);
         if (!empty($scanned_files) and is_array($scanned_files)) {
             $files = array_diff($scanned_files, array('.', '..'));
             if (!empty($files)) {
                 foreach ($files as $file) {
                     if (preg_match('%\\W(csv|xml|json|sql|txt|xls|xlsx)$%i', basename($file))) {
                         $localPath = $targetDir . DIRECTORY_SEPARATOR . $file;
                         break;
                     }
                 }
             }
         }
     }
     if (preg_match('%\\W(gz)$%i', basename($localPath))) {
         if (@rename($localPath, str_replace('.gz', '.' . $type, $localPath))) {
             $localPath = str_replace('.gz', '.' . $type, $localPath);
         }
     } else {
         if (@rename($localPath, $localPath . '.' . $type)) {
             $localPath = $localPath . '.' . $type;
         }
     }
     return array('type' => $type, 'localPath' => $localPath);
 }
 function wp_all_import_get_url($filePath, $targetDir = false, $contentType = false, $contentEncoding = false, $detect = false)
 {
     $type = $contentType;
     $uploads = wp_upload_dir();
     $targetDir = !$targetDir ? wp_all_import_secure_file($uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::UPLOADS_DIRECTORY) : $targetDir;
     $tmpname = wp_unique_filename($targetDir, ($type and strlen(basename($filePath)) < 30) ? basename($filePath) : time());
     $localPath = $targetDir . '/' . urldecode(sanitize_file_name($tmpname)) . (!$type ? '.tmp' : '');
     if ($contentEncoding == 'gzip') {
         $file = @fopen($filePath);
     } else {
         $file = @fopen($filePath, "rb");
     }
     if (is_resource($file)) {
         $fp = @fopen($localPath, 'w');
         $first_chunk = true;
         while (!@feof($file)) {
             $chunk = @fread($file, 1024);
             if (!$type and $first_chunk and (strpos($chunk, "<?") !== false or strpos($chunk, "<rss") !== false) or strpos($chunk, "xmlns") !== false) {
                 $type = 'xml';
             } elseif (!$type and $first_chunk) {
                 $type = 'csv';
             }
             // if it's a 1st chunk, then chunk <? symbols to detect XML file
             $first_chunk = false;
             @fwrite($fp, $chunk);
         }
         @fclose($file);
         @fclose($fp);
     }
     if (!file_exists($localPath)) {
         $request = get_file_curl($filePath, $localPath);
         if (!is_wp_error($request)) {
             if (!$type) {
                 if ($contentEncoding == 'gzip') {
                     $file = @fopen($localPath);
                 } else {
                     $file = @fopen($localPath, "rb");
                 }
                 while (!@feof($file)) {
                     $chunk = @fread($file, 1024);
                     if (strpos($chunk, "<?") !== false or strpos($chunk, "<rss") !== false or strpos($chunk, "xmlns") !== false) {
                         $type = 'xml';
                     } else {
                         $type = 'csv';
                     }
                     // if it's a 1st chunk, then chunk <? symbols to detect XML file
                     break;
                 }
                 @fclose($file);
             }
         } else {
             return $request;
         }
     }
     if (!preg_match('%\\W(' . $type . ')$%i', basename($localPath))) {
         if (@rename($localPath, $localPath . '.' . $type)) {
             $localPath = $localPath . '.' . $type;
         }
     }
     return $detect ? array('type' => $type, 'localPath' => $localPath) : $localPath;
 }
Exemple #15
0
 public function import_file($atch_url, $pid, $logger, $fast = false)
 {
     global $wpdb;
     $uploads = wp_upload_dir();
     $file_name = sanitize_file_name(basename(parse_url(trim($atch_url), PHP_URL_PATH)));
     $wpai_uploads = PMXI_Plugin::FILES_DIRECTORY . DIRECTORY_SEPARATOR;
     if (!preg_match('%^https?://%i', $atch_url)) {
         $file_path = $wpai_uploads . $atch_url;
     } else {
         $file_path = $uploads['path'] . '/' . $file_name;
     }
     $attachment_filename = wp_unique_filename($uploads['path'], $file_name);
     $attachment_filepath = $uploads['path'] . '/' . sanitize_file_name($attachment_filename);
     $download_file = true;
     $create_file = false;
     if ($this->parsing_data['import']->options['is_search_existing_attach']) {
         // searching for existing attachment
         $attachment_id = $wpdb->get_var($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE (post_title = %s OR post_title = %s OR post_name = %s) AND post_type = %s;", $file_name, preg_replace('/\\.[^.\\s]{3,4}$/', '', $file_name), sanitize_title(preg_replace('/\\.[^.\\s]{3,4}$/', '', $file_name)), "attachment"));
         if ($attachment_id and !is_wp_error($attachment_id)) {
             return $attachment_id;
         }
         if (@file_exists($file_path)) {
             if (!($wp_filetype = wp_check_filetype(basename($file_name), null))) {
                 $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as ACF image', 'pmxi_plugin'), $file_path));
             } else {
                 $download_file = false;
                 $create_file = true;
             }
         }
     }
     if ($download_file) {
         if (!get_file_curl(trim($atch_url), $attachment_filepath) 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));
             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)));
         } 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');
             $attach_id = 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());
             } 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';
                 do_action('pmxi_attachment_uploaded', $pid, $attach_id, $attachment_filepath);
                 wp_update_attachment_metadata($attach_id, wp_generate_attachment_metadata($attach_id, $attachment_filepath));
                 return $attach_id;
             }
         }
     }
     if ($create_file) {
         $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');
         $attach_id = 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());
         } 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';
             do_action('pmxi_attachment_uploaded', $pid, $attach_id, $attachment_filepath);
             wp_update_attachment_metadata($attach_id, wp_generate_attachment_metadata($attach_id, $attachment_filepath));
             return $attach_id;
         }
     }
     return false;
 }
Exemple #16
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), '');
             }
         }
         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 ("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);
                 $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...', '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();
             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), '');
                     }
                 } 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
                 $image_meta_titles_bundle = array();
                 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
                 $image_meta_captions_bundle = array();
                 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
                 $image_meta_alts_bundle = array();
                 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
                 $image_meta_descriptions_bundle = array();
                 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;
                 }
                 $auto_rename_images_bundle = array();
                 $auto_extensions_bundle = array();
                 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();
         if ($this->options['is_import_specified']) {
             $chunk == 1 and $logger and call_user_func($logger, __('Calculate specified records to import...', 'wp_all_import_plugin'));
             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)));
                 }
             }
         }
         $simpleXml = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
         $rootNodes = $simpleXml->xpath($cxpath);
         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));
             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;
             // 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 founded 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 founded 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']));
                 // 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) {
                         $logger and call_user_func($logger, sprintf(__('Duplicate post was founded 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\'n founded 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;
                 }
             }
             // Duplicate record is founded
             if ($post_to_update) {
                 $continue_import = true;
                 $continue_import = apply_filters('wp_all_import_is_post_to_update', $post_to_update_id, wp_all_import_xml2array($rootNodes[$i]));
                 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 founded 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']));
                         }
                         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_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;
                         }
                     }
                     $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);
                 }
                 if (!in_array($this->options['custom_type'], array('import_users'))) {
                     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']));
                         wp_delete_attachments($articleData['ID'], !$this->options['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();
             }
             // 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 (!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 = wp_insert_post($articleData, true);
             } else {
                 $pid = empty($articleData['ID']) ? wp_insert_user($articleData) : wp_update_user($articleData);
                 $articleData['post_title'] = $articleData['user_login'];
             }
             if (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))->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 ('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_allow_import_images = apply_filters('wp_all_import_is_allow_import_images', false, $articleData['post_type']);
                 if (!empty($uploads) and false === $uploads['error'] 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)) {
                         $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;
                             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 {
                                     require_once ABSPATH . 'wp-admin/includes/image.php';
                                     $success_images = false;
                                     $gallery_attachment_ids = array();
                                     $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", $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 = explode("\n", $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, !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) {
                                             if (empty($img_url)) {
                                                 continue;
                                             }
                                             $attid = false;
                                             $attch = null;
                                             $url = str_replace(" ", "%20", trim($img_url));
                                             $bn = 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 : '');
                                             // 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, __('- Founded base64_encoded image', 'wp_all_import_plugin'));
                                                     $image_filename = md5(time()) . '.jpg';
                                                     $image_filepath = $targetDir . '/' . $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', 'wp_all_import_plugin'), $image_filepath));
                                                         $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                                     } else {
                                                         $create_image = true;
                                                     }
                                                 }
                                             } else {
                                                 $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']) {
                                                     $image_filename = $image_name;
                                                     $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;", $image_name, preg_replace('/\\.[^.\\s]{3,4}$/', '', $image_name), sanitize_title($image_name), "attachment"));
                                                     if ($attch != null) {
                                                         $download_image = false;
                                                         $attid = $attch->ID;
                                                     } 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) {
                                                                     $download_image = false;
                                                                     $attid = $attch->ID;
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                                 if ($download_image) {
                                                     // do not download images
                                                     if ("yes" != $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 founded', 'wp_all_import_plugin'), $wpai_image_path));
                                                                 }
                                                             } elseif ($bundle_data['type'] == 'images') {
                                                                 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', 'wp_all_import_plugin'), $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(__('- Image `%s` has been successfully founded', 'wp_all_import_plugin'), $wpai_image_path));
                                                                 }
                                                             }
                                                         }
                                                     } else {
                                                         $logger and call_user_func($logger, sprintf(__('- Downloading image from `%s`', 'wp_all_import_plugin'), $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))) {
                                                             @unlink($image_filepath);
                                                             // delete file since failed upload may result in empty file created
                                                         } else {
                                                             if ($bundle_data['type'] == 'images') {
                                                                 if ($image_info = @getimagesize($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));
                                                                 }
                                                             } 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) {
                                                             $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', '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 (!($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', 'wp_all_import_plugin'), $url));
                                                                         $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
                                                                         @unlink($image_filepath);
                                                                     } else {
                                                                         $create_image = true;
                                                                         $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
                                                                     }
                                                                 } 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 founded', 'wp_all_import_plugin'), $url));
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                             if ($create_image) {
                                                 $logger and call_user_func($logger, sprintf(__('- Creating an attachment for image `%s`', 'wp_all_import_plugin'), $targetUrl . '/' . $image_filename));
                                                 $attachment = array('post_mime_type' => $bundle_data['type'] == 'images' ? image_type_to_mime_type($image_info[2]) : $wp_filetype['type'], 'guid' => $targetUrl . '/' . $image_filename, 'post_title' => $image_name, 'post_content' => '', 'post_author' => $post_author[$i]);
                                                 if ($bundle_data['type'] == 'images' and $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 = wp_insert_attachment($attachment, $image_filepath, $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 {
                                                     // 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));
                                                     $update_attachment_meta = array();
                                                     if ($this->options[$option_slug . 'set_image_meta_title'] and !empty($img_titles[$k])) {
                                                         $update_attachment_meta['post_title'] = $img_titles[$k];
                                                     }
                                                     if ($this->options[$option_slug . 'set_image_meta_caption'] and !empty($img_captions[$k])) {
                                                         $update_attachment_meta['post_excerpt'] = $img_captions[$k];
                                                     }
                                                     if ($this->options[$option_slug . 'set_image_meta_description'] and !empty($img_descriptions[$k])) {
                                                         $update_attachment_meta['post_content'] = $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', $img_alts[$k]);
                                                     }
                                                     if (!empty($update_attachment_meta)) {
                                                         $this->wpdb->update($this->wpdb->posts, $update_attachment_meta, array('ID' => $attid));
                                                     }
                                                 }
                                             }
                                             if ($attid) {
                                                 if ($attch != null and empty($attch->post_parent)) {
                                                     wp_update_post(array('ID' => $attch->ID, 'post_parent' => $pid));
                                                 }
                                                 $logger and call_user_func($logger, __('- <b>ACTION</b>: ' . $slug, 'wp_all_import_plugin'));
                                                 do_action($slug, $pid, $attid, $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;
                                                 }
                                                 $logger and call_user_func($logger, sprintf(__('- Attachment has been successfully created for image `%s`', 'wp_all_import_plugin'), $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
                                     if (!$success_images and "yes" == $this->options[$option_slug . 'create_draft']) {
                                         $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
                                 if ("yes" == $this->options[$option_slug . 'create_draft']) {
                                     $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 {
                     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);
                                 }
                             }
                         }
                     }
                 }
                 // [/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'])) {
                     $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);
                                         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', '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 {
                                             $logger and call_user_func($logger, sprintf(__('- File %s has been successfully downloaded', 'wp_all_import_plugin'), $atch_url));
                                             $attachment_data = array('guid' => $targetUrl . '/' . basename($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 = wp_insert_attachment($attachment_data, $attachment_filepath, $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, $attachment_filepath));
                                                 $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, $attachment_filepath);
                                             }
                                         }
                                     } 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);
                                     }
                                 }
                             }
                         }
                     }
                 }
                 // [/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]) ? term_exists($single_tax['name'], $tx_name, (int) $parent_id) : term_exists($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]) ? term_exists(htmlspecialchars($single_tax['name']), $tx_name, (int) $parent_id) : term_exists(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));
                 }
                 // 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);
                     $is_update = !empty($articleData['ID']);
                     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]);
                 // 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;
             $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...', 'wp_all_import_plugin'));
                 $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'];
                     }
                 }
                 // Delete posts from database
                 if (!empty($missing_ids) && is_array($missing_ids)) {
                     $logger and call_user_func($logger, __('<b>ACTION</b>: pmxi_delete_post', 'wp_all_import_plugin'));
                     $logger and call_user_func($logger, __('Deleting posts from database', 'wp_all_import_plugin'));
                     $missing_ids_arr = array_chunk($missing_ids, 100);
                     foreach ($missing_ids_arr as $key => $ids) {
                         if (!empty($ids)) {
                             foreach ($ids as $k => $id) {
                                 $to_delete = true;
                                 // Instead of deletion, set Custom Field
                                 if ($this->options['is_update_missing_cf']) {
                                     update_post_meta($id, $this->options['update_missing_cf_name'], $this->options['update_missing_cf_value']);
                                     $to_delete = false;
                                     $logger and call_user_func($logger, sprintf(__('Instead of deletion post with ID `%s`, set Custom Field `%s` to value `%s`', 'wp_all_import_plugin'), $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' => $id));
                                     $to_delete = false;
                                     $logger and call_user_func($logger, sprintf(__('Instead of deletion, change post with ID `%s` status to Draft', 'wp_all_import_plugin'), $id));
                                 }
                                 if ($to_delete) {
                                     // Remove attachments
                                     empty($this->options['is_keep_attachments']) and wp_delete_attachments($id, true, 'files');
                                     // Remove images
                                     empty($this->options['is_keep_imgs']) and wp_delete_attachments($id, true, 'images');
                                     // Clear post's relationships
                                     if ($post_type[$i] != "import_users") {
                                         wp_delete_object_term_relationships($id, get_object_taxonomies('' != $this->options['custom_type'] ? $this->options['custom_type'] : 'post'));
                                     }
                                 } else {
                                     unset($ids[$k]);
                                 }
                             }
                             if (!empty($ids)) {
                                 do_action('pmxi_delete_post', $ids);
                                 if ($this->options['custom_type'] == "import_users") {
                                     $sql = "delete a,b\n\t\t\t\t\t\t\t\t\t\tFROM " . $this->wpdb->users . " a\n\t\t\t\t\t\t\t\t\t\tLEFT JOIN " . $this->wpdb->usermeta . " b ON ( a.ID = b.user_id )\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tWHERE a.ID IN (" . implode(',', $ids) . ");";
                                 } else {
                                     $sql = "delete a,b,c\n\t\t\t\t\t\t\t\t\t\tFROM " . $this->wpdb->posts . " a\n\t\t\t\t\t\t\t\t\t\tLEFT JOIN " . $this->wpdb->term_relationships . " b ON ( a.ID = b.object_id )\n\t\t\t\t\t\t\t\t\t\tLEFT JOIN " . $this->wpdb->postmeta . " c ON ( a.ID = c.post_id )\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tWHERE a.ID IN (" . implode(',', $ids) . ");";
                                 }
                                 $this->wpdb->query($sql);
                                 // Delete record form pmxi_posts
                                 $sql = "DELETE FROM " . PMXI_Plugin::getInstance()->getTablePrefix() . "posts WHERE post_id IN (" . implode(',', $ids) . ") AND import_id = %d";
                                 $this->wpdb->query($this->wpdb->prepare($sql, $this->id));
                                 $this->set(array('deleted' => $this->deleted + count($ids)))->update();
                             }
                         }
                     }
                 }
             }
             // 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'));
                 $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);
                         $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);
     }
     if (($is_cron or $is_import_complete) and $this->options['is_delete_source']) {
         $logger and call_user_func($logger, __('Deleting source XML file...', 'wp_all_import_plugin'));
         // Delete chunks
         foreach (PMXI_Helper::safe_glob($uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::TEMP_DIRECTORY . DIRECTORY_SEPARATOR . 'pmxi_chunk_*', PMXI_Helper::GLOB_RECURSE | PMXI_Helper::GLOB_PATH) as $filePath) {
             $logger and call_user_func($logger, __('Deleting chunks files...', 'wp_all_import_plugin'));
             @file_exists($filePath) and wp_all_import_remove_source($filePath, false);
         }
         if ($this->type != "ftp") {
             if (!@unlink($this->path)) {
                 $logger and call_user_func($logger, sprintf(__('<b>WARNING</b>: Unable to remove %s', 'wp_all_import_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', 'wp_all_import_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;
 }
Exemple #17
0
 public static function upload_image($pid, $img_url, $download_images, $logger, $create_image = false, $image_name = "", $file_type = 'images')
 {
     if (empty($img_url)) {
         return false;
     }
     $url = str_replace(" ", "%20", trim($img_url));
     $bn = wp_all_import_sanitize_filename(basename($url));
     if ($image_name == "") {
         $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 = apply_filters("wp_all_import_image_filename", urldecode(sanitize_file_name($img_ext ? str_replace("." . $default_extension, "", $bn) : $bn)) . ("" != $img_ext ? '.' . $img_ext : ''));
     }
     $uploads = wp_upload_dir();
     $targetDir = $uploads['path'];
     $targetUrl = $uploads['url'];
     $download_image = true;
     $result = false;
     $wp_filetype = false;
     global $wpdb;
     $attch = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $wpdb->posts . " WHERE (post_title = %s OR post_title = %s OR post_name = %s) AND post_type = %s AND post_mime_type LIKE %s;", $image_name, preg_replace('/\\.[^.\\s]{3,4}$/', '', $image_name), sanitize_title($image_name), "attachment", "image%"));
     if ($attch != null) {
         return $attch->ID;
     }
     $image_filename = wp_unique_filename($targetDir, $image_name);
     $image_filepath = $targetDir . '/' . $image_filename;
     // do not download images
     if ("yes" != $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 ($file_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 {
                     $result = true;
                     $logger and call_user_func($logger, sprintf(__('- File `%s` has been successfully found', 'wp_all_import_plugin'), $wpai_image_path));
                 }
             } elseif ($file_type == 'images') {
                 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', 'wp_all_import_plugin'), $image_filepath));
                     @unlink($image_filepath);
                 } else {
                     $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully found', 'wp_all_import_plugin'), $wpai_image_path));
                     $result = true;
                 }
             }
         }
     }
     if ($download_image) {
         if ($file_type == 'images') {
             $logger and call_user_func($logger, sprintf(__('- Downloading image from `%s`', 'wp_all_import_plugin'), $url));
         } elseif ($file_type == 'files') {
             $logger and call_user_func($logger, sprintf(__('- Downloading file from `%s`', 'wp_all_import_plugin'), $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))) {
             @unlink($image_filepath);
             // delete file since failed upload may result in empty file created
         } else {
             if ($file_type == 'images') {
                 if ($image_info = @getimagesize($image_filepath) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
                     $result = true;
                     $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
                 }
             } elseif ($file_type == 'files') {
                 if ($wp_filetype = wp_check_filetype(basename($image_filepath), null)) {
                     $result = true;
                     $logger and call_user_func($logger, sprintf(__('- File `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
                 }
             }
         }
         if (!$result) {
             $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', 'wp_all_import_plugin'), $url, $image_filepath));
                 @unlink($image_filepath);
                 // delete file since failed upload may result in empty file created
             } else {
                 if ($file_type == 'images') {
                     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', 'wp_all_import_plugin'), $url));
                         @unlink($image_filepath);
                     } else {
                         $result = true;
                         $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
                     }
                 } elseif ($file_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)));
                         @unlink($image_filepath);
                     } else {
                         $result = true;
                         $logger and call_user_func($logger, sprintf(__('- File `%s` has been successfully found', 'wp_all_import_plugin'), $url));
                     }
                 }
             }
         }
     }
     if ($create_image and $result) {
         if ($file_type == 'images') {
             $logger and call_user_func($logger, sprintf(__('- Creating an attachment for image `%s`', 'wp_all_import_plugin'), $targetUrl . '/' . $image_filename));
         } else {
             $logger and call_user_func($logger, sprintf(__('- Creating an attachment for file `%s`', 'wp_all_import_plugin'), $targetUrl . '/' . $image_filename));
         }
         $attachment = array('post_mime_type' => $file_type == 'images' ? image_type_to_mime_type($image_info[2]) : $wp_filetype['type'], 'guid' => $targetUrl . '/' . $image_filename, 'post_title' => $image_filename, 'post_content' => '');
         if ($file_type == 'images' and $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 = wp_insert_attachment($attachment, $image_filepath, $pid);
         if (is_wp_error($attid)) {
             $logger and call_user_func($logger, __('- <b>WARNING</b>', 'wp_all_import_plugin') . ': ' . $attid->get_error_message());
             return false;
         } 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));
             $logger and call_user_func($logger, sprintf(__('- Attachment has been successfully created for image `%s`', 'wp_all_import_plugin'), $targetUrl . '/' . $image_filename));
             return $attid;
         }
     } else {
         return $result;
     }
 }
 function pmxi_gzfile_get_contents($filename, $use_include_path = 0)
 {
     $type = 'csv';
     $uploads = wp_upload_dir();
     $tmpname = wp_unique_filename($uploads['path'], strlen(basename($filename)) < 30 ? basename($filename) : time());
     $localPath = $uploads['path'] . '/' . urldecode(sanitize_file_name($tmpname));
     $fp = @fopen($localPath, 'w');
     $file = @gzopen($filename, 'rb', $use_include_path);
     if ($file) {
         $first_chunk = true;
         while (!gzeof($file)) {
             $chunk = gzread($file, 1024);
             if ($first_chunk and strpos($chunk, "<?") !== false) {
                 $type = 'xml';
                 $first_chunk = false;
             }
             // if it's a 1st chunk, then chunk <? symbols to detect XML file
             @fwrite($fp, $chunk);
         }
         gzclose($file);
     } else {
         $tmpname = wp_unique_filename($uploads['path'], strlen(basename($filename)) < 30 ? basename($filename) : time());
         $localGZpath = $uploads['path'] . '/' . urldecode(sanitize_file_name($tmpname));
         $request = get_file_curl($filename, $localGZpath, false, true);
         if (!is_wp_error($request)) {
             $file = @gzopen($localGZpath, 'rb', $use_include_path);
             if ($file) {
                 $first_chunk = true;
                 while (!gzeof($file)) {
                     $chunk = gzread($file, 1024);
                     if ($first_chunk and strpos($chunk, "<?") !== false) {
                         $type = 'xml';
                         $first_chunk = false;
                     }
                     // if it's a 1st chunk, then chunk <? symbols to detect XML file
                     @fwrite($fp, $chunk);
                 }
                 gzclose($file);
             }
             @unlink($localGZpath);
         } else {
             return $request;
         }
     }
     @fclose($fp);
     if (preg_match('%\\W(gz)$%i', basename($localPath))) {
         if (@rename($localPath, str_replace('.gz', '.' . $type, $localPath))) {
             $localPath = str_replace('.gz', '.' . $type, $localPath);
         }
     } else {
         if (@rename($localPath, $localPath . '.' . $type)) {
             $localPath = $localPath . '.' . $type;
         }
     }
     return array('type' => $type, 'localPath' => $localPath);
 }