'; echo esc_html__( 'Dadan Elementor widgets require Elementor 3.20 or newer. Update Elementor, or use Gutenberg blocks / shortcodes.', 'dadan' ); echo '

'; } ); return; } add_action( 'elementor/elements/categories_registered', array( __CLASS__, 'register_category' ) ); add_action( 'elementor/widgets/register', array( __CLASS__, 'register_widgets' ) ); add_action( 'elementor/preview/enqueue_styles', array( __CLASS__, 'enqueue_editor_styles' ) ); add_action( 'elementor/editor/after_enqueue_styles', array( __CLASS__, 'enqueue_editor_styles' ) ); // DADAN-03: strip privileged Record widget settings for non-admins on save. add_filter( 'elementor/document/save/data', array( __CLASS__, 'strip_privileged_record_settings' ), 10, 2 ); } /** * Privileged keys on the Record widget (App ID, folder/team, access policy). * * @return array */ private static function privileged_record_keys() { return array( 'public_app_id', 'folder_id', 'team_id', 'front_record_access' ); } /** * Non-admins cannot persist privileged Dadan Record widget settings (DADAN-03). * * @param array $data Document data. * @param \Elementor\Core\Base\Document $document Document (unused). * @return array */ public static function strip_privileged_record_settings( $data, $document = null ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter if ( current_user_can( 'manage_options' ) ) { return $data; } if ( ! is_array( $data ) || empty( $data['elements'] ) || ! is_array( $data['elements'] ) ) { return $data; } $data['elements'] = self::map_elements_strip_privileged( $data['elements'] ); return $data; } /** * Recursively clear privileged settings on dadan-unified-record widgets. * * @param array> $elements Elementor elements tree. * @return array> */ private static function map_elements_strip_privileged( $elements ) { foreach ( $elements as &$el ) { if ( ! is_array( $el ) ) { continue; } $widget_type = isset( $el['widgetType'] ) ? (string) $el['widgetType'] : ''; if ( 'dadan-unified-record' === $widget_type && isset( $el['settings'] ) && is_array( $el['settings'] ) ) { foreach ( self::privileged_record_keys() as $key ) { $el['settings'][ $key ] = ''; } } if ( ! empty( $el['elements'] ) && is_array( $el['elements'] ) ) { $el['elements'] = self::map_elements_strip_privileged( $el['elements'] ); } } unset( $el ); return $elements; } /** * Dadan Elementor category. * * @param \Elementor\Elements_Manager $elements_manager Manager. */ public static function register_category( $elements_manager ) { $elements_manager->add_category( 'dadan', array( 'title' => __( 'Dadan', 'dadan' ), 'icon' => 'eicon-video-camera', ) ); } /** * Register widgets. * * @param \Elementor\Widgets_Manager $widgets_manager Manager. */ public static function register_widgets( $widgets_manager ) { require_once DADAN_VIDEO_PATH . 'widgets/class-widget-video.php'; require_once DADAN_VIDEO_PATH . 'widgets/class-widget-record.php'; $widgets_manager->register( new Dadan_Elementor_Widget_Video() ); $widgets_manager->register( new Dadan_Elementor_Widget_Record() ); } /** * Editor / preview CSS. */ public static function enqueue_editor_styles() { // The trigger's layout lives here: wp_kses strips display/box-sizing from its inline style. wp_enqueue_style( 'dadan-video-public-record', DADAN_VIDEO_URL . 'assets/public-record.css', array(), DADAN_VIDEO_VERSION ); $css = DADAN_VIDEO_PATH . 'assets/editor.css'; if ( ! file_exists( $css ) ) { return; } wp_enqueue_style( 'dadan-elementor-editor', DADAN_VIDEO_URL . 'assets/editor.css', array(), DADAN_VIDEO_VERSION ); } }