File: /var/www/karjerosdiena.lt/wp-content/plugins/wp-all-import/controllers/admin/manage.php
<?php
/**
* Manage Imports
*
* @author Maksym Tsypliakov <maksym.tsypliakov@gmail.com>
*/
class PMXI_Admin_Manage extends PMXI_Controller_Admin {
public function init() {
parent::init();
if ('update' == PMXI_Plugin::getInstance()->getAdminCurrentScreen()->action) {
$this->isInline = true;
}
}
/**
* Previous Imports list
*/
public function index() {
$get = $this->input->get(array(
's' => '',
'order_by' => 'registered_on',
'order' => 'DESC',
'pagenum' => 1,
'perPage' => 25,
));
$get['pagenum'] = absint($get['pagenum']);
extract($get);
$this->data += $get;
if ( ! in_array($order_by, array('registered_on', 'id', 'name'))){
$order_by = 'registered_on';
}
if ( ! in_array($order, array('DESC', 'ASC'))){
$order = 'DESC';
}
if ( in_array($order_by, array('name'))){
$order_by = 'friendly_name ' . $order . ', name';
}
$list = new PMXI_Import_List();
$by = array('parent_import_id' => 0);
if ('' != $s) {
$like = '%' . preg_replace('%\s+%', '%', preg_replace('/[%?]/', '\\\\$0', $s)) . '%';
$by[] = array(array('name LIKE' => $like, 'type LIKE' => $like, 'path LIKE' => $like, 'friendly_name LIKE' => $like), 'OR');
}
$this->data['list'] = $list->setColumns(
$list->getTable() . '.*'
)
->getBy($by, "$order_by $order", $pagenum, $perPage, $list->getTable() . '.id');
$this->data['page_links'] = paginate_links(array(
'base' => add_query_arg('pagenum', '%#%', $this->baseUrl),
'add_args' => array('page' => 'pmxi-admin-manage'),
'format' => '',
'prev_text' => __('«', 'wp_all_import_plugin'),
'next_text' => __('»', 'wp_all_import_plugin'),
'total' => ceil($list->total() / $perPage),
'current' => $pagenum,
));
PMXI_Plugin::$session->clean_session();
$this->render();
}
/**
* delete all posts, media, files, and whatever value was in the 'Unique ID' field
*/
public function delete_and_edit() {
if( ! wp_verify_nonce( ($_REQUEST['_wpnonce_delete-and-edit'] ?? ''), 'delete-and-edit') )
{
die( __('Security check', 'wp-all-import-pro') );
}
$get = $this->input->get(array(
'id' => '',
));
if ( ! empty($get['id']) ) {
$import = new PMXI_Import_Record();
$import->getById($get['id']);
if ( ! $import->isEmpty() ) {
$import->deletePosts(false);
$options = $import->options;
if ( empty($import->options['custom_type']) || $import->options['custom_type'] != 'shop_order') {
$options['unique_key'] = '';
}
$import->set(array(
'options' => $options,
'imported' => 0,
'created' => 0,
'updated' => 0,
'skipped' => 0,
'deleted' => 0,
'changed_missing' => 0
))->save();
}
}
if ( ! empty($import->options['custom_type']) && $import->options['custom_type'] == 'shop_order') {
wp_redirect(esc_url_raw(add_query_arg(array('id' => $import->id, 'action' => 'edit'), $this->baseUrl))); die();
} else {
wp_redirect(esc_url_raw(add_query_arg(array('id' => $import->id, 'action' => 'options'), $this->baseUrl))); die();
}
}
/**
* Disable `Skip posts if their data in your file has not changed` option.
*/
public function disable_skip_posts() {
$get = $this->input->get(array(
'id' => '',
));
if ( ! empty($get['id']) ) {
$import = new PMXI_Import_Record();
$import->getById($get['id']);
if ( ! $import->isEmpty() ) {
$options = $import->options;
$options['is_selective_hashing'] = 0;
$import->set(array(
'options' => $options,
'imported' => 0,
'created' => 0,
'updated' => 0,
'skipped' => 0,
'deleted' => 0,
'changed_missing' => 0
))->save();
}
wp_redirect(esc_url_raw(add_query_arg(array('id' => $import->id, 'action' => 'update'), $this->baseUrl))); die();
}
}
/**
* Edit Template
*/
public function edit() {
// deligate operation to other controller
$controller = new PMXI_Admin_Import();
$controller->set('isTemplateEdit', true);
$controller->template();
}
/**
* Edit Options
*/
public function options() {
// deligate operation to other controller
$controller = new PMXI_Admin_Import();
$controller->set('isTemplateEdit', true);
$controller->options();
}
public function get_template(){
$nonce = (!empty($_REQUEST['_wpnonce'])) ? $_REQUEST['_wpnonce'] : '';
if ( ! wp_verify_nonce( $nonce, '_wpnonce-download_template' ) ) {
die( __('Security check', 'wp_all_import_plugin') );
} else {
$id = $this->input->get('id');
$item = new PMXI_Import_Record();
$filepath = '';
$export_data = array();
if ( ! $item->getById($id)->isEmpty()){
$tpl_name = empty($item->friendly_name) ? $item->name : $item->friendly_name;
$tpl_data = array(
'name' => $tpl_name,
'is_keep_linebreaks' => 0,
'is_leave_html' => 0,
'fix_characters' => 0,
'options' => $item->options
);
$template_data[] = $tpl_data;
$uploads = wp_upload_dir();
$targetDir = $uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::TEMP_DIRECTORY;
$export_file_name = "WP All Import Template - " . sanitize_file_name($tpl_name) . ".txt";
file_put_contents($targetDir . DIRECTORY_SEPARATOR . $export_file_name, json_encode($template_data));
PMXI_download::csv($targetDir . DIRECTORY_SEPARATOR . $export_file_name);
}
}
}
/*
* Download bundle for WP All Import
*
*/
public function bundle(){
$nonce = (!empty($_REQUEST['_wpnonce'])) ? $_REQUEST['_wpnonce'] : '';
if ( ! wp_verify_nonce( $nonce, '_wpnonce-download_bundle' ) ) {
die( __('Security check', 'wp_all_import_plugin') );
} else {
$uploads = wp_upload_dir();
$id = $this->input->get('id');
$bundle_path = $this->create_bundle($id, $nonce);
if (file_exists($bundle_path))
{
$bundle_url = $uploads['baseurl'] . str_replace($uploads['basedir'], '', $bundle_path);
PMXI_download::zip($bundle_path);
}
}
}
protected function create_bundle($id, $nonce)
{
$uploads = wp_upload_dir();
//generate temporary folder
$tmp_dir = $uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::TEMP_DIRECTORY . DIRECTORY_SEPARATOR . md5($nonce) . DIRECTORY_SEPARATOR;
$bundle_dir = $tmp_dir . 'bundle' . DIRECTORY_SEPARATOR;
// clear tmp dir
wp_all_import_rmdir($tmp_dir);
@mkdir($tmp_dir);
$import = new PMXI_Import_Record();
if ( ! $import->getById($id)->isEmpty())
{
$friendly_name = sanitize_file_name($import->friendly_name);
@mkdir($bundle_dir);
$tpl_name = empty($import->friendly_name) ? $import->name : $import->friendly_name;
if (empty($tpl_name))
{
$tpl_name = 'Import_' . $import->id;
}
$tpl_data = array(
'name' => $tpl_name,
'bundle_xpath' => $import->xpath,
'is_keep_linebreaks' => 0,
'is_leave_html' => 0,
'fix_characters' => 0,
'options' => $import->options,
);
$template_data = array($tpl_data);
$template = "WP All Import Template - " . $tpl_name . ".txt";
$filepath = '';
if ( in_array($import->type, array('url')))
{
$template_data[0]['_import_type'] = 'url';
$template_data[0]['_import_url'] = $import->path;
// $history = new PMXI_File_List();
// $history->setColumns('id', 'name', 'registered_on', 'path')->getBy(array('import_id' => $import->id), 'id DESC');
// if ($history->count()){
// foreach ($history as $file){
// $filepath = wp_all_import_get_absolute_path($file['path']);
// if (@file_exists($filepath)) break;
// }
// }
}
else
{
$filepath = wp_all_import_get_absolute_path($import->path);
}
file_put_contents($bundle_dir . $template, json_encode($template_data));
$readme = __("The other two files in this zip are the export file containing all of your data and the import template for WP All Import. \n\nTo import this data, create a new import with WP All Import and upload this zip file.", "wp_all_export_plugin");
file_put_contents($bundle_dir . 'readme.txt', $readme);
@copy( $filepath, $bundle_dir . basename($filepath) );
$bundle_path = $tmp_dir . $tpl_name . '.zip';
PMXI_Zip::zipDir($bundle_dir, $bundle_path);
return $bundle_path;
}
}
/**
* Cron Scheduling
*/
public function scheduling() {
$this->data['id'] = $id = $this->input->get('id');
$this->data['cron_job_key'] = PMXI_Plugin::getInstance()->getOption('cron_job_key');
$this->data['item'] = $item = new PMXI_Import_Record();
if ( ! $id or $item->getById($id)->isEmpty()) {
wp_redirect(esc_url_raw($this->baseUrl)); die();
}
$this->render();
}
/**
* Cancel import processing
*/
public function cancel(){
$nonce = (!empty($_REQUEST['_wpnonce'])) ? wp_unslash($_REQUEST['_wpnonce']) : '';
if ( ! wp_verify_nonce( $nonce, '_wpnonce-cancel_import' ) ) {
die( __('Security check', 'wp_all_import_plugin') );
} else {
$id = $this->input->get('id');
PMXI_Plugin::$session->clean_session( $id );
$item = new PMXI_Import_Record();
if ( ! $id or $item->getById($id)->isEmpty()) {
wp_redirect(esc_url_raw($this->baseUrl)); die();
}
$item->set(array(
'triggered' => 0,
'processing' => 0,
'executing' => 0,
'canceled' => 1,
'canceled_on' => date('Y-m-d H:i:s')
))->update();
wp_redirect(esc_url_raw(add_query_arg('pmxi_nt', urlencode(__('Import canceled', 'wp_all_import_plugin')), $this->baseUrl))); die();
}
}
/**
* Re-run import
*/
public function update() {
$id = $this->input->get('id');
PMXI_Plugin::$session->clean_session( $id );
$action_type = false;
$this->data['import'] = $item = new PMXI_Import_Record();
if ( ! $id or $item->getById($id)->isEmpty()) {
wp_redirect(esc_url_raw($this->baseUrl)); die();
}
$this->data['isWizard'] = false;
$default = PMXI_Plugin::get_default_import_options();
$DefaultOptions = $item->options + $default;
foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
if (class_exists($class)) $DefaultOptions += call_user_func(array($class, "get_default_import_options"));
}
$this->data['post'] =& $DefaultOptions;
$this->data['source'] = array(
'path' => $item->path,
'root_element' => $item->root_element
);
$this->data['xpath'] = $item->xpath;
$this->data['count'] = $item->count;
$history = new PMXI_File_List();
$history->setColumns('id', 'name', 'registered_on', 'path')->getBy(array('import_id' => $item->id), 'id DESC');
if ($history->count()){
foreach ($history as $file){
if (@file_exists(wp_all_import_get_absolute_path($file['path']))) {
$this->data['locfilePath'] = wp_all_import_get_absolute_path($file['path']);
break;
}
}
}
$chunks = 0;
if ( ($this->input->post('is_confirmed') and check_admin_referer('confirm', '_wpnonce_confirm')) ) {
$continue = $this->input->post('is_continue', 'no');
// mark action type ad continue
if ($continue == 'yes') $action_type = 'continue';
$filePath = '';
// upload new file in case when import is not continue
if ( empty(PMXI_Plugin::$session->chunk_number) ) {
if ( in_array($item->type, array('upload'))){ // retrieve already uploaded file
$uploader = new PMXI_Upload(trim($item->path), $this->errors, rtrim(str_replace(basename($item->path), '', wp_all_import_get_absolute_path($item->path)), '/'));
$upload_result = $uploader->upload();
if ($upload_result instanceof WP_Error)
$this->errors = $upload_result;
else
$filePath = $upload_result['filePath'];
}
if (empty($item->options['encoding'])){
$currentOptions = $item->options;
$currentOptions['encoding'] = 'UTF-8';
$item->set(array(
'options' => $currentOptions
))->update();
}
@set_time_limit(0);
$local_paths = ( ! empty($local_paths) ) ? $local_paths : array($filePath);
// wp_all_import_get_reader_engine( $local_paths, array('root_element' => $item->root_element), $item->id );
foreach ($local_paths as $key => $path) {
if (!empty($action_type) and $action_type == 'continue'){
$chunks = $item->count;
}
else{
$file = new PMXI_Chunk($path, array('element' => $item->root_element, 'encoding' => $item->options['encoding']));
while ($xml = $file->read()) {
if ( ! empty($xml) )
{
//PMXI_Import_Record::preprocessXml($xml);
$xml = "<?xml version=\"1.0\" encoding=\"". $item->options['encoding'] ."\"?>" . "\n" . $xml;
$dom = new DOMDocument('1.0', ( ! empty($item->options['encoding']) ) ? $item->options['encoding'] : 'UTF-8');
$old = libxml_use_internal_errors(true);
$dom->loadXML($xml); // FIX: libxml xpath doesn't handle default namespace properly, so remove it upon XML load
libxml_use_internal_errors($old);
$xpath = new DOMXPath($dom);
if (($elements = @$xpath->query($item->xpath)) and !empty($elements) and !empty($elements->length)){
$chunks += $elements->length;
}
unset($dom, $xpath, $elements);
}
}
unset($file);
}
!$key and $filePath = $path;
}
if (empty($chunks)) {
if ($item->options['is_delete_missing']) {
$chunks = 1;
} else {
$item->set(array(
'registered_on' => date('Y-m-d H:i:s')
))->update();
$this->errors->add('root-element-validation', __('No matching elements found for Root element and XPath expression specified', 'wp_all_import_plugin'));
}
}
}
if ( $chunks ) { // xml is valid
if ( ! PMXI_Plugin::is_ajax() and empty(PMXI_Plugin::$session->chunk_number)) {
// compose data to look like result of wizard steps
$sesson_data = array(
'filePath' => $filePath,
'source' => array(
'name' => $item->name,
'type' => $item->type,
'path' => wp_all_import_get_relative_path($item->path),
'root_element' => $item->root_element,
),
'feed_type' => $item->feed_type,
'update_previous' => $item->id,
'parent_import_id' => $item->parent_import_id,
'xpath' => $item->xpath,
'options' => $item->options,
'encoding' => (!empty($item->options['encoding'])) ? $item->options['encoding'] : 'UTF-8',
'is_csv' => (!empty($item->options['delimiter'])) ? $item->options['delimiter'] : PMXI_Plugin::$is_csv,
'csv_path' => PMXI_Plugin::$csv_path,
'chunk_number' => 1,
'log' => '',
'warnings' => 0,
'errors' => 0,
'start_time' => 0,
'pointer' => 1,
'count' => (isset($chunks)) ? $chunks : 0,
'local_paths' => (!empty($local_paths)) ? $local_paths : array(), // ftp import local copies of remote files
'action' => (!empty($action_type) and $action_type == 'continue') ? 'continue' : 'update',
'nonce' => wp_create_nonce( 'import' ),
'deligate' => false
);
foreach ($sesson_data as $key => $value) {
PMXI_Plugin::$session->set($key, $value);
}
PMXI_Plugin::$session->save_data();
}
$item->set(array('canceled' => 0, 'failed' => 0))->update();
// deligate operation to other controller
$controller = new PMXI_Admin_Import();
$controller->data['update_previous'] = $item;
$controller->process();
return;
}
}
$this->render('admin/import/confirm');
}
/*
* Download import file
*
*/
public function feed(){
$nonce = (!empty($_REQUEST['_wpnonce'])) ? wp_unslash($_REQUEST['_wpnonce']) : '';
if ( ! wp_verify_nonce( $nonce, '_wpnonce-download_feed' ) ) {
die( __('Security check', 'wp_all_import_plugin') );
} else {
$import_id = $this->input->get('id');
$path = '';
$import = new PMXI_Import_Record();
$import->getbyId($import_id);
if ( ! $import->isEmpty()){
$path = wp_all_import_get_absolute_path($import->path);
}
if (file_exists($path))
{
if (preg_match('%\W(zip)$%i', trim(basename($path)))){
PMXI_download::zip($path);
}
elseif(preg_match('%\W(xml)$%i', trim(basename($path)))){
PMXI_download::xml($path);
}
else{
PMXI_download::csv($path);
}
}
else
{
wp_redirect(esc_url_raw(add_query_arg(array('pmxi_nt' => urlencode(__('File does not exist.', 'wp_all_import_plugin'))), $this->baseUrl))); die();
}
}
}
/**
* Delete an import
*/
public function delete() {
$id = $this->input->get('id');
$this->data['item'] = $item = new PMXI_Import_Record();
if ( ! $id or $item->getById($id)->isEmpty()) {
wp_redirect(esc_url_raw($this->baseUrl)); die();
}
if ($this->input->post('is_confirmed')) {
check_admin_referer('delete-import', '_wpnonce_delete-import');
$is_deleted_images = $this->input->post('is_delete_images');
$is_delete_attachments = $this->input->post('is_delete_attachments');
$is_delete_import = $this->input->post('is_delete_import', false);
$is_delete_posts = $this->input->post('is_delete_posts', false);
if ( ! $is_delete_import and ! $is_delete_posts ){
wp_redirect(esc_url_raw(add_query_arg('pmxi_nt', urlencode(__('Nothing to delete.', 'wp_all_import_plugin')), $this->baseUrl))); die();
}
do_action('pmxi_before_import_delete', $item, $is_delete_posts);
$item->delete( ! $is_delete_posts, $is_deleted_images, $is_delete_attachments, $is_delete_import );
$redirect_msg = '';
if ( $is_delete_import and ! $is_delete_posts )
{
$redirect_msg = __('Import deleted', 'wp_all_import_plugin');
}
elseif( ! $is_delete_import and $is_delete_posts)
{
$redirect_msg = __('All associated posts deleted.', 'wp_all_import_plugin');
}
elseif( $is_delete_import and $is_delete_posts)
{
$redirect_msg = __('Import and all associated posts deleted.', 'wp_all_import_plugin');
}
wp_redirect(esc_url_raw(add_query_arg('pmxi_nt', urlencode($redirect_msg), $this->baseUrl))); die();
}
$postList = new PMXI_Post_List();
$this->data['associated_posts'] = count($postList->getBy(array('import_id' => $item->id)));
$this->render();
}
/**
* Bulk actions
*/
public function bulk() {
check_admin_referer('bulk-imports', '_wpnonce_bulk-imports');
if ($this->input->post('doaction2')) {
$this->data['action'] = $action = $this->input->post('bulk-action2');
} else {
$this->data['action'] = $action = $this->input->post('bulk-action');
}
$this->data['ids'] = $ids = $this->input->post('items');
$this->data['items'] = $items = new PMXI_Import_List();
if (empty($action) or ! in_array($action, array('delete')) or empty($ids) or $items->getBy('id', $ids)->isEmpty()) {
wp_redirect(esc_url_raw($this->baseUrl)); die();
}
if ($this->input->post('is_confirmed')) {
$is_delete_posts = $this->input->post('is_delete_posts', false);
$is_deleted_images = $this->input->post('is_delete_images');
$is_delete_attachments = $this->input->post('is_delete_attachments');
foreach($items->convertRecords() as $item) {
$item->delete( ! $is_delete_posts, $is_deleted_images, $is_delete_attachments );
}
wp_redirect(esc_url_raw(add_query_arg('pmxi_nt', urlencode(sprintf(__('%d %s deleted', 'wp_all_import_plugin'), $items->count(), _n('import', 'imports', $items->count(), 'wp_all_import_plugin'))), $this->baseUrl))); die();
}
$this->render();
}
}