<?php namespace Elementor\App\Modules\ImportExportCustomization\Runners\Export; use Elementor\Modules\AtomicWidgets\Module as Atomic_Widgets_Module; use Elementor\Modules\GlobalClasses\Module as Global_Classes_Module; use Elementor\Modules\Variables\Module as Variables_Module; use Elementor\Plugin; class Site_Settings extends Export_Runner_Base { const ALLOWED_SETTINGS = [ 'theme', 'globalColors', 'globalFonts', 'themeStyleSettings', 'generalSettings', 'experiments', 'customCode', 'customIcons', 'customFonts', 'classes', 'variables', ]; public static function get_name(): string { return 'site-settings'; } public function should_export( array $data ) { return ( isset( $data['include'] ) && in_array( 'settings', $data['include'], true ) ); } public function export( array $data ) { $customization = $data['customization']['settings'] ?? null; if ( $customization ) { return $this->export_customization( $data, $customization ); } return $this->export_all( $data ); } private function export_all( $data, $include_theme = true ) { $kit = Plugin::$instance->kits_manager->get_active_kit(); $kit_data = $kit->get_export_data(); $excluded_kit_settings_keys = [ 'site_name', 'site_description', 'site_logo', 'site_favicon', ]; foreach ( $excluded_kit_settings_keys as $setting_key ) { unset( $kit_data['settings'][ $setting_key ] ); } if ( $include_theme ) { $theme_data = $this->export_theme(); if ( $theme_data ) { $kit_data['theme'] = $theme_data; $manifest_data['theme'] = $theme_data; } } $experiments_data = $this->export_experiments(); if ( $experiments_data ) { $kit_data['experiments'] = $experiments_data; $manifest_data['experiments'] = array_keys( $experiments_data ); } $manifest_data['site-settings'] = array_fill_keys( self::ALLOWED_SETTINGS, true ); if ( ! $include_theme ) { $manifest_data['site-settings']['theme'] = false; } if ( $this->is_classes_feature_active() ) { $manifest_data['site-settings']['classesCount'] = $this->get_classes_count(); } else { unset( $manifest_data['site-settings']['classes'] ); } if ( $this->is_variables_feature_active() ) { $manifest_data['site-settings']['variablesCount'] = $this->get_variables_count(); } else { unset( $manifest_data['site-settings']['variables'] ); } return [ 'files' => [ 'path' => 'site-settings', 'data' => $kit_data, ], 'manifest' => [ $manifest_data, ], ]; } public function get_classes_count(): int { $classes_repository = \Elementor\Modules\GlobalClasses\Global_Classes_Repository::make(); $classes_data = $classes_repository->all()->get(); return count( $classes_data['items'] ?? [] ); } public function get_variables_count(): int { $kit = Plugin::$instance->kits_manager->get_active_kit(); $variables_repository = new \Elementor\Modules\Variables\Storage\Variables_Repository( $kit ); $collection = $variables_repository->load(); $count = 0; foreach ( $collection->all() as $variable ) { if ( ! $variable->is_deleted() ) { $count++; } } return $count; } public function is_classes_feature_active(): bool { return Plugin::$instance->experiments->is_feature_active( Global_Classes_Module::NAME ) && Plugin::$instance->experiments->is_feature_active( Atomic_Widgets_Module::EXPERIMENT_NAME ); } public function is_variables_feature_active(): bool { return Plugin::$instance->experiments->is_feature_active( Variables_Module::EXPERIMENT_NAME ) && Plugin::$instance->experiments->is_feature_active( Atomic_Widgets_Module::EXPERIMENT_NAME ); } private function export_customization( $data, $customization ) { $result = apply_filters( 'elementor/import-export-customization/export/site-settings/customization', null, $data, $customization, $this ); if ( is_array( $result ) ) { return $result; } $export_result = $this->export_all( $data, ! empty( $customization['theme'] ) ); if ( $this->is_classes_feature_active() ) { $include_classes = $customization['classes'] ?? false; $export_result['manifest'][0]['site-settings']['classes'] = (bool) $include_classes; if ( ! $include_classes ) { $export_result['manifest'][0]['site-settings']['classesCount'] = 0; } } if ( $this->is_variables_feature_active() ) { $include_variables = $customization['variables'] ?? false; $export_result['manifest'][0]['site-settings']['variables'] = (bool) $include_variables; if ( ! $include_variables ) { $export_result['manifest'][0]['site-settings']['variablesCount'] = 0; } } return $export_result; } public function export_theme() { $theme = wp_get_theme(); if ( empty( $theme ) || empty( $theme->get( 'ThemeURI' ) ) ) { return null; } $theme_data['name'] = $theme->get( 'Name' ); $theme_data['theme_uri'] = $theme->get( 'ThemeURI' ); $theme_data['version'] = $theme->get( 'Version' ); $theme_data['slug'] = $theme->get_stylesheet(); return $theme_data; } public function export_experiments() { $features = Plugin::$instance->experiments->get_features(); if ( empty( $features ) ) { return null; } $experiments_data = []; foreach ( $features as $feature_name => $feature ) { $experiments_data[ $feature_name ] = [ 'name' => $feature_name, 'title' => $feature['title'], 'state' => $feature['state'], 'default' => $feature['default'], 'release_status' => $feature['release_status'], ]; } return empty( $experiments_data ) ? null : $experiments_data; } }