<?php
namespace Elementor\App\Modules\ImportExportCustomization\Runners\Import;
use Elementor\Modules\FloatingButtons\Documents\Floating_Buttons;
use Elementor\Modules\FloatingButtons\Module as FloatingButtonsModule;
use Elementor\App\Modules\ImportExportCustomization\Utils as ImportExportUtils;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class Floating_Elements extends Import_Runner_Base {
const CONDITIONS_CACHE_META_KEY = 'elementor_pro_theme_builder_conditions';
private $posts_cache = [];
public static function get_name(): string {
return 'floating-elements';
}
public function should_import( array $data ): bool {
return (
isset( $data['include'] ) &&
in_array( 'content', $data['include'], true ) &&
! empty( $data['manifest']['content']['e-floating-buttons'] ) &&
! empty( $data['extracted_directory_path'] )
);
}
public function import( array $data, array $imported_data ) {
$post_type = 'e-floating-buttons';
$posts_settings = $data['manifest']['content'][ $post_type ];
$path = $data['extracted_directory_path'] . 'content/' . $post_type . '/';
$imported_floating_elements = $imported_data['content']['e-floating-buttons']['succeed'] ?? [];
$imported_post_ids = [];
foreach ( $posts_settings as $id => $post_settings ) {
try {
$imported_post_ids[] = $this->import_floating_element_metadata(
$id,
$path,
$imported_floating_elements
);
} catch ( \Exception $e ) {
continue;
}
}
$this->set_display_conditions_cache( $imported_post_ids );
return [];
}
private function set_display_conditions_cache( array $imported_post_ids ) {
$conditions = get_option( self::CONDITIONS_CACHE_META_KEY, [] );
$conditions['floating_buttons'] = [];
foreach ( $imported_post_ids as $imported_post_id ) {
$conditions['floating_buttons'][ $imported_post_id ] = [ 'include/general' ];
}
update_option( self::CONDITIONS_CACHE_META_KEY, $conditions );
}
private function import_floating_element_metadata( $id, $path, $imported_floating_elements ) {
$post_data = ImportExportUtils::read_json_file( $path . $id );
$widget_type = $post_data['content'][0]['elements'][0]['widgetType'] ?? '';
$floating_element_type = 'floating-buttons';
$imported_post_id = $imported_floating_elements[ $id ] ?? null;
if ( ! $imported_post_id ) {
throw new \Exception(
sprintf(
/* translators: %s: Floating element ID */
esc_html__( 'Imported post ID not found for floating element: %s', 'elementor' ),
esc_html( $id )
)
);
}
if ( str_starts_with( $widget_type, 'floating-bars' ) ) {
$floating_element_type = 'floating-bars';
update_post_meta(
$imported_post_id,
FloatingButtonsModule::FLOATING_ELEMENTS_TYPE_META_KEY,
$floating_element_type
);
}
if ( ! isset( $this->posts_cache[ $floating_element_type ] ) ) {
$this->posts_cache[ $floating_element_type ] = get_posts( [
'post_type' => FloatingButtonsModule::CPT_FLOATING_BUTTONS,
'posts_per_page' => -1,
'post_status' => 'publish',
'fields' => 'ids',
'no_found_rows' => true,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
'meta_query' => Floating_Buttons::get_meta_query_for_floating_buttons(
$floating_element_type
),
] );
}
$posts = $this->posts_cache[ $floating_element_type ];
foreach ( $posts as $post_id ) {
delete_post_meta( $post_id, '_elementor_conditions' );
}
update_post_meta(
$imported_post_id,
'_elementor_conditions',
[ 'include/general' ]
);
return $imported_post_id;
}
}