: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
// Maybe ask the user to make a decision on how to deal with global layouts.
if ( ( ! $override_default_website_template || ! $has_default_template ) && $has_global_layouts ) {
$incoming_layout_duplicate_decision = $_->array_get( $_POST, 'incoming_layout_duplicate_decision', '' );
if ( 'duplicate' === $incoming_layout_duplicate_decision ) {
$incoming_layout_duplicate = true;
} else if ( 'relink' === $incoming_layout_duplicate_decision ) {
$incoming_layout_duplicate = false;
wp_send_json_error( array(
'code' => ET_Theme_Builder_Api_Errors::PORTABILITY_REQUIRE_INCOMING_LAYOUT_DUPLICATE_DECISION,
'error' => $i18n['This import contains references to global layouts.'],
// Make imported preset overrides to avoid collisions with local presets
if ( $import_presets && is_array( $presets ) && ! empty( $presets ) ) {
$presets_rewrite_map = $portability->prepare_to_import_layout_presets( $presets );
$layout_id_map = array();
$layout_keys = array( 'header', 'body', 'footer' );
$id = md5( get_current_user_id() . '_' . uniqid( 'et_theme_builder_import_', true ) );
$transient = 'et_theme_builder_import_' . get_current_user_id() . '_' . $id;
foreach ( $export['templates'] as $index => $template ) {
foreach ( $layout_keys as $key ) {
$layout_id = (int) $_->array_get( $template, array( 'layouts', $key, 'id' ), 0 );
if ( 0 === $layout_id ) {
$layout = $_->array_get( $export, array( 'layouts', $layout_id ), null );
if ( empty( $layout ) ) {
// Use a temporary string id to avoid numerical keys being reset by various array functions.
$template_id = 'template_' . $index;
$is_global = (bool) $_->array_get( $layout, 'theme_builder.is_global', false );
$create_new = ( $template['default'] && $override_default_website_template ) || ! $is_global || $incoming_layout_duplicate;
$temp_id = 'tbi-step-' . count( $steps_files );
et_theme_builder_api_import_theme_builder_save_layout( $portability, $template_id, $layout_id, $layout, $temp_id, $transient );
if ( ! isset( $layout_id_map[ $layout_id ] ) ) {
$layout_id_map[ $layout_id ] = array();
$layout_id_map[ $layout_id ][ $template_id ] = 'use_global';
set_transient( $transient, array(
'templates' => $export['templates'],
'override_default_website_template' => $override_default_website_template,
'incoming_layout_duplicate' => $incoming_layout_duplicate,
'layout_id_map' => $layout_id_map,
'import_presets' => $import_presets,
'presets_rewrite_map' => $presets_rewrite_map,
wp_send_json_success( array(
'steps' => count( $steps_files ),
add_action( 'wp_ajax_et_theme_builder_api_import_theme_builder', 'et_theme_builder_api_import_theme_builder' );
function et_theme_builder_api_import_theme_builder_step() {
if ( ! et_pb_is_allowed( 'theme_builder' ) ) {
et_builder_security_check(
'et_theme_builder_portability',
et_core_portability_cap( 'et_theme_builder' ),
'et_theme_builder_api_import_theme_builder',
$id = sanitize_text_field( $_->array_get( $_POST, 'id', '' ) );
$step = (int) $_->array_get( $_POST, 'step', 0 );
$chunk = (int) $_->array_get( $_POST, 'chunk', 0 );
$transient = 'et_theme_builder_import_' . get_current_user_id() . '_' . $id;
$export = get_transient( $transient );
if ( false === $export ) {
$layout_keys = array( 'header', 'body', 'footer' );
$portability = et_core_portability_load( 'et_theme_builder' );
$steps = $export['steps'];
$ready = empty( $steps );
$layout_id_map = $export['layout_id_map'];
$presets = $export['presets'];
$presets_rewrite_map = $export['presets_rewrite_map'];
$import_presets = $export['import_presets'];
$template_settings = array();
$import_step = et_theme_builder_api_import_theme_builder_load_layout( $portability, $steps[ $step ]['id'], $steps[ $step ]['group'] );
$import_step = array_merge( $import_step, array( 'presets' => $presets ) );
$import_step = array_merge( $import_step, array( 'presets_rewrite_map' => $presets_rewrite_map ) );
$import_step['import_presets'] = $import_presets;
$result = $portability->import_theme_builder( $id, $import_step, count( $steps ), $step, $chunk );
if ( false === $result ) {
$ready = $result['ready'];
$chunks = $result['chunks'];
foreach ( $result['layout_id_map'] as $old_id => $new_ids ) {
$layout_id_map[ $old_id ] = array_merge(
$_->array_get( $layout_id_map, $old_id, array() ),
if ( $import_presets && is_array( $presets ) && ! empty( $presets ) ) {
if ( ! $portability->import_global_presets( $presets ) ) {
$presets_error = apply_filters( 'et_core_portability_import_error_message', '' );
wp_send_json_error( array(
'code' => ET_Theme_Builder_Api_Errors::PORTABILITY_IMPORT_PRESETS_FAILURE,
'error' => $presets_error,
$portability->delete_temp_files( $transient );
foreach ( $export['templates'] as $index => $template ) {
$sanitized = et_theme_builder_sanitize_template( $template );
foreach ( $layout_keys as $key ) {
$old_layout_id = (int) $_->array_get( $sanitized, array( 'layouts', $key, 'id' ), 0 );
$layout_id = et_()->array_get( $layout_id_map, array( $old_layout_id, 'template_' . $index ), '' );
$layout_id = ! empty( $layout_id ) ? $layout_id : 0;
$_->array_set( $sanitized, array( 'layouts', $key, 'id' ), $layout_id );
$conditions = array_merge( $conditions, $sanitized['use_on'], $sanitized['exclude_from'] );
$templates[] = $sanitized;
// Load all conditions from templates.
$conditions = array_unique( $conditions );
$template_settings = array_replace(
et_theme_builder_get_flat_template_settings_options(),
et_theme_builder_load_template_setting_options( $conditions )
$valid_settings = array_keys( $template_settings );
// Strip all invalid conditions from templates.
foreach ( $templates as $index => $template ) {
$templates[ $index ]['use_on'] = array_values( array_intersect( $template['use_on'], $valid_settings ) );
$templates[ $index ]['exclude_from'] = array_values( array_intersect( $template['exclude_from'], $valid_settings ) );
set_transient( $transient, array_merge( $export, array(
'layout_id_map' => $layout_id_map,
wp_send_json_success( array(
'templates' => $templates,
'templateSettings' => $template_settings,
add_action( 'wp_ajax_et_theme_builder_api_import_theme_builder_step', 'et_theme_builder_api_import_theme_builder_step' );