';
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
);
}
}