: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
'post_type' => get_post_types(),
'meta_key' => '_' . static::DEMO_KEY,
protected static function set_import_id($oldId, $newId, $type, $skinId = 'default') {
$items = Themify_Storage::get(static::DEMO_KEY);
$items = empty($items) ? array() : json_decode($items, true);
if (empty($items[$skinId])) {
$items[$skinId] = array();
if (empty($items[$skinId][$type])) {
$items[$skinId][$type] = array();
$items[$skinId][$type][] = $newId;
$items[$skinId][$type][$oldId] = $newId;
return Themify_Storage::set(static::DEMO_KEY, $items);
protected static function get_import_id($old_id, $skinId = 'default', $import_type = null) {
$table = $wpdb->postmeta;
if ($import_type === 'taxonomy') {
$table = $wpdb->termmeta;
$items = Themify_Storage::get(static::DEMO_KEY);
$items = empty($items) ? array() : json_decode($items, true);
if (isset($items[$skinId])) {
$items = $items[$skinId];
if (!empty($items) && !empty($items[$type][$old_id])) {
return $items[$type][$old_id];
$result = $wpdb->get_row($wpdb->prepare(
"SELECT {$key} FROM {$table} WHERE meta_key = '_" . static::DEMO_KEY . "_id' AND meta_value = %d LIMIT 1",
if (isset($result[$key])) {
if (self::set_import_id($old_id, $result[$key], $type, $skinId)) {
if ($type === 'taxonomy') {
delete_term_meta($result[$key], '_' . static::DEMO_KEY . '_id');
delete_post_meta($result[$key], '_' . static::DEMO_KEY . '_id');
public static function import_term(array $term, $skinId = 'default', $update = false) {
if (taxonomy_exists($term['taxonomy'])) {
if ($term['taxonomy'] === 'nav_menu') {
return self::import_menu($term, $update);
$term_id = term_exists($term['slug'], $term['taxonomy']);
if (empty($term['parent']) || empty($term['parent_slug'])) {
$parentTerm = self::get_term_id_by_slug($term['parent_slug'], $term['taxonomy'], self::get_import_id($term['parent'], $skinId, 'taxonomy'));
$parent = $parentTerm !== false ? $parentTerm : 0;
$term_id = wp_insert_term($term['name'], $term['taxonomy'], array(
'description' => isset($term['description']) ? $term['description'] : ''
} elseif ($update === true) {
$term_id = wp_update_term($term_id, $term['taxonomy'], array(
'description' => isset($term['description']) ? $term['description'] : ''
if ($term_id && !is_wp_error($term_id)) {
if (is_array($term_id)) {
$term_id = $term_id['term_id'];
return self::get_import_id($term_id, $skinId, 'taxonomy') ? true : (int) $term_id;
return array('msg' => sprintf(__("Taxonomy %s dosen't exist", 'themify'), $term['taxonomy']), 'skip' => $term['taxonomy']);
public static function import_post(array $post, $skinId = 'default', $update = false) {
if (post_type_exists($post['post_type'])) {
$post['post_author'] = get_current_user_id();
$post['post_status'] = 'publish';
if (!isset($post['post_parent'])) {
$post['post_parent'] = 0;
if (!isset($post['menu_order'])) {
if (!isset($post['post_content'])) {
$post['post_content'] = '';
if (!isset($post['post_excerpt'])) {
$post['post_excerpt'] = '';
if (isset($post['post_date'])) {
$post['post_modified'] = $post['post_date'];
if ($post['post_type'] === 'nav_menu_item') {
return self::import_menu_item($post, $skinId, $update);
/* Menu items don't have reliable post_title, skip the post_exists check */
/* With tbp_template, different Themes can have duplicate templates so skip post_exists */
if ($post['post_type'] !== 'tbp_template') {
$isWcPage = !empty($post['is_wc_page']) && themify_is_woocommerce_active();
$post_id = isset($post['post_date'], $post['post_title']) ? post_exists($post['post_title'], '', $post['post_date'], $post['post_type']) : 0;
if ($isWcPage === true && !$post_id && isset($post['post_name'])) {
$post_id = wc_get_page_id(str_replace('-', '', $post['post_name'])); //wc doesn't check if a post exist
$post_id = self::get_import_id($old_id, $skinId);
if (!$post_id || $post_id <= 0 || get_post_type($post_id) !== $post['post_type']) {
if ($post['post_parent'] > 0) {
$parent_id = self::get_import_id($post['post_parent'], $skinId);
$post['post_parent'] = empty( $parent_id ) ? 0 : $parent_id;
* for hierarchical taxonomies, IDs must be used so wp_set_post_terms can function properly
* convert term slugs to IDs for hierarchical taxonomies
if (!empty($post['tax_input'])) {
foreach ($post['tax_input'] as $tax => $terms) {
if (!taxonomy_exists($tax)) {
unset($post['tax_input'][$tax]);
} elseif (is_taxonomy_hierarchical($tax)) {
$post['tax_input'][$tax] = array();
$terms = explode(', ', $terms);
$tid = self::get_term_id_by_slug($t, $tax);
$post['tax_input'][$tax][] = $tid;
if (empty($post['tax_input'][$tax])) {
unset($post['tax_input'][$tax]);
$builderKey = ThemifyBuilder_Data_Manager::META_KEY;
if (!empty($post['meta_input'][$builderKey])) {
$builder = $post['meta_input'][$builderKey];
$isHome = !empty($post['is_home']);
$productGallery = !empty($post['_product_image_gallery']) ? $post['_product_image_gallery'] : null;
unset($post['meta_input'][$builderKey], $post['is_home'], $post['is_wc_page'], $post['_product_image_gallery']);
$post_id = wp_insert_post($post, true);
if (!$post_id || is_wp_error($post_id)) {
$post_id = (int) $post_id;
$res = ThemifyBuilder_Data_Manager::update_builder_meta($post_id, $builder, false);
if (!empty($res['mid'])) {
Themify_Global_Styles::save_used_global_styles($res['builder_data'], $post_id);
if (isset($post['post_date'])) {
$wpdb->update($wpdb->posts, array('post_modified' => $post['post_date'], 'post_modified_gmt' => get_gmt_from_date($post['post_date'])), array('id' => $post_id));
update_option('show_on_front', 'page');
update_option('page_on_front', $post_id);
if ($isWcPage === true) {
$post_name = str_replace('-', '', $post['post_name']);
$wc_page = wc_get_page_id($post_name);
if ($wc_page <= 0 || get_post_type($wc_page) !== $post['post_type']) {
update_option('woocommerce_' . $post_name . '_page_id', $post_id, true);
if ($productGallery !== null) {
self::import_post_gallery($post_id, $productGallery);
return array('msg' => sprintf(__("Post Type %s dosen't exist", 'themify'), $post['post_type']), 'skip' => $post['post_type']);
public static function import_menu_item(array $post, $skinId = 'default', $update = false) {
if ($post['post_type'] === 'nav_menu_item' && isset($post['tax_input']['nav_menu'])) {
$oldId = (!empty($post['post_title']) && !empty($post['post_date'])) ? post_exists($post['post_title'], '', $post['post_date'], $post['post_type']) : false;
$oldId = self::get_import_id($post['ID'], $skinId);
if (!$oldId || get_post_type($oldId) !== $post['post_type']) {
} elseif ($update === false) {
$m = wp_get_nav_menu_object($post['tax_input']['nav_menu']);
if (empty($m) || is_wp_error($m)) {
return array('msg' => sprintf(__("Menu %s dosen't exist", 'themify'), $post['tax_input']['nav_menu']));
if (empty($post['meta_input']) || empty($post['meta_input']['_menu_item_type']) || empty($post['meta_input']['_menu_item_object'])) {
$meta = $post['meta_input'];
$menuType = $meta['_menu_item_type'];
'menu-item-title' => isset($post['post_title']) ? $post['post_title'] : '',
'menu-item-position' => isset($post['menu_order']) ? $post['menu_order'] : 0,
'menu-item-classes' => isset($meta['_menu_item_classes']) ? (is_array($meta['_menu_item_classes']) ? implode(' ', $meta['_menu_item_classes']) : $meta['_menu_item_classes']) : '',
'menu-item-xfn' => isset($meta['_menu_item_xfn']) ? (is_array($meta['_menu_item_xfn']) ? implode(' ', $meta['_menu_item_xfn']) : $meta['_menu_item_xfn']) : '',
'menu-item-type' => $menuType,
'menu-item-object' => $meta['_menu_item_object'],
'menu-item-target' => isset($meta['_menu_item_target']) ? $meta['_menu_item_target'] : '',
'menu-item-description' => isset($post['post_content']) ? $post['post_content'] : '',
'menu-item-post-date' => isset($post['post_date']) ? $post['post_date'] : '',
'menu-item-post-date-gmt' => isset($post['post_date_gmt']) ? $post['post_date_gmt'] : '',
'menu-item-status' => isset($post['post_status']) ? $post['post_status'] : 'publish',
'menu-item-object-id' => 0
if ($args['menu-item-post-date-gmt'] === '') {
$args['menu-item-post-date-gmt'] = $args['menu-item-post-date'];
if ($menuType !== 'custom') {
$objectType = $meta['_menu_item_object'];
if (($menuType === 'post_type_archive' || $menuType === 'post_type') && !post_type_exists($objectType)) {
return array('msg' => sprintf(__("Post Type %s dosen't exist", 'themify'), $objectType));
} elseif ($menuType === 'taxonomy' && !taxonomy_exists($objectType)) {
return array('msg' => sprintf(__("Taxonomy %s dosen't exist", 'themify'), $objectType));
if ($menuType !== 'post_type_archive') {
$menu_item_id = $meta['_menu_item_object_id'];
if (!is_numeric($menu_item_id) && function_exists('wc_get_page_id')) {
$newId = wc_get_page_id($menu_item_id); //wc doesn't check if a post exist
if ($newId <= 0 || get_post_type($newId) !== $objectType) {
if (is_numeric($menu_item_id)) {
$menu_item_id = (int) $menu_item_id;
$newId = self::get_import_id($menu_item_id, $skinId, $menuType);
if ($menuType === 'post_type') {
if (isset($meta['slug']) && (!$newId || get_post_type($newId) !== $objectType)) {
if ($objectType === 'page') {
$newId = get_page_by_path($meta['slug']);
'post_type' => $objectType,
$newId = get_posts($tmp);
$newId = !empty($newId) ? (is_numeric($newId) ? $newId : $newId->ID) : null;
} elseif ($menuType === 'taxonomy' && isset($meta['slug']) && (!$newId || !term_exists($newId, $objectType))) {
$newId = self::get_term_id_by_slug($meta['slug'], $objectType, $newId);
$args['menu-item-object-id'] = $newId;
$args['menu-item-url'] = isset($meta['_menu_item_url']) ? $meta['_menu_item_url'] : '';
$parent = isset($meta['_menu_item_menu_item_parent']) ? (int) $meta['_menu_item_menu_item_parent'] : 0;
$parent = self::get_import_id($parent, $skinId);
if (!$parent || get_post_type($parent) !== $post['post_type']) {
$args['menu-item-parent-id'] = $parent;
$post_id = wp_update_nav_menu_item($menuId, $oldId, $args);
if (!$post_id || is_wp_error($post_id)) {
$meta['_menu_item_object'],
$meta['_menu_item_object_id'],
$meta['_menu_item_menu_item_parent'],
$meta['_menu_item_classes'],
$meta['_menu_item_target'],
$meta['_menu_item_type']);
foreach ($meta as $k => $v) {
if ($v !== '' && $v !== null) {
update_post_meta($post_id, $k, sanitize_key($v));
public static function import_menu(array $menu, $update = false) {
$m = wp_get_nav_menu_object($menu['slug']);
if (empty($m) || is_wp_error($m)) {
$m = wp_get_nav_menu_object(sanitize_title($menu['name']));
$m = empty($m) || is_wp_error($m) ? 0 : $m->term_id;
if ($m === 0 || $update === true) {
$m = wp_update_nav_menu_object($m, array(
'menu-name' => $menu['name'],
'parent' => isset($menu['parent']) ? $menu['parent'] : 0,
'description' => isset($menu['description']) ? $menu['description'] : ''
return $m && !is_wp_error($m) ? $m : false;
public static function import_settings(array $settings, $skinId = 'default', $update = false) {
if (!empty($settings['theme_mods'])) {
$theme = get_option('stylesheet');
update_option('theme_mods_' . $theme, $settings['theme_mods']);
if (!empty($settings['menu'])) {
foreach ($settings['menu'] as $menu) {
$m = self::import_menu($menu, $update);
self::set_import_id($menu['term_id'], $m, 'taxonomy', $skinId);
if (!empty($settings['menu_locations'])) {
$locations = $settings['menu_locations'];
$themeLocations = get_theme_mod('nav_menu_locations');
if(empty($themeLocations)){
foreach ($locations as $location => $menu) {
$m = self::import_menu($menu, $update);
$themeLocations[$location] = $m;
self::set_import_id($menu['term_id'], $m, 'taxonomy', $skinId);
set_theme_mod('nav_menu_locations', $themeLocations);
unset($themeLocations, $locations);
if (!empty($settings['product_filter']) && method_exists('WPF', 'get_instance') && method_exists('WPF_Options', 'get_option')) {
$instance = WPF::get_instance();
if (method_exists($instance, 'get_plugin_name') && method_exists($instance, 'get_version')) {
$instance = WPF_Options::get_option($instance->get_plugin_name(), $instance->get_version());
if (method_exists($instance, 'get') && method_exists($instance, 'set')) {
$instance->set(array_merge($settings['product_filter'], $instance->get()));
if (!empty($settings['product_attribute'])) {
foreach ($settings['product_attribute'] as $slug => $label) {
self::import_product_attribute($label, $slug);
if (!empty($settings['homepage'])) {
$homepage = get_page_by_path($settings['homepage']);
if (!empty($homepage) && !is_wp_error($homepage)) {
update_option('show_on_front', 'page');
update_option('page_on_front', $homepage->ID);
if (!empty($settings['widgets'])) {
$importWidgets = $settings['widgets'];
$sidebars_widgets = array();
foreach ($importWidgets as $wid => $widgets) {
$sidebars_widgets[$wid] = array();
foreach ($widgets as $widget) {
if (is_array($widget['options']) && isset($widget['options']['nav_menu'])) {
$menuId = self::get_term_id_by_slug($widget['options']['nav_menu'], 'nav_menu');
$widget['options']['nav_menu'] = $menuId;
$id = 'widget_' . $widget['id'];
$themeWidget = get_option($id);
if (empty($themeWidget)) {
$themeWidget[$index] = $widget['options'];
update_option($id, $themeWidget);
$sidebars_widgets[$wid][] = $widget['id'] . '-' . $index;
update_option('sidebars_widgets', $sidebars_widgets);
unset($sidebars_widgets, $importWidgets);
if (!empty($settings['themify_settings'])) {
$skinSettings = array_merge(themify_get_data(), $settings['themify_settings']);
themify_set_data($skinSettings);
public static function import_post_gallery($post_id, $gallery) {
if (is_array($gallery)) {
$gallery = implode(',', $gallery);
return update_post_meta($post_id, '_product_image_gallery', $gallery);
public static function compare_files($f1, $f2, $size = 4096) {
if ($fh1 !== false && $fh2 !== false) {
while (!feof($fh1) && !feof($fh2)) {
yield fread($fh1, $size) => fread($fh2, $size);