add_action( 'init', $this, 'register_block' ); } public function register_block(): void { if ( ! function_exists( 'register_block_type' ) ) { return; } wp_register_script( 'acc-block-courses-archive', false, [ 'wp-blocks', 'wp-element', 'wp-server-side-render', 'wp-block-editor', 'wp-components', 'wp-i18n' ], ACADEMICCREW_VERSION, true ); wp_add_inline_script( 'acc-block-courses-archive', $this->editor_script() ); register_block_type( 'academiccrew/courses-archive', [ 'api_version' => 2, 'title' => __( 'AcademicCrew: Courses Archive', 'academiccrew' ), 'description' => __( 'Filterable courses archive with academic year and period tabs.', 'academiccrew' ), 'category' => 'academiccrew', 'icon' => 'welcome-learn-more', 'supports' => [ 'html' => false, 'align' => [ 'wide', 'full' ] ], 'attributes' => [ 'per_page' => [ 'type' => 'integer', 'default' => 12 ], 'default_year' => [ 'type' => 'string', 'default' => 'auto' ], 'show_tabs' => [ 'type' => 'string', 'default' => 'yes' ], ], 'render_callback' => [ $this, 'render_block' ], 'editor_script' => 'acc-block-courses-archive', ] ); } public function render_block( array $atts ): string { return do_shortcode( sprintf( '[academiccrew_courses_archive per_page="%d" default_year="%s" show_tabs="%s"]', (int) ( $atts['per_page'] ?? 12 ), esc_attr( $atts['default_year'] ?? 'auto' ), esc_attr( $atts['show_tabs'] ?? 'yes' ) ) ); } private function editor_script(): string { return <<<'JS' (function(blocks, el, SSR, blockEditor, components, i18n) { var __ = i18n.__; var InspectorControls = blockEditor.InspectorControls; var PanelBody = components.PanelBody; var TextControl = components.TextControl; var RangeControl = components.RangeControl; var ToggleControl = components.ToggleControl; blocks.registerBlockType('academiccrew/courses-archive', { edit: function(props) { var attrs = props.attributes; var setA = props.setAttributes; return [ el(InspectorControls, { key: 'controls' }, el(PanelBody, { title: __('Courses archive settings', 'academiccrew'), initialOpen: true }, el(RangeControl, { label: __('Courses per page', 'academiccrew'), value: attrs.per_page, min: 1, max: 100, onChange: function(v) { setA({ per_page: v }); } }), el(TextControl, { label: __('Default academic year ("auto" or integer)', 'academiccrew'), value: attrs.default_year, onChange: function(v) { setA({ default_year: v }); } }), el(ToggleControl, { label: __('Show period tabs', 'academiccrew'), checked: attrs.show_tabs === 'yes', onChange: function(v) { setA({ show_tabs: v ? 'yes' : 'no' }); } }) ) ), el(SSR, { key: 'preview', block: 'academiccrew/courses-archive', attributes: attrs }) ]; }, save: function() { return null; } }); }(wp.blocks, wp.element.createElement, wp.serverSideRender, wp.blockEditor, wp.components, wp.i18n)); JS; } }