WS_OK_7.4.33
<?php
if( ! defined( 'AVIA_FW' ) ) { exit( 'No direct script access allowed' ); }
if( ! class_exists( 'avia_wp_import', false ) )
{
class avia_wp_import extends WP_Import
{
// var $preStringOption;
// var $results;
// var $getOptions;
// var $saveOptions;
// var $termNames;
/**
* Handles import of options saved from a demo
*
* @since 4.8.2 support fot txt files including options similar to php file
* @param string $option_file full path to php or txt file
* @param boolean $import_only
* @return boolean
*/
public function saveOptions( $option_file, $import_only = false )
{
if( false !== strpos( $option_file, '.php' ) )
{
@include_once( $option_file );
}
else if( false !== strpos( $option_file, '.txt' ) )
{
$file_content = $this->read_txt_file_contents( $option_file );
extract( $file_content );
}
// switch( $import_only )
// {
// case 'options':
// $dynamic_pages = $dynamic_elements = false;
// break;
// case 'dynamic_pages':
// $options = $dynamic_elements = false;
// break;
// case 'dynamic_elements':
// $options = $dynamic_pages = false;
// break;
// }
// if( ! isset( $options ) && ! isset( $dynamic_pages ) && ! isset( $dynamic_elements ) )
if( ! isset( $options ) )
{
return false;
}
$options = unserialize( base64_decode( $options ) );
// $dynamic_pages = unserialize( base64_decode( $dynamic_pages ) );
// $dynamic_elements = unserialize( base64_decode( $dynamic_elements ) );
global $avia;
if( ! isset( $database_option ) || ! is_array( $database_option ) )
{
$database_option = array();
}
if( is_array( $options ) )
{
foreach( $avia->option_pages as $page )
{
if( ! array_key_exists( $page['parent'], $options ) )
{
$database_option[ $page['parent'] ] = array();
}
else
{
$database_option[ $page['parent'] ] = $this->extract_default_values( $options[ $page['parent'] ], $page, $avia->subpages ) ;
}
}
}
if( ! empty( $database_option ) )
{
update_option( $avia->option_prefix, $database_option );
}
// if( ! empty( $dynamic_pages ) )
// {
// update_option($avia->option_prefix.'_dynamic_pages', $dynamic_pages );
// }
//
// if( ! empty( $dynamic_elements ) )
// {
// update_option($avia->option_prefix.'_dynamic_elements', $dynamic_elements );
// }
if( ! empty( $fonts ) )
{
$this->import_iconfont( $fonts );
}
if( ! empty( $layerslider ) )
{
$this->import_layerslides( $layerslider );
}
if( ! empty( $widget_settings ) )
{
$widget_settings = unserialize( base64_decode( $widget_settings ) );
if( ! empty( $widget_settings ) )
{
foreach( $widget_settings as $key => $setting )
{
update_option( $key, $setting );
}
}
}
}
/**
* As we now support txt for demo options file we have to extract the content and return the array
* To be backwards comp with already existing demos we support the old syntax:
* $key = '......';
*
* @since 4.8.2
* @param string $file
* @return array
*/
protected function read_txt_file_contents( $file )
{
$content = @file_get_contents( $file );
$content = trim( $content );
if( empty( $content ) )
{
return array();
}
$content = str_replace( "\r", "\n", $content );
$lines = explode( "\n", $content );
$options = array();
foreach( $lines as $key => $line )
{
$sep = strpos( $line, '=' );
if( false === $sep )
{
continue;
}
$opt_key = trim( substr( $line, 0, $sep ) );
$opt_val = trim( substr( $line, $sep + 1 ) );
$opt_key = str_replace( '$', '', $opt_key );
$len = strlen( $opt_val );
if( strpos( $opt_val, '"' ) !== 0 )
{
continue;
}
if( strrpos( $opt_val, '";' ) !== ( $len - 2 ) )
{
continue;
}
$options[ $opt_key ] = substr( $opt_val, 1, $len - 3 );
}
return $options;
}
/**
*
* @param string $layerslider
*/
protected function import_layerslides( $layerslider )
{
@ini_set( 'max_execution_time', 300 );
$slider = urlencode( $layerslider );
$remoteURL = 'https://kriesi.at/themes/wp-content/uploads/avia-sample-layerslides/' . $slider . '.zip';
$uploads = wp_upload_dir();
$downloadPath = $uploads['basedir'] . '/lsimport.zip';
// Download package
$request = wp_remote_post( $remoteURL, array(
'method' => 'POST',
'timeout' => 300,
'body' => array()
));
$zip = wp_remote_retrieve_body( $request );
if( ! $zip )
{
die( __( "LayerSlider couldn't download your selected slider. Please check LayerSlider -> System Status for potential issues. The WP Remote functions may be unavailable or your web hosting provider has to allow external connections to our domain.", 'avia_framework' ) );
}
// Save package
if( ! file_put_contents( $downloadPath, $zip ) )
{
die( __( "LayerSlider couldn't save the downloaded slider on your server. Please check LayerSlider -> System Status for potential issues. The most common reason for this issue is the lack of write permission on the /wp-content/uploads/ directory.", 'avia_framework' ) );
}
// Load importUtil & import the slider
include LS_ROOT_PATH . '/classes/class.ls.importutil.php';
$import = new LS_ImportUtil( $downloadPath );
// Remove package
if( file_exists( $downloadPath ) )
{
unlink( $downloadPath );
}
}
/**
*
* @param string $new_fonts
*/
protected function import_iconfont( $new_fonts )
{
@ini_set( 'max_execution_time', 300 );
//update iconfont option
$key = 'avia_builder_fonts';
$fonts_old = get_option( $key );
if( empty( $fonts_old ) )
{
$fonts_old = array();
}
$new_fonts = unserialize( base64_decode( $new_fonts ) );
$merged_fonts = array_merge( $new_fonts , $fonts_old );
$files_to_copy = array( 'config.json', 'FONTNAME.svg', 'FONTNAME.ttf', 'FONTNAME.eot', 'FONTNAME.woff', 'FONTNAME.woff2' );
update_option( $key, $merged_fonts );
$http = new WP_Http();
$font_uploader = new avia_font_manager();
$paths = $font_uploader->paths;
//if a temp dir already exists remove it and create a new one
if( ! is_dir( $paths['tempdir'] ) )
{
$fontdir = avia_backend_create_folder( $paths['tempdir'], false );
if( ! $fontdir )
{
echo __( 'Wasn\'t able to create the folder for font files', 'avia_framework' );
}
}
//download iconfont files into uploadsfolder
foreach( $new_fonts as $font_name => $font )
{
if( empty( $fonts_old[ $font_name ] ) )
{
//folder name
$new_font_folder = trailingslashit( $paths['tempdir'] );
//if a sub dir already exists remove it and create a new one
if( is_dir( $new_font_folder ) )
{
$font_uploader->delete_folder( $new_font_folder );
}
$subpdir = avia_backend_create_folder( $new_font_folder, false );
if( ! $subpdir )
{
echo __( 'Wasn\'t able to create sub-folder for font files', 'avia_framework' );
}
//iterate over files on remote server and create the same ones on this server
foreach( $files_to_copy as $file_to_copy )
{
$file_to_copy = str_replace( 'FONTNAME', $font_name, $file_to_copy );
$origin_url = $font['origin_folder'] . trailingslashit( $font['folder'] ) . $file_to_copy;
$new_path = trailingslashit( $new_font_folder ) . $file_to_copy;
$headers = $http->request( $origin_url, array( 'stream' => true, 'filename' => $new_path ) );
}
//create a config file
$font_uploader->font_name = $font_name;
$font_uploader->create_config();
}
}
}
/**
* Extracts the default values from the option_page_data array in case no database savings were done yet
* The functions calls itself recursive with a subset of elements if groups are encountered within that array
*
* @param array $elements
* @param array $page
* @param array $subpages
* @return array
*/
public function extract_default_values( array $elements, array $page, array $subpages )
{
$values = array();
foreach( $elements as $element )
{
if( isset( $element['type'] ) && ( $element['type'] == 'group') )
{
if( ! is_array( $element['std'] ) )
{
// Fallback situation in case theme option std value is not an array
$values[ $element['id'] ][0] = array();
}
else
{
$iterations = count( $element['std'] );
for( $i = 0; $i < $iterations; $i++ )
{
$values[ $element['id'] ][ $i ] = $this->extract_default_values( $element['std'][ $i ], $page, $subpages );
}
}
}
else if( isset( $element['id'] ) )
{
if( ! isset($element['std'] ) )
{
$element['std'] = '';
}
if( $element['type'] == 'select' && ! is_array( $element['subtype'] ) )
{
if( ! isset( $element['taxonomy'] ) )
{
$element['taxonomy'] = 'category';
}
$values[ $element['id'] ] = $this->getSelectValues( $element['subtype'], $element['std'], $element['taxonomy'] );
}
else
{
$values[ $element['id'] ] = $element['std'];
}
}
}
return $values;
}
/**
* Filters the imported options:
*
* If filter_xxx is used the original options are kept and only options set in filter_xxx are copied.
* If skip_xxx is used the imported option values are replaced by the old ones.
*
* Filter has priority to skip.
*
* If no filter the original array is returned.
*
*
* $filter = array(
* filter_tabs => parent:slug,parent:slug
* filter_values => parent:option_name,parent:option_name
* skip_tabs => parent:slug,parent:slug
* skip_values => parent:option_name,parent:option_name
* )
*
* @since 4.6.4
* @param array $database_option
* @param array $imported_options
* @param array $filter
* @return array
*/
public function filter_imported_options( array $database_option, array $imported_options, array $filter )
{
global $avia;
if( empty( $filter ) )
{
return $database_option;
}
$filter_keys = array( 'filter_tabs', 'filter_values', 'skip_tabs', 'skip_values' );
$filter_stat = false;
foreach( $filter_keys as $key )
{
if( isset( $filter[ $key ] ) && trim( $filter[ $key ] ) != '' )
{
$filter_stat = false !== strpos( $key, 'filter' ) ? 'filter' : 'skip';
break;
}
}
if( false === $filter_stat )
{
return $database_option;
}
// Cleanup array
foreach( $filter_keys as $key )
{
if( isset( $filter[ $key ] ) && trim( $filter[ $key ] ) == '' )
{
unset( $filter[ $key ] );
}
}
$avia_options = is_array( $avia->options ) ? $avia->options : array();
if( 'filter' == $filter_stat )
{
$new_options = $avia_options;
}
else
{
$new_options = $database_option;
}
foreach( $filter_keys as $operation )
{
if( ! isset( $filter[ $operation ] ) )
{
continue;
}
$sources = explode( ',', $filter[ $operation ] );
foreach( $sources as $source )
{
if( false === strpos( $source, ':' ) )
{
$source = ':' . $source;
}
$source = explode( ':', $source, 2 );
$parent = trim( $source[0] );
if( false !== strpos( $operation, 'value' ) )
{
$id = trim( $source[1] );
$default = $this->get_std_value( $parent, $id );
if( false !== strpos( $operation, 'filter' ) )
{
$new_options[ $parent ][ $id ] = isset( $database_option[ $parent ][ $id ] ) ? $database_option[ $parent ][ $id ] : $default;
}
else
{
$new_options[ $parent ][ $id ] = isset( $avia_options[ $parent ][ $id ] ) ? $avia_options[ $parent ][ $id ] : $default;
}
continue;
}
if( ! isset( $imported_options[ $parent ] ) || ! is_array( $imported_options[ $parent ] ) )
{
continue;
}
$subpage = trim( $source[1] );
foreach( $imported_options[ $parent ] as $element )
{
if( isset( $element['id'] ) && isset( $element['slug'] ) && $element['slug'] == $subpage )
{
$id = $element['id'];
$default = $this->get_std_value( $parent, $id );
if( false !== strpos( $operation, 'filter' ) )
{
$new_options[ $parent ][ $id ] = isset( $database_option[ $parent ][ $id ] ) ? $database_option[ $parent ][ $id ] : $default;
}
else
{
$new_options[ $parent ][ $id ] = isset( $avia_options[ $parent ][ $id ] ) ? $avia_options[ $parent ][ $id ] : $default;
}
}
}
}
}
return $new_options;
}
/**
* Get the std value for an option as fallback in case element is missing
*
* @since 4.6.4
* @param string $parent
* @param string $id
* @return string
*/
protected function get_std_value( $parent, $id )
{
global $avia;
if( ! isset( $avia->subpages[ $parent ] ) || ! is_array( $avia->subpages[ $parent ] ) )
{
return '';
}
$subpages = $avia->subpages[ $parent ];
foreach( $avia->option_page_data as $key => $element )
{
if( isset( $element['slug'] ) && in_array( $element['slug'], $subpages ) )
{
if( isset( $element['id'] ) && $element['id'] == $id )
{
return ( isset( $element['std'] ) ) ? $element['std'] : '';
}
}
}
return '';
}
/**
*
* @param string $type
* @param string $name
* @param string $taxonomy
* @return string|int
*/
protected function getSelectValues( $type, $name, $taxonomy )
{
switch( $type )
{
case 'page':
case 'post':
$qa = [
'post_type' => $type,
'title' => $name,
'post_status' => 'all',
'posts_per_page' => 1,
'no_found_rows' => true,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
'orderby' => 'post_date ID',
'order' => 'ASC'
];
$query = new WP_Query( $qa );
if( ! empty( $query->post ) )
{
return $query->post->ID;
}
break;
case 'cat':
if( ! empty( $name ) )
{
$return = array();
foreach( $name as $cat_name )
{
if( $cat_name )
{
if( ! $taxonomy )
{
$taxonomy = 'category';
}
$the_category = get_term_by( 'name', $cat_name, $taxonomy );
if( $the_category )
{
$return[] = $the_category->term_id;
}
}
}
if( ! empty( $return ) )
{
if( ! isset( $return[1] ) )
{
$return = $return[0];
}
else
{
$return = implode( ',', $return );
}
}
return $return;
}
break;
}
}
/*
/**
* Renames existing menus so that newly added menu items are not appended
*/
public function rename_existing_menus()
{
$menus = wp_get_nav_menus();
if( ! empty( $menus) )
{
//wp_delete_nav_menu($menu->slug);
foreach( $menus as $menu )
{
$updated = false;
$i = 0;
while( ! is_numeric( $updated ) ) //try to update the menu name. if it exists increment the number and thereby change the name
{
$i++;
$args['menu-name'] = __( 'Previously used menu','avia_framework' ) . ' ' . $i;
$args['description'] = $menu->description;
$args['parent'] = $menu->parent;
$updated = wp_update_nav_menu_object( $menu->term_id, $args ); //return a number on success or wp_error object if menu name exists
//fallback, prevents infinite loop if something weird happens
if( $i > 100 )
{
$updated = 1;
}
}
}
}
}
/**
*
*
*/
public function set_menus()
{
global $avia_config;
//get all registered menu locations
$locations = get_theme_mod( 'nav_menu_locations' );
//get all created menus
$avia_menus = wp_get_nav_menus();
if( ! empty( $avia_menus ) && ! empty( $avia_config['nav_menus'] ) )
{
$avia_navs = array();
foreach( $avia_config['nav_menus'] as $key => $nav_menu )
{
if( isset( $nav_menu['html'] ) )
{
$avia_navs[ $key ] = $nav_menu['html'];
}
else
{
$avia_navs[ $key ] = $nav_menu;
}
}
foreach( $avia_menus as $avia_menu )
{
//check if we got a menu that corresponds to the Menu name array ($avia_config['nav_menus']) we have set in functions.php
// a partial match like 'Main Menu' 'Main', or 'Secondary' is enough
if( is_object( $avia_menu ) )
{
foreach( $avia_navs as $key => $value )
{
$value = strtolower( $value );
$name = strtolower( $avia_menu->name );
if( strpos( $value, $name ) !== false )
{
$locations[ $key ] = $avia_menu->term_id;
}
}
}
}
}
//update the theme
set_theme_mod( 'nav_menu_locations', $locations );
}
/**
*
* @param array $item
* @return void
*/
function process_menu_item( $item )
{
@ini_set('max_execution_time', 300);
// skip draft, orphaned menu items
if ( 'draft' == $item['status'] )
{
return;
}
$menu_slug = false;
if ( isset( $item['terms'] ) )
{
// loop through terms, assume first nav_menu term is correct menu
foreach ( $item['terms'] as $term )
{
if ( 'nav_menu' == $term['domain'] )
{
$menu_slug = $term['slug'];
break;
}
}
}
// no nav_menu term associated with this menu item
if ( ! $menu_slug )
{
_e( 'Menu item skipped due to missing menu slug', 'wordpress-importer' );
echo '<br />';
return;
}
$menu_id = term_exists( $menu_slug, 'nav_menu' );
if ( ! $menu_id )
{
printf( __( 'Menu item skipped due to invalid menu slug: %s', 'wordpress-importer' ), esc_html( $menu_slug ) );
echo '<br />';
return;
}
else
{
$menu_id = is_array( $menu_id ) ? $menu_id['term_id'] : $menu_id;
}
foreach( $item['postmeta'] as $meta )
{
${$meta['key']} = $meta['value']; //kriesi mod: php 7 fix - added braces
}
if( 'taxonomy' == $_menu_item_type && isset( $this->processed_terms[ intval( $_menu_item_object_id ) ] ) )
{
$_menu_item_object_id = $this->processed_terms[ intval( $_menu_item_object_id ) ];
}
else if( 'post_type' == $_menu_item_type && isset( $this->processed_posts[ intval( $_menu_item_object_id ) ] ) )
{
$_menu_item_object_id = $this->processed_posts[ intval( $_menu_item_object_id ) ];
}
else if( 'custom' != $_menu_item_type )
{
// associated object is missing or not imported yet, we'll retry later
$this->missing_menu_items[] = $item;
return;
}
if( isset( $this->processed_menu_items[ intval( $_menu_item_menu_item_parent ) ] ) )
{
$_menu_item_menu_item_parent = $this->processed_menu_items[ intval( $_menu_item_menu_item_parent ) ];
}
else if( $_menu_item_menu_item_parent )
{
$this->menu_item_orphans[intval($item['post_id'])] = (int) $_menu_item_menu_item_parent;
$_menu_item_menu_item_parent = 0;
}
// wp_update_nav_menu_item expects CSS classes as a space separated string
$_menu_item_classes = maybe_unserialize( $_menu_item_classes );
if( is_array( $_menu_item_classes ) )
{
$_menu_item_classes = implode( ' ', $_menu_item_classes );
}
$args = array(
'menu-item-object-id' => $_menu_item_object_id,
'menu-item-object' => $_menu_item_object,
'menu-item-parent-id' => $_menu_item_menu_item_parent,
'menu-item-position' => intval( $item['menu_order'] ),
'menu-item-type' => $_menu_item_type,
'menu-item-title' => $item['post_title'],
'menu-item-url' => $_menu_item_url,
'menu-item-description' => $item['post_content'],
'menu-item-attr-title' => $item['post_excerpt'],
'menu-item-target' => $_menu_item_target,
'menu-item-classes' => $_menu_item_classes,
'menu-item-xfn' => $_menu_item_xfn,
'menu-item-status' => $item['status']
);
$id = wp_update_nav_menu_item( $menu_id, 0, $args );
if ( $id && ! is_wp_error( $id ) )
$this->processed_menu_items[intval($item['post_id'])] = (int) $id;
/*kriesi mod: necessary to add custom post meta to the import*/
if ( $id && ! is_wp_error( $id ) )
{
foreach( $item['postmeta'] as $itemkey => $meta )
{
$key = str_replace( '_', '-', ltrim( $meta['key'], '_' ) );
/*do a check: only add keys that do not exist - parent menu item is a special case that must be checked as well*/
if( ! array_key_exists( $key, $args ) && $key != 'menu-item-menu-item-parent' )
{
if( ! empty( $meta['value'] ) )
{
update_post_meta( $id, $meta['key'], $meta['value'] );
}
}
}
}
/*end mod*/
}
}
} // end class_exists