add_action( 'init', $this, 'register_block' ); } public function register_block(): void { if ( ! function_exists( 'register_block_type' ) ) { return; } wp_register_script( 'acc-block-member-card', 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-member-card', $this->editor_script() ); register_block_type( 'academiccrew/member-card', [ 'api_version' => 2, 'title' => __( 'AcademicCrew: Member Card', 'academiccrew' ), 'description' => __( 'Displays a single research group member card.', 'academiccrew' ), 'category' => 'academiccrew', 'icon' => 'id-alt', 'supports' => [ 'html' => false ], 'attributes' => [ 'member_id' => [ 'type' => 'string', 'default' => '' ], 'show_bio' => [ 'type' => 'string', 'default' => 'no' ], ], 'render_callback' => [ $this, 'render_block' ], 'editor_script' => 'acc-block-member-card', ] ); } public function render_block( array $atts ): string { return do_shortcode( sprintf( '[academiccrew_member_card member_id="%s" show_bio="%s"]', esc_attr( $atts['member_id'] ?? '' ), esc_attr( $atts['show_bio'] ?? 'no' ) ) ); } 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 ToggleControl = components.ToggleControl; blocks.registerBlockType('academiccrew/member-card', { edit: function(props) { var attrs = props.attributes; var setA = props.setAttributes; return [ el(InspectorControls, { key: 'controls' }, el(PanelBody, { title: __('Member card settings', 'academiccrew'), initialOpen: true }, el(TextControl, { label: __('Member ID (required)', 'academiccrew'), value: attrs.member_id, onChange: function(v) { setA({ member_id: v }); } }), el(ToggleControl, { label: __('Show bio', 'academiccrew'), checked: attrs.show_bio === 'yes', onChange: function(v) { setA({ show_bio: v ? 'yes' : 'no' }); } }) ) ), el(SSR, { key: 'preview', block: 'academiccrew/member-card', attributes: attrs }) ]; }, save: function() { return null; } }); }(wp.blocks, wp.element.createElement, wp.serverSideRender, wp.blockEditor, wp.components, wp.i18n)); JS; } }