includes/importers/class-themeisle-ob-content-importer.php
<?php
/**
* Author: Andrei Baicus <andrei@themeisle.com>
* On: 21/06/2018
*
* @package themeisle-onboarding
* @soundtrack Guess Things Happen That Way - Johnny Cash
*/
/**
* Class Themeisle_OB_Content_Importer
*
* @package themeisle-onboarding
*/
class Themeisle_OB_Content_Importer {
/**
* Import Remote XML file.
*
* @param WP_REST_Request $request the async request.
*
* @return WP_REST_Response
*/
public function import_remote_xml( WP_REST_Request $request ) {
if ( ! current_user_can( 'manage_options' ) ) {
return new WP_REST_Response(
array(
'data' => 'ti__ob_permission_err_1',
'success' => false,
)
);
}
do_action( 'themeisle_ob_before_xml_import' );
$params = $request->get_body_params();
$body = $params['data'];
$content_file_url = $body['contentFile'];
if ( empty( $content_file_url ) ) {
return new WP_REST_Response(
array(
'data' => 'ti__ob_remote_err_1',
'success' => false,
)
);
}
if ( ! isset( $body['source'] ) || empty( $body['source'] ) ) {
return new WP_REST_Response(
array(
'data' => 'ti__ob_remote_err_2',
'success' => false,
)
);
}
set_time_limit( 10000 );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
if ( $body['source'] === 'remote' ) {
require_once( ABSPATH . '/wp-admin/includes/file.php' );
global $wp_filesystem;
WP_Filesystem();
$content_file = $wp_filesystem->get_contents( $content_file_url );
$content_file_path = $this->save_xhr_return_path( $content_file );
} else {
$content_file_path = $content_file_url;
}
$import_status = $this->import_file( $content_file_path );
if ( is_wp_error( $import_status ) ) {
return new WP_REST_Response(
array(
'data' => $import_status,
'success' => false,
)
);
}
if ( $body['source'] === 'remote' ) {
unlink( $content_file_path );
}
do_action( 'themeisle_ob_after_xml_import' );
// print_r( 'Content imported.' . "\n", false );
$this->maybe_bust_elementor_cache();
// Set front page.
if ( isset( $body['frontPage'] ) ) {
$frontpage_id = $this->setup_front_page( $body['frontPage'] );
}
do_action( 'themeisle_ob_after_front_page_setup' );
// Set shop pages.
if ( isset( $body['shopPages'] ) ) {
$this->setup_shop_pages( $body['shopPages'] );
}
do_action( 'themeisle_ob_after_shop_pages_setup' );
if ( empty( $frontpage_id ) ) {
return new WP_REST_Response(
array(
'data' => 'ti__ob_front_page_id_err_1',
'success' => false,
)
);
}
return new WP_REST_Response(
array(
'success' => true,
'frontpage_id' => $frontpage_id,
)
);
}
/**
* Save remote XML file and return the file path.
*
* @param string $content the content.
*
* @return string
*/
private function save_xhr_return_path( $content ) {
$wp_upload_dir = wp_upload_dir( null, false );
$file_path = $wp_upload_dir['basedir'] . '/themeisle-demo-import.xml';
ob_start();
echo $content;
$result = ob_get_clean();
require_once( ABSPATH . '/wp-admin/includes/file.php' );
global $wp_filesystem;
WP_Filesystem();
$wp_filesystem->put_contents( $file_path, $result );
return $file_path;
}
/**
* Set up front page options by `post_name`.
*
* @param array $args the front page array.
*
* @return int|void
*/
private function setup_front_page( $args ) {
if ( ! is_array( $args ) ) {
// print_r( 'Invalid front page option.' . "\n" );
return;
}
if ( $args['front_page'] === null && $args['blog_page'] === null ) {
// print_r( 'No front page to set up.' . "\n" );
return;
}
update_option( 'show_on_front', 'page' );
if ( isset( $args['front_page'] ) && $args['front_page'] !== null ) {
$front_page_obj = get_page_by_path( $args['front_page'] );
if ( isset( $front_page_obj->ID ) ) {
update_option( 'page_on_front', $front_page_obj->ID );
}
}
if ( isset( $args['blog_page'] ) && $args['blog_page'] !== null ) {
$blog_page_obj = get_page_by_path( $args['blog_page'] );
if ( isset( $blog_page_obj->ID ) ) {
update_option( 'page_for_posts', $blog_page_obj->ID );
}
}
// print_r( 'Front page set up.' . "\n", false );
if ( isset( $front_page_obj->ID ) ) {
return $front_page_obj->ID;
}
}
/**
* Set up shop pages options by `post_name`.
*
* @param array $pages the shop pages array.
*/
private function setup_shop_pages( $pages ) {
if ( ! class_exists( 'WooCommerce' ) ) {
// print_r( 'WooCommerce not available.' . "\n", false );
return;
}
if ( ! is_array( $pages ) ) {
// print_r( 'Cannot set up shop pages.' . "\n", false );
return;
}
foreach ( $pages as $option_id => $slug ) {
if ( ! empty( $slug ) ) {
$page_object = get_page_by_path( $slug );
if ( isset( $page_object->ID ) ) {
update_option( $option_id, $page_object->ID );
}
}
}
// print_r( 'Shop pages set up.' . "\n", false );
}
/**
* Maybe bust cache for elementor plugin.
*/
private function maybe_bust_elementor_cache() {
if ( class_exists( '\Elementor\Plugin' ) ) {
wp_remote_post(
esc_url( admin_url( 'admin-ajax.php' ) ),
array(
'body' => array(
'action' => 'elementor_clear_cache',
),
)
);
// print_r( 'Busted Elementor Cache.' . "\n", false );
}
}
/**
* Import file
*
* @param string $file_path the file path to import.
*
* @return WP_Error|true
*/
private function import_file( $file_path ) {
if ( empty( $file_path ) || ! file_exists( $file_path ) || ! is_readable( $file_path ) ) {
return new WP_Error( 'ti__ob_content_err_1' );
}
$this->load_importer();
require_once 'helpers/class-themeisle-ob-importer-alterator.php';
new Themeisle_OB_Importer_Alterator();
$importer = new Themeisle_OB_WXR_Importer();
$result = $importer->import( $file_path );
return $result;
}
/**
* Load the importer.
*/
private function load_importer() {
if ( ! class_exists( 'WP_Importer' ) ) {
defined( 'WP_LOAD_IMPORTERS' ) || define( 'WP_LOAD_IMPORTERS', true );
require ABSPATH . '/wp-admin/includes/class-wp-importer.php';
}
require dirname( __FILE__ ) . '/helpers/wxr_importer/class-themeisle-ob-wxr-importer.php';
require dirname( __FILE__ ) . '/helpers/wxr_importer/class-themeisle-ob-wxr-import-info.php';
}
}