%PDF- %PDF-
| Direktori : /home/infra/new-ong/bethemeold/functions/importer/ |
| Current File : //home/infra/new-ong/bethemeold/functions/importer/class-mfn-importer-helper.php |
<?php
/**
* Pre-built websites importer helper
*
* @package Betheme
* @author Muffin group
* @link https://muffingroup.com
* @version 1.1
*
* 1.1 - custom XML importer, database reset: remove media, sliders and shop attributes @since 26.5.2
*/
// error_reporting(E_ALL);
// ini_set("display_errors", 1);
if ( ! defined( 'ABSPATH' ) ){
exit;
}
class Mfn_Importer_Helper {
public $demos = [];
public $demo = ''; // current demo
public $builder = ''; // current builder
public $demo_builder = ''; // current demo + builder, ie. shop_el
public $demo_path = ''; // path to directory with downloaded demo content
public $url = ''; // current demo url
/**
* Constructor
*/
function __construct( $demo, $builder = false ) {
// set demos list
require( get_theme_file_path('/functions/importer/demos.php') );
$this->demos = $demos;
$this->demo = $demo;
$this->builder = $builder;
$this->demo_builder = $demo;
if( 'elementor' == $builder ){
$this->demo_builder .= '_el';
}
$upload_dir = wp_upload_dir();
$this->demo_path = wp_normalize_path( $upload_dir['basedir'] .'/betheme/websites/'. $this->demo_builder .'/'. $this->demo_builder );
$this->url = $this->get_demo_url();
}
/**
* MAIN functions ----------
*/
/**
* Database reset
*/
public static function database_reset( $remove_media = false ){
global $wpdb;
// remove attachments
if( $remove_media ){
$attachments = get_posts(array(
'post_type' => 'attachment',
'posts_per_page' => -1
));
if( is_iterable($attachments) ){
foreach( $attachments as $at ){
wp_delete_attachment( $at->ID );
}
}
unset($attachments);
}
// empty selected tables
$wpdb->query( "TRUNCATE TABLE $wpdb->posts" );
$wpdb->query( "TRUNCATE TABLE $wpdb->postmeta" );
$wpdb->query( "TRUNCATE TABLE $wpdb->comments" );
$wpdb->query( "TRUNCATE TABLE $wpdb->commentmeta" );
$wpdb->query( "TRUNCATE TABLE $wpdb->terms" );
$wpdb->query( "TRUNCATE TABLE $wpdb->termmeta" );
$wpdb->query( "TRUNCATE TABLE $wpdb->term_taxonomy" );
$wpdb->query( "TRUNCATE TABLE $wpdb->term_relationships" );
$wpdb->query( "TRUNCATE TABLE $wpdb->links" );
if( class_exists('RevSliderFront') ){
$wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}revslider_sliders" );
$wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}revslider_slides" );
$wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}revslider_static_slides" );
}
if( function_exists('is_woocommerce') ){
$wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}wc_product_attributes_lookup" );
$wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_attribute_taxonomies" );
$wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}wc_product_meta_lookup" );
}
$wpdb->query( $wpdb->prepare(
"DELETE FROM $wpdb->options
WHERE `option_name` REGEXP %s",
'sidebars_widgets|^widget_' ) );
$transients = array('wp_page_for_privacy_policy','mfn_header','mfn_footer','product_cat_children','_transient_wc_', '_transient_timeout_wc_', 'mfn_popup_addons_singular', 'mfn_popup_addons_archives', 'mfn_portfolio_template', 'mfn_single-post_template', 'mfn_single-portfolio_template', 'mfn_blog_template');
foreach ($transients as $transient) {
if( in_array($transient, array('_transient_timeout_wc_', '_transient_wc_', 'mfn_header', 'mfn_footer')) ){
$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->options WHERE `option_name` like %s", $wpdb->esc_like($transient) . '%' ) );
}else{
$wpdb->delete( $wpdb->options, array( 'option_name' => $transient ), array( '%s' ) );
}
}
return true;
}
/**
* Download package
*/
public function download_package(){
// Importer remote API
require_once( get_theme_file_path( '/functions/importer/class-mfn-importer-api.php' ) );
$importer_api = new Mfn_Importer_API( $this->demo_builder );
$demo_path = $importer_api->remote_get_demo();
if( ! $demo_path ){
echo 'Remote API error<br />';
} elseif( is_wp_error( $demo_path ) ){
echo 'Remote API WP error<br />';
} else {
return true;
}
return false;
}
/**
* Delete temporary directory
*/
public function delete_temp_dir(){
// Importer remote API
require_once( get_theme_file_path( '/functions/importer/class-mfn-importer-api.php' ) );
$importer_api = new Mfn_Importer_API( $this->demo_builder );
$importer_api->delete_temp_dir();
// regenerate builder file
Mfn_Helper::generate_bebuilder_items();
return true;
}
/**
* Import content
*/
public function content( $attachments = false ){
// default WP Importer
// $result = $this->import_xml( $attachments );
// custom XML importer
$result = $this->custom_import( $attachments );
if( ! $result ){
return false;
}
// Muffin Builder ! do not IF replace_builder(), Be templates are used also in Elementor demos
$this->replace_builder();
// Elementor
if( 'elementor' == $this->builder ){
$this->replace_elementor();
$this->elementor_settings();
if ( class_exists( 'Elementor\Plugin' ) ){
Elementor\Plugin::$instance->files_manager->clear_cache();
}
}
return true;
}
/**
* Custom XML importer
*/
public function custom_import( $attachments = false ) {
global $wpdb;
require_once(ABSPATH . 'wp-admin/includes/image.php');
$save_option = get_option('uploads_use_yearmonth_folders');
if( empty($save_option) ){
update_option( 'uploads_use_yearmonth_folders', '1' );
}
$file = wp_normalize_path( $this->demo_path.'/content.xml.gz' );
$compressed = $this->get_file_data( $file );
if ( !is_wp_error( $compressed ) && 200 === wp_remote_retrieve_response_code( $compressed ) ) {
$compressedContent = wp_remote_retrieve_body( $compressed );
}else{
$compressedContent = file_get_contents($file);
}
$xmlContent = gzdecode($compressedContent);
$xml = simplexml_load_string($xmlContent, 'SimpleXMLElement', LIBXML_NOCDATA )->channel;
$standard_terms = array('category', 'post_tag');
$author = get_current_user_id();
$new_url = get_home_url();
$old_url = $xml->link;
/** TERMS */
$terms = $xml->children('wp', true);
if( isset($terms->term) && is_iterable($terms->term) ){
foreach ($terms->term as $term) {
$term_tax = false;
if( !empty( (string)$term->term_taxonomy ) ) $term_tax = (string)$term->term_taxonomy;
if( $term_tax && !in_array($term_tax, $standard_terms) ){
$this->import_term($term, str_replace('attribute_', '', $term_tax));
}
}
}
/** TERMS - category */
if( isset($terms->category) && is_iterable($terms->category) ){
foreach ($terms->category as $term) {
$this->import_term($term, 'category');
}
}
/** TERMS - tag */
if( isset($terms->tag) && is_iterable($terms->tag) ){
foreach ($terms->tag as $term) {
$this->import_term($term, 'post_tag');
}
}
/** TERMS - post format */
if( isset($terms->post_format) && is_iterable($terms->post_format) ){
foreach ($terms->post_format as $term) {
$this->import_term($term, 'post_format');
}
}
/** POSTS */
foreach( $xml->item as $i=>$item ){
$title = wp_strip_all_tags( (string) $item->title );
$mime = '';
$title = (string) $item->title;
$mime = '';
$content_tag = $item->children('content', true);
$content = (string) $content_tag->encoded;
$excerpt_tag = $item->children('excerpt', true);
$excerpt = (string) $excerpt_tag->encoded;
$link = !empty((string)$item->link) ? str_replace($old_url, $new_url, (string)$item->link) : '';
$data = $item->children('wp', true);
$post_id = (string)$data->post_id;
if( (string)$data->post_type == 'attachment' && !$attachments ) continue;
if( (string)$data->post_type == 'wp_global_styles' ) continue;
if( !empty($item->guid) ){
$link = str_replace($old_url, $new_url, $item->guid);
}
/** IMAGES */
if( (string)$data->post_type == 'attachment' && !empty($data->attachment_url) ){
$url = (string)$data->attachment_url;
$file_name = basename( $url );
//$image_data = file_get_contents( $url );
$image_data = wp_remote_get( $url );
if ( !is_wp_error( $image_data ) && 200 === wp_remote_retrieve_response_code( $image_data ) ) {
$image_data = wp_remote_retrieve_body( $image_data );
}else{
$image_data = file_get_contents( $url );
}
$wp_filetype = wp_check_filetype( $file_name, null );
$mime = $wp_filetype['type'];
$upload = wp_upload_bits( $file_name, null, $image_data, (string)$data->post_date );
unset($upload);
unset($wp_filetype);
unset($url);
}
$newpost_arr = array(
'ID' => $post_id,
'guid' => $link,
'post_title' => $title,
'post_name' => (string)$data->post_name,
'post_mime_type' => $mime,
'menu_order' => (string)$data->menu_order,
'post_date' => (string)$data->post_date,
'post_date_gmt' => (string)$data->post_date_gmt,
'post_modified' => (string)$data->post_modified,
'post_modified_gmt' => (string)$data->post_modified_gmt,
'ping_status' => (string)$data->ping_status,
'post_content' => $content,
'post_excerpt' => $excerpt,
'post_status' => (string)$data->status,
'post_parent' => !empty((string)$data->post_parent) ? (string)$data->post_parent : 0,
'post_type' => (string)$data->post_type,
'post_author' => $author,
);
/** POST */
$wpdb->insert( $wpdb->prefix.'posts', $newpost_arr );
// if id exists
if( !$wpdb->insert_id ){
unset($newpost_arr['ID']);
$wpdb->insert( $wpdb->prefix.'posts', $newpost_arr );
$post_id = $wpdb->insert_id;
}
if( isset($data->postmeta) && is_iterable($data->postmeta)){
foreach ($data->postmeta as $pm) {
$meta_key = (string)$pm->meta_key;
$meta_value = (string)$pm->meta_value;
if( !in_array($meta_key, array('_wp_attachment_metadata', 'mfn-page-object')) ){
$wpdb->insert(
$wpdb->prefix.'postmeta',
array(
'post_id' => $post_id,
'meta_key' => $meta_key,
'meta_value' => $meta_value,
)
);
}
}
}
if( isset($item->category) ){
foreach ($item->category as $post_cat) {
$attrs = $post_cat->attributes();
if( !empty($attrs->nicename) && !empty($attrs->domain) ){
$thisterm = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}terms where slug = '".(string)$attrs->nicename."'" );
if( isset($thisterm->term_id) ){
$check_this_term = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}term_relationships where term_taxonomy_id = ".$thisterm->term_id." AND object_id = ".$post_id );
if( !isset($check_this_term->object_id) ){
$wpdb->insert(
$wpdb->prefix.'term_relationships',
array(
'object_id' => $post_id,
'term_taxonomy_id' => $thisterm->term_id,
'term_order' => 0,
)
);
}
}else{
$wpdb->insert(
$wpdb->prefix.'terms',
array(
//'term_id' => (string)$term->term_id,
'name' => (string)$attrs->nicename,
'slug' => (string)$attrs->nicename,
)
);
$last_term_id = $wpdb->insert_id;
$wpdb->insert(
$wpdb->prefix.'term_taxonomy',
array(
'term_taxonomy_id' => $last_term_id,
'term_id' => $last_term_id,
'taxonomy' => (string)$attrs->domain,
'parent' => !empty($parent->term_id) ? $parent->term_id : 0,
'count' => 1
)
);
$wpdb->insert(
$wpdb->prefix.'term_relationships',
array(
'object_id' => $post_id,
'term_taxonomy_id' => $last_term_id,
'term_order' => 0,
)
);
}
}
}
}
unset($title);
unset($content);
unset($excerpt);
unset($link);
unset($data);
unset($post_id);
}
unset($xml);
if( empty($save_option) ){
update_option( 'uploads_use_yearmonth_folders', '' );
}
return true;
}
/**
* Import term
*/
public function import_term($term, $tax){
global $wpdb;
$term_name = '';
$term_slug = '';
if( !empty( (string)$term->cat_name ) ){
$term_name = (string)$term->cat_name;
}else if( !empty( (string)$term->tag_name ) ){
$term_name = (string)$term->tag_name;
}else{
$term_name = (string)$term->term_name;
}
if( !empty( (string)$term->category_nicename ) ){
$term_slug = (string)$term->category_nicename;
}else if( !empty( (string)$term->tag_slug ) ){
$term_slug = (string)$term->tag_slug;
}else{
$term_slug = (string)$term->term_slug;
}
$wpdb->insert(
$wpdb->prefix.'terms',
array(
'term_id' => (string)$term->term_id,
'name' => $term_name,
'slug' => $term_slug,
)
);
$parent = false;
if( !empty( (string)$term->term_parent ) ){
$parent = get_term_by('slug', (string)$term->term_parent, $tax);
}elseif( !empty( (string)$term->category_parent ) ){
$parent = get_term_by('slug', (string)$term->category_parent, $tax);
}
$wpdb->insert(
$wpdb->prefix.'term_taxonomy',
array(
'term_taxonomy_id' => (string)$term->term_id,
'term_id' => (string)$term->term_id,
'taxonomy' => $tax,
'parent' => !empty($parent->term_id) ? $parent->term_id : 0,
'count' => 1
)
);
if( isset($term->termmeta) && is_iterable($term->termmeta) ){
foreach($term->termmeta as $tm){
$wpdb->insert(
$wpdb->prefix.'termmeta',
array(
'term_id' => (string)$term->term_id,
'meta_key' => (string)$tm->meta_key,
'meta_value' => (string)$tm->meta_value,
)
);
}
}
}
/**
* Theme options
*/
public function options(){
$file = wp_normalize_path( $this->demo_path .'/options.txt' );
$file_data = $this->get_file_data( $file );
$options = unserialize( call_user_func( 'base'.'64_decode', $file_data ) );
if( is_array( $options ) ){
// @since 26.4 options.txt contains header and footer conditions
if( ! empty($options['betheme']) ){
// after 26.4
$theme_options = $options['betheme'];
unset($options['betheme']);
} else {
// before 26.4
$theme_options = $options;
}
// theme options
// images URL | replace exported URL with destination URL
if( $this->url ){
$replace = home_url('/');
foreach( $theme_options as $key => $option ){
if( is_string( $option ) ){
// variable type string only
$option = $this->replace_multisite( $option );
$theme_options[$key] = str_replace( $this->url, $replace, $option );
}
}
}
update_option( 'betheme', $theme_options );
// product attributes
if( ! empty($options['attr_transient']) ){
update_option( '_transient_wc_attribute_taxonomies', $options['attr_transient']);
if( is_array($options['attr_transient']) && is_iterable($options['attr_transient']) ){
global $wpdb;
foreach( $options['attr_transient'] as $atr ){
$wpdb->insert(
$wpdb->prefix.'woocommerce_attribute_taxonomies',
array(
'attribute_id' => $atr->attribute_id,
'attribute_name' => $atr->attribute_name,
'attribute_label' => $atr->attribute_label,
'attribute_type' => $atr->attribute_type,
'attribute_orderby' => $atr->attribute_orderby,
'attribute_public' => $atr->attribute_public,
)
);
}
}
}
if( !empty($options['attr_transient_on_sale']) ){
update_option( '_transient_wc_products_onsale', $options['attr_transient_on_sale']);
}
// header and footer conditions
if( ! empty($options['conditions']) ){
foreach( $options['conditions'] as $key => $value ){
if( in_array( $key, ['mfn_popup_addons_archives','mfn_popup_addons_singular', 'mfn_portfolio_template', 'mfn_blog_template', 'mfn_single-post_template', 'mfn_single-portfolio_template'] ) ){
continue;
}
// $post = get_page_by_title( $value, null, 'template' );
// if( ! empty($post->ID) ){
// update_option( $key, $post->ID );
// }
$posts = get_posts(
array(
'post_type' => 'template',
'title' => $value,
'numberposts' => 1,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
)
);
if( ! empty($posts) ){
update_option( $key, $posts[0]->ID );
}
}
}
// popupy
if( !empty($options['conditions']['mfn_popup_addons_archives']) ){
update_option( 'mfn_popup_addons_archives', maybe_unserialize($options['conditions']['mfn_popup_addons_archives']));
}else{
delete_option('mfn_popup_addons_archives');
}
if( !empty($options['conditions']['mfn_popup_addons_singular']) ){
update_option( 'mfn_popup_addons_singular', maybe_unserialize($options['conditions']['mfn_popup_addons_singular']));
}else{
delete_option('mfn_popup_addons_singular');
}
if( !empty($options['conditions']['mfn_single-portfolio_template']) ) update_option( 'mfn_single-portfolio_template', maybe_unserialize($options['conditions']['mfn_single-portfolio_template']));
if( !empty($options['conditions']['mfn_single-post_template']) ) update_option( 'mfn_single-post_template', maybe_unserialize($options['conditions']['mfn_single-post_template']));
if( !empty($options['conditions']['mfn_blog_template']) ) update_option( 'mfn_blog_template', maybe_unserialize($options['conditions']['mfn_blog_template']));
if( !empty($options['conditions']['mfn_portfolio_template']) ) update_option( 'mfn_portfolio_template', maybe_unserialize($options['conditions']['mfn_portfolio_template']));
// header and footer builder
if( ! empty($options['map_menus']) ){
global $wpdb;
$map_menus = $options['map_menus'];
// replace menu IDs in builder
$templates = get_posts(
array(
'post_type' => 'template',
'meta_key' => 'mfn_template_type',
'meta_value' => ['header','footer','megamenu'],
'numberposts' => -1
)
);
if(count($templates) > 0){
foreach($templates as $template){
if( $builder = get_post_meta($template->ID, 'mfn-page-items', true) ){
$builder = unserialize( call_user_func( 'base'.'64_decode', $builder ) );
foreach( $builder as $s_k => $section ){
$updated = false;
if( ! empty( $section['wraps'] ) ){
foreach( $section['wraps'] as $w_k => $wrap ){
if( ! empty( $wrap['items'] ) ){
foreach( $wrap['items'] as $i_k => $item ){
// Betheme < 27.0 compatibility
if( ! isset( $item['attr'] ) ){
$item['attr'] = ! empty($item['fields']) ? $item['fields'] : [];
$builder[$s_k]['wraps'][$w_k]['items'][$i_k]['attr'] = $item['attr'];
unset( $builder[$s_k]['wraps'][$w_k]['items'][$i_k]['fields'] );
$updated = true;
}
if( ! empty($item['attr']['menu_display']) ){
$menu_id = $item['attr']['menu_display'];
if( ! empty( $map_menus[$menu_id] ) ){
$menu_slug = $map_menus[$menu_id]['slug'];
$menu_obj = wp_get_nav_menu_object( $menu_slug );
if( $menu_obj ){
$builder[$s_k]['wraps'][$w_k]['items'][$i_k]['attr']['menu_display'] = $menu_obj->term_id;
$updated = true;
}
}
}
}
}
}
}
}
if( $updated ){
$builder = call_user_func( 'base'.'64_encode', serialize( $builder ) );
update_post_meta($template->ID, 'mfn-page-items', $builder);
}
}
}
}
// update menu items custom post_meta
foreach( $map_menus as $menu ){
if( !empty($menu['items']) ){
foreach( $menu['items'] as $item ){
$menu_item_ID = false;
// find menu item
if( ! empty($item['page']) ){
// menu item links to page
// $post = get_page_by_title( $item['page'], null, 'page' );
$posts = get_posts(
array(
'post_type' => 'page',
'title' => $item['page'],
'numberposts' => 1,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
)
);
if( ! empty($posts) ){
$result = $wpdb->get_row( $wpdb->prepare(
"SELECT post_id
FROM $wpdb->postmeta
WHERE meta_key = '_menu_item_object_id'
AND meta_value = %s",
$posts[0]->ID ) );
if( ! empty($result->post_id) ){
$menu_item_ID = $result->post_id;
}
}
} elseif( ! empty($item['product_cat']) ) {
// menu item links to product category
$term = get_term_by( 'name', $item['product_cat'], 'product_cat');
if( ! empty($term->term_id) ){
$result = $wpdb->get_row( $wpdb->prepare(
"SELECT post_id
FROM $wpdb->postmeta
WHERE meta_key = '_menu_item_object_id'
AND meta_value = %s",
$term->term_id ) );
if( ! empty($result->post_id) ){
$menu_item_ID = $result->post_id;
}
}
} else {
// $post = get_page_by_title( $item['title'], null, 'nav_menu_item' );
// if( ! empty($post->ID) ){
// $menu_item_ID = $post->ID;
// }
$posts = get_posts(
array(
'post_type' => 'nav_menu_item',
'title' => $item['title'],
'numberposts' => 1,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
)
);
if( ! empty($posts) ){
$menu_item_ID = $posts[0]->ID;
}
}
if( ! $menu_item_ID ){
continue;
}
// megamenu
if( ! empty($item['mfn_menu_item_megamenu']) ){
// $post = get_page_by_title( $item['mfn_menu_item_megamenu'], null, 'template' );
// if( ! empty($post->ID) ){
// update_post_meta( $menu_item_ID, 'mfn_menu_item_megamenu', $post->ID );
// }
$posts = get_posts(
array(
'post_type' => 'template',
'title' => $item['mfn_menu_item_megamenu'],
'numberposts' => 1,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
)
);
if( ! empty($posts) ){
update_post_meta( $menu_item_ID, 'mfn_menu_item_megamenu', $posts[0]->ID );
}
}
// icon
if( ! empty($item['mfn_menu_item_icon']) ){
update_post_meta( $menu_item_ID, 'mfn_menu_item_icon', $item['mfn_menu_item_icon'] );
}
// icon image
if( ! empty($item['mfn_menu_item_icon_img']) ){
$img = $item['mfn_menu_item_icon_img'];
$replace = home_url('/');
$img = $this->replace_multisite( $img );
$img = str_replace( $this->url, $replace, $img );
update_post_meta( $menu_item_ID, 'mfn_menu_item_icon_img', $img );
}
}
}
}
}
} else {
echo 'Theme Options import failed';
}
return true;
}
/**
* Import | Menu - Locations
*/
function menu(){
$file = wp_normalize_path( $this->demo_path .'/menu.txt' );
$file_data = $this->get_file_data( $file );
$data = unserialize( call_user_func( 'base'.'64_decode', $file_data ) );
if( is_array( $data ) ){
$menus = wp_get_nav_menus();
foreach( $data as $key => $val ){
foreach( $menus as $menu ){
if( $val && $menu->slug == $val ){
$data[$key] = absint( $menu->term_id );
}
}
}
set_theme_mod( 'nav_menu_locations', $data );
} else {
echo 'Menu locations import failed';
}
return true;
}
/**
* Import | Widgets
*
* @param string $file
*/
function widgets(){
$file = wp_normalize_path( $this->demo_path .'/widget_data.json' );
$file_data = $this->get_file_data( $file );
if( $file_data ){
$this->import_widget_data( $file_data );
} else {
echo 'Widgets import failed';
}
return true;
}
/**
* Import slider
*/
public function slider( $attachments = false ){
$sliders = array();
$demo_args = $this->demos[ $this->demo ];
if( ! isset( $demo_args['plugins'] ) ){
return false;
}
if( false === array_search( 'rev', $demo_args['plugins'] ) ){
return false;
}
if( ! class_exists( 'RevSliderSlider' ) ){
return false;
}
if( isset( $demo_args['revslider'] ) ){
// multiple sliders
foreach( $demo_args['revslider'] as $slider ){
$sliders[] = $slider;
}
} else {
// single slider
$sliders[] = $this->demo_builder .'.zip';
}
if( method_exists( 'RevSliderSlider', 'importSliderFromPost' ) ){
// RevSlider < 6.0
$revslider = new RevSliderSlider();
foreach( $sliders as $slider ){
ob_start();
$file = wp_normalize_path( $this->demo_path .'/'. $slider );
$revslider->importSliderFromPost( true, false, $file );
ob_end_clean();
}
} elseif( method_exists( 'RevSliderSliderImport', 'import_slider' ) ){
// RevSlider 6.0 +
$revslider = new RevSliderSliderImport();
foreach( $sliders as $slider ){
ob_start();
$file = wp_normalize_path( $this->demo_path .'/'. $slider );
$revslider->import_slider( true, $file );
ob_end_clean();
}
} else {
echo 'Revolution Slider is outdated. Please update plugin.';
return false;
}
return true;
}
/**
* Set homepage
* and Media sizes
*/
function set_pages(){
update_option( 'show_on_front', 'page' );
$defaults = [
'page_on_front' => 'Home',
'page_for_posts' => 'Blog',
'woocommerce_shop_page_id' => 'Shop',
'woocommerce_cart_page_id' => 'Cart',
'woocommerce_checkout_page_id' => 'Checkout',
'woocommerce_myaccount_page_id' => 'My account',
'woocommerce_terms_page_id' => 'Privacy Policy',
];
if( ! empty( $this->demos[$this->demo]['pages'] ) ){
$pages = $this->demos[$this->demo]['pages'];
} else {
$pages = [];
}
$pages = array_merge( $defaults, $pages );
foreach ( $pages as $slug => $title ) {
// $post = get_page_by_title( $title );
$posts = get_posts(
array(
'post_type' => 'page',
'title' => $title,
'numberposts' => 1,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
)
);
if( ! empty($posts) ){
$post_id = $posts[0]->ID;
} else {
$post_id = '';
}
update_option( $slug, $post_id );
}
// Media size
$defaults = [
'thumbnail_size_w' => 300,
'thumbnail_size_h' => 300,
'thumbnail_crop' => 0,
'medium_size_w' => 500,
'medium_size_h' => 500,
'large_size_w' => 1200,
'large_size_h' => 1200,
];
if( ! empty( $this->demos[$this->demo]['media'] ) ){
$media = $this->demos[$this->demo]['media'];
} else {
$media = [];
}
$media = array_merge( $defaults, $media );
foreach ( $media as $size => $value ) {
update_option( $size, $value );
}
return true;
}
/**
* Regenerate static class
* Stiic CSS files generated for styles in: builder > element > style tab
*/
function regenerate_CSS(){
$items = get_posts( array(
'post_type' => array( 'page', 'post', 'template', 'portfolio', 'product' ),
'post_status' => 'publish',
'posts_per_page' => -1,
) );
if( ! empty( $items ) && is_array( $items ) ){
foreach( $items as $item ){
if( get_post_meta( $item->ID, 'mfn-page-local-style') ){
$mfn_styles = json_decode( get_post_meta( $item->ID, 'mfn-page-local-style', true ), true );
Mfn_Helper::generate_css( $mfn_styles, $item->ID );
}
}
}
return true;
}
/**
* HELPER functions ----------
*/
/**
* Import XML
*/
function import_xml( $attachments = false, $hide_output = false ){
$file = wp_normalize_path( $this->demo_path .'/content.xml.gz' );
// Importer classes
if( ! defined( 'WP_LOAD_IMPORTERS' ) ){
define( 'WP_LOAD_IMPORTERS', true );
}
if( ! class_exists( 'WP_Importer' ) ){
require_once(ABSPATH .'wp-admin/includes/class-wp-importer.php');
}
if( ! class_exists( 'WP_Import' ) ){
require_once(get_theme_file_path('/functions/importer/wordpress-importer/wordpress-importer.php'));
}
// Import START
if( class_exists( 'WP_Importer' ) && class_exists( 'WP_Import' ) ){
$import = new WP_Import();
if( $attachments ){
$import->fetch_attachments = true;
} else {
$import->fetch_attachments = false;
}
if( $hide_output ){
ob_start();
$import->import( $file );
ob_end_clean();
} else {
$import->import( $file );
}
return true;
}
return false;
}
/**
* Get demo url to replace
*/
function get_demo_url(){
if( 'theme' == $this->demo_builder ){
$url = 'https://themes.muffingroup.com/betheme/';
} elseif( 'bethemestore' == $this->demo_builder ){
$url = 'https://themes.muffingroup.com/betheme-store/';
} elseif( 'bethemestore_el' == $this->demo_builder ){
$url = 'https://themes.muffingroup.com/betheme-store_el/';
} elseif( 'bethemestore2' == $this->demo_builder ){
$url = 'https://themes.muffingroup.com/betheme-store2/';
} elseif( 'bethemestore2_el' == $this->demo_builder ){
$url = 'https://themes.muffingroup.com/betheme-store2_el/';
} else {
$url = array(
'http://themes.muffingroup.com/be/'. $this->demo_builder .'/',
'https://themes.muffingroup.com/be/'. $this->demo_builder .'/',
);
}
return $url;
}
/**
* Remove all menus
* TIP: Useful on slower servers when we need to resume downloading
*/
function remove_menus(){
global $wpdb;
$result = $wpdb->query( $wpdb->prepare(
"DELETE a,b,c
FROM {$wpdb->prefix}posts a
LEFT JOIN {$wpdb->prefix}term_relationships b
ON (a.ID = b.object_id)
LEFT JOIN $wpdb->postmeta c
ON (a.ID = c.post_id)
WHERE a.post_type = %s",
"nav_menu_item" ) );
echo 'Menu remove status: '. $result;
}
/**
* Elementor
*/
function elementor_settings(){
$wrapper = '1140';
if( isset( $this->demos[$this->demo]['wrapper'] ) ){
$wrapper = $this->demos[$this->demo]['wrapper'];
}
$settings = [
'elementor_cpt_support' => [ 'post', 'page', 'product', 'portfolio' ],
'elementor_disable_color_schemes' => 'yes',
'elementor_disable_typography_schemes' => 'yes',
'elementor_load_fa4_shim' => 'yes',
// Elementor < 3.0
'elementor_container_width' => $wrapper,
'elementor_stretched_section_container' => '#Wrapper',
'elementor_viewport_lg' => '960',
];
foreach ( $settings as $key => $value ) {
update_option( $key, $value );
}
// Elementor 3.0 +
if ( class_exists( 'Elementor\Plugin' ) ){
if ( defined( 'ELEMENTOR_VERSION' ) && version_compare( ELEMENTOR_VERSION, '3.0', '>=' )) {
$kit = \Elementor\Plugin::$instance->kits_manager->get_active_kit();
if ( ! $kit->get_id() ) {
// FIX: Elementor 3.3 + | default Kit do not exists after Database Reset
$created_default_kit = \Elementor\Plugin::$instance->kits_manager->create_default();
if ( ! $created_default_kit ) {
return false;
}
update_option( \Elementor\Core\Kits\Manager::OPTION_ACTIVE, $created_default_kit );
$kit = \Elementor\Plugin::$instance->kits_manager->get_active_kit();
}
$kit->update_settings( [
'container_width' => array(
'size' => $wrapper,
),
'stretched_section_container' => '#Wrapper',
'viewport_lg' => '960',
] );
}
}
}
/**
* Get FILE data
* @return string
*/
function get_file_data( $path ){
$data = false;
$path = wp_normalize_path( $path );
$wp_filesystem = Mfn_Helper::filesystem();
if( $wp_filesystem->exists( $path ) ){
if( ! $data = $wp_filesystem->get_contents( $path ) ){
$fp = fopen( $path, 'r' );
$data = fread( $fp, filesize( $path ) );
fclose( $fp );
}
}
return $data;
}
/**
* Replace Multisite URLs
* Multisite 'uploads' directory url
*/
function replace_multisite( $field ){
if ( is_multisite() ){
global $current_blog;
if( $current_blog->blog_id > 1 ){
$old_url = '/wp-content/uploads/';
$new_url = '/wp-content/uploads/sites/'. $current_blog->blog_id .'/';
$field = str_replace( $old_url, $new_url, $field );
}
}
return $field;
}
/**
* Replace Elementor URLs
*/
function replace_elementor(){
global $wpdb;
$old_url = $this->url;
if( is_array( $old_url ) ){
$old_url = $old_url[1]; // new demos uses https only
}
$old_url = str_replace('/','\/',$old_url);
$new_url = home_url('/');
// FIX: importer new line characters in longtext
$wpdb->query($wpdb->prepare("UPDATE $wpdb->postmeta
SET `meta_value` =
REPLACE( meta_value, %s, %s)
WHERE `meta_key` = '_elementor_data'
", "\n", ""));
// replace urls
$wpdb->query($wpdb->prepare("UPDATE $wpdb->postmeta
SET `meta_value` =
REPLACE( meta_value, %s, %s)
WHERE `meta_key` = '_elementor_data'
", $old_url, $new_url));
}
/**
* Replace Muffin Builder URLs
*/
function replace_builder(){
global $wpdb;
$uids = array();
$old_url = $this->url;
$new_url = home_url('/');
// FIX: importer new line characters in longtext
$wpdb->query($wpdb->prepare("UPDATE $wpdb->postmeta
SET `meta_value` =
REPLACE( meta_value, %s, %s)
WHERE `meta_key` = 'mfn-page-local-style'
", "\n", ""));
// replace urls | local styles
if( is_array( $old_url ) ){
$style_old_url = $old_url[1]; // new demos uses https only
} else {
$style_old_url = $old_url;
}
$wpdb->query($wpdb->prepare("UPDATE $wpdb->postmeta
SET `meta_value` =
REPLACE( meta_value, %s, %s)
WHERE `meta_key` = 'mfn-page-local-style'
", $style_old_url, $new_url));
// replace urls | builder
$results = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->postmeta
WHERE `meta_key` = %s
", 'mfn-page-items'));
// posts loop -----
if( is_array( $results ) ){
foreach( $results as $result_key => $result ){
$meta_id = $result->meta_id;
$meta_value = @unserialize( $result->meta_value );
// builder 2.0 compatibility
if( $meta_value === false ){
$meta_value = unserialize(call_user_func('base'.'64_decode', $result->meta_value));
}
// SECTIONS
if( is_array( $meta_value ) ){
foreach( $meta_value as $sec_key => $sec ){
// section uIDs
if( empty( $sec['uid'] ) ){
$uids[] = Mfn_Builder_Helper::unique_ID($uids);
$meta_value[$sec_key]['uid'] = end($uids);
} else {
$uids[] = $sec['uid'];
}
// section attributes
if( isset( $sec['attr'] ) && is_array( $sec['attr'] ) ){
foreach( $sec['attr'] as $attr_key => $attr ){
$attr = str_replace( $old_url, $new_url, $attr );
$attr = $this->replace_multisite( $attr );
$meta_value[$sec_key]['attr'][$attr_key] = $attr;
}
}
// FIX | Muffin Builder 2 compatibility
// there were no wraps inside section in Muffin Builder 2
if( ! isset( $sec['wraps'] ) && ! empty( $sec['items'] ) ){
$fix_wrap = array(
'size' => '1/1',
'uid' => Mfn_Builder_Helper::unique_ID($uids),
'items' => $sec['items'],
);
$sec['wraps'] = array( $fix_wrap );
$meta_value[$sec_key]['wraps'] = $sec['wraps'];
unset( $meta_value[$sec_key]['items'] );
}
// WRAPS
if( isset( $sec['wraps'] ) && is_array( $sec['wraps'] ) ){
foreach( $sec['wraps'] as $wrap_key => $wrap ){
// wrap uIDs
if( empty( $wrap['uid'] ) ){
$uids[] = Mfn_Builder_Helper::unique_ID($uids);
$meta_value[$sec_key]['wraps'][$wrap_key]['uid'] = end($uids);
} else {
$uids[] = $wrap['uid'];
}
// wrap attributes
if( isset( $wrap['attr'] ) && is_array( $wrap['attr'] ) ){
foreach( $wrap['attr'] as $attr_key => $attr ){
$attr = str_replace( $old_url, $new_url, $attr );
$attr = $this->replace_multisite( $attr );
$meta_value[$sec_key]['wraps'][$wrap_key]['attr'][$attr_key] = $attr;
}
}
// ITEMS
if( isset( $wrap['items'] ) && is_array( $wrap['items'] ) ){
foreach( $wrap['items'] as $item_key => $item ){
// item uIDs
if( empty( $item['uid'] ) ){
$uids[] = Mfn_Builder_Helper::unique_ID($uids);
$meta_value[$sec_key]['wraps'][$wrap_key]['items'][$item_key]['uid'] = end($uids);
} else {
$uids[] = $item['uid'];
}
// item fields
// Betheme < 27.0 compatibility
if( ! isset( $item['attr'] ) ){
$item['attr'] = ! empty($item['fields']) ? $item['fields'] : [];
$meta_value[$sec_key]['wraps'][$wrap_key]['items'][$item_key]['attr'] = $item['attr'];
unset( $meta_value[$sec_key]['wraps'][$wrap_key]['items'][$item_key]['fields'] );
$updated = true;
}
if( ! empty( $item['attr'] ) ){
foreach( $item['attr'] as $field_key => $field ) {
if( 'tabs' == $field_key ) {
// tabs
if( is_array( $field ) ){
foreach( $field as $tab_key => $tab ){
// tabs fields
if( is_array( $tab ) ){
foreach( $tab as $tab_field_key => $tab_field ){
if( is_string( $field ) ){
$field = str_replace( $old_url, $new_url, $tab_field );
$field = $this->replace_multisite( $field );
$meta_value[$sec_key]['wraps'][$wrap_key]['items'][$item_key]['attr']['tabs'][$tab_key][$tab_field_key] = $field;
}
}
}
}
}
} elseif( is_string( $field ) ){
// default
$field = str_replace( $old_url, $new_url, $field );
$field = $this->replace_multisite( $field );
$meta_value[$sec_key]['wraps'][$wrap_key]['items'][$item_key]['attr'][$field_key] = $field;
}
}
}
}
}
}
}
}
}
// builder 2.0 compatibility
$meta_value = call_user_func('base'.'64_encode', serialize( $meta_value ));
$wpdb->query($wpdb->prepare("UPDATE $wpdb->postmeta
SET `meta_value` = %s
WHERE `meta_key` = 'mfn-page-items'
AND `meta_id`= %d
", $meta_value, $meta_id));
}
}
}
/**
* Parse JSON import file
*
* http://wordpress.org/plugins/widget-settings-importexport/
*
* @param string $json_data
*/
function import_widget_data( $json_data ) {
$json_data = json_decode( $json_data, true );
$sidebar_data = $json_data[0];
$widget_data = $json_data[1];
// prepare widgets table
$widgets = array();
foreach( $widget_data as $k_w => $widget_type ){
if( $k_w ){
$widgets[ $k_w ] = array();
foreach( $widget_type as $k_wt => $widget ){
if( is_int( $k_wt ) ) $widgets[$k_w][$k_wt] = 1;
}
}
}
// sidebars
foreach ( $sidebar_data as $title => $sidebar ) {
$count = count( $sidebar );
for ( $i = 0; $i < $count; $i++ ) {
$widget = array( );
$widget['type'] = trim( substr( $sidebar[$i], 0, strrpos( $sidebar[$i], '-' ) ) );
$widget['type-index'] = trim( substr( $sidebar[$i], strrpos( $sidebar[$i], '-' ) + 1 ) );
if ( !isset( $widgets[$widget['type']][$widget['type-index']] ) ) {
unset( $sidebar_data[$title][$i] );
}
}
$sidebar_data[$title] = array_values( $sidebar_data[$title] );
}
// widgets
foreach ( $widgets as $widget_title => $widget_value ) {
foreach ( $widget_value as $widget_key => $widget_value ) {
$widgets[$widget_title][$widget_key] = $widget_data[$widget_title][$widget_key];
}
}
$sidebar_data = array( array_filter( $sidebar_data ), $widgets );
$this->parse_import_data( $sidebar_data );
}
/**
* Import widgets
*
* http://wordpress.org/plugins/widget-settings-importexport/
*
* @param array $import_array
* @return boolean
*/
function parse_import_data( $import_array ) {
$sidebars_data = $import_array[0];
$widget_data = $import_array[1];
mfn_register_sidebars(); // fix for sidebars added in Theme Options
$current_sidebars = array( );
$new_widgets = array( );
foreach ( $sidebars_data as $import_sidebar => $import_widgets ) :
foreach ( $import_widgets as $import_widget ) :
// if NOT the sidebar exists
if ( ! isset( $current_sidebars[$import_sidebar] ) ){
$current_sidebars[$import_sidebar] = array();
}
$title = trim( substr( $import_widget, 0, strrpos( $import_widget, '-' ) ) );
$index = trim( substr( $import_widget, strrpos( $import_widget, '-' ) + 1 ) );
$current_widget_data = get_option( 'widget_' . $title );
$new_widget_name = $this->get_new_widget_name( $title, $index );
$new_index = trim( substr( $new_widget_name, strrpos( $new_widget_name, '-' ) + 1 ) );
if ( !empty( $new_widgets[ $title ] ) && is_array( $new_widgets[$title] ) ) {
while ( array_key_exists( $new_index, $new_widgets[$title] ) ) {
$new_index++;
}
}
$current_sidebars[$import_sidebar][] = $title . '-' . $new_index;
if ( array_key_exists( $title, $new_widgets ) ) {
$new_widgets[$title][$new_index] = $widget_data[$title][$index];
// notice fix
if( ! key_exists('_multiwidget',$new_widgets[$title]) ) $new_widgets[$title]['_multiwidget'] = '';
$multiwidget = $new_widgets[$title]['_multiwidget'];
unset( $new_widgets[$title]['_multiwidget'] );
$new_widgets[$title]['_multiwidget'] = $multiwidget;
} else {
$current_widget_data[$new_index] = $widget_data[$title][$index];
// notice fix
if( ! key_exists('_multiwidget',$current_widget_data) ) $current_widget_data['_multiwidget'] = '';
$current_multiwidget = $current_widget_data['_multiwidget'];
$new_multiwidget = isset($widget_data[$title]['_multiwidget']) ? $widget_data[$title]['_multiwidget'] : false;
$multiwidget = ($current_multiwidget != $new_multiwidget) ? $current_multiwidget : 1;
unset( $current_widget_data['_multiwidget'] );
$current_widget_data['_multiwidget'] = $multiwidget;
$new_widgets[$title] = $current_widget_data;
}
endforeach;
endforeach;
// remove old widgets
delete_option( 'sidebars_widgets' );
if ( isset( $new_widgets ) && isset( $current_sidebars ) ) {
update_option( 'sidebars_widgets', $current_sidebars );
foreach ( $new_widgets as $title => $content )
update_option( 'widget_' . $title, $content );
return true;
}
return false;
}
/**
* Get new widget name
*
* http://wordpress.org/plugins/widget-settings-importexport/
*
* @param string $widget_name
* @param int $widget_index
* @return string
*/
function get_new_widget_name( $widget_name, $widget_index ) {
$current_sidebars = get_option( 'sidebars_widgets' );
$all_widget_array = array( );
foreach ( $current_sidebars as $sidebar => $widgets ) {
if ( !empty( $widgets ) && is_array( $widgets ) && $sidebar != 'wp_inactive_widgets' ) {
foreach ( $widgets as $widget ) {
$all_widget_array[] = $widget;
}
}
}
while ( in_array( $widget_name . '-' . $widget_index, $all_widget_array ) ) {
$widget_index++;
}
$new_widget_name = $widget_name . '-' . $widget_index;
return $new_widget_name;
}
}