setup_hooks(); } /** * Set up hooks for various purposes. * * This method adds hooks for different purposes as needed. * * @since 1.0.0 * * @return void */ protected function setup_hooks(): void { add_filter( 'render_block', array( $this, 'process_login_block' ), 10, 2 ); add_filter( 'render_block', array( $this, 'process_registration_block' ), 10, 2 ); add_filter( 'render_block_core/button', array( $this, 'convert_submit_button' ), 10, 2 ); } /** * Processes blocks with the `gatherpress--has-login-url` class. * * This method performs two functions: * 1. Removes the block entirely if the user is already logged in * 2. Dynamically replaces the placeholder login URL with the actual login URL * for users who are not logged in * * @since 1.0.0 * * @param string $block_content The HTML content of the block. * @param array $block The parsed block data. * * @return string The modified block content or an empty string if the block should be removed. */ public function process_login_block( string $block_content, array $block ): string { if ( Utility::has_css_class( $block['attrs']['className'] ?? '', 'gatherpress--has-login-url' ) && is_user_logged_in() ) { return ''; } $tag = new WP_HTML_Tag_Processor( $block_content ); while ( $tag->next_tag( array( 'tag_name' => 'a' ) ) ) { if ( '#gatherpress-login-url' === $tag->get_attribute( 'href' ) ) { $tag->set_attribute( 'href', Utility::get_login_url() ); } } return $tag->get_updated_html(); } /** * Processes blocks with the `gatherpress--has-registration-url` class. * * This method performs two functions: * 1. Removes the block entirely if user registration is disabled in WordPress settings * 2. For enabled registration, dynamically replaces the placeholder registration URL with the actual * registration URL * * @since 1.0.0 * * @param string $block_content The HTML content of the block. * @param array $block The parsed block data. * * @return string The modified block content or an empty string if the block should be removed. */ public function process_registration_block( string $block_content, array $block ): string { if ( Utility::has_css_class( $block['attrs']['className'] ?? '', 'gatherpress--has-registration-url' ) && ! get_option( 'users_can_register' ) ) { return ''; } $tag = new WP_HTML_Tag_Processor( $block_content ); while ( $tag->next_tag( array( 'tag_name' => 'a' ) ) ) { if ( '#gatherpress-registration-url' === $tag->get_attribute( 'href' ) ) { $tag->set_attribute( 'href', Utility::get_registration_url() ); } } return $tag->get_updated_html(); } /** * Converts button blocks with the `gatherpress-submit-button` class to submit buttons. * * This method performs two functions: * 1. Converts anchor tags (``) to button elements and removes href/role attributes * 2. Adds `type="submit"` attribute to both converted anchors and existing button elements * * @since 1.0.0 * * @param string $block_content The HTML content of the block. * @param array $block The parsed block data. * * @return string The modified block content with submit button functionality. */ public function convert_submit_button( string $block_content, array $block ): string { // Check if the button has the gatherpress-submit-button class. if ( ! Utility::has_css_class( $block['attrs']['className'] ?? '', 'gatherpress-submit-button' ) ) { return $block_content; } $processor = new WP_HTML_Tag_Processor( $block_content ); while ( $processor->next_tag() ) { $tag_name = $processor->get_tag(); if ( 'A' === $tag_name ) { // Handle anchor tags - convert to button. $processor->set_attribute( 'type', 'submit' ); $processor->remove_attribute( 'href' ); $processor->remove_attribute( 'role' ); // Replace tag names. $content = $processor->get_updated_html(); $content = preg_replace( '/', '', $content ); return $content; } elseif ( 'BUTTON' === $tag_name ) { // Handle button tags - just add type="submit". $processor->set_attribute( 'type', 'submit' ); return $processor->get_updated_html(); } } return $block_content; } /** * Process guest count form field based on event settings. * * Hides the guest count field when max guest limit is 0. * * @since 1.0.0 * * @param string $block_content The block content. * @param array $block The block data. * * @return string The processed block content. */ public function process_guests_field( string $block_content, array $block ): string { // Get the correct post ID using override logic. $block_instance = Block::get_instance(); $post_id = $block_instance->get_post_id( $block ); // Only process if we have a valid event post. // Only check publish status if not in preview mode. if ( Event::POST_TYPE !== get_post_type( $post_id ) || ( ! is_preview() && 'publish' !== get_post_status( $post_id ) ) ) { return $block_content; } // Get max guest limit from event settings. $max_guest_limit = (int) get_post_meta( $post_id, 'gatherpress_max_guest_limit', true ); // Mark the field for removal if guest limit is 0. if ( 0 === $max_guest_limit ) { $tag = new WP_HTML_Tag_Processor( $block_content ); while ( $tag->next_tag() ) { $class_attr = $tag->get_attribute( 'class' ); if ( Utility::has_css_class( $class_attr, 'gatherpress-rsvp-field-guests' ) ) { $existing_classes = $class_attr ? $class_attr . ' ' : ''; $tag->set_attribute( 'class', $existing_classes . 'gatherpress--is-hidden' ); } } $block_content = $tag->get_updated_html(); } return $block_content; } /** * Process anonymous form field based on event settings. * * Hides the anonymous field when anonymous RSVP is disabled. * * @since 1.0.0 * * @param string $block_content The block content. * @param array $block The block data. * * @return string The processed block content. */ public function process_anonymous_field( string $block_content, array $block ): string { // Get the correct post ID using override logic. $block_instance = Block::get_instance(); $post_id = $block_instance->get_post_id( $block ); // Only process if we have a valid event post. // Only check publish status if not in preview mode. if ( Event::POST_TYPE !== get_post_type( $post_id ) || ( ! is_preview() && 'publish' !== get_post_status( $post_id ) ) ) { return $block_content; } // Get anonymous RSVP setting from event. $enable_anonymous_rsvp = get_post_meta( $post_id, 'gatherpress_enable_anonymous_rsvp', true ); // Mark the field for removal if anonymous RSVP is disabled. if ( empty( $enable_anonymous_rsvp ) ) { $tag = new WP_HTML_Tag_Processor( $block_content ); while ( $tag->next_tag() ) { $class_attr = $tag->get_attribute( 'class' ); if ( Utility::has_css_class( $class_attr, 'gatherpress-rsvp-field-anonymous' ) ) { $existing_classes = $class_attr ? $class_attr . ' ' : ''; $tag->set_attribute( 'class', $existing_classes . 'gatherpress--is-hidden' ); } } $block_content = $tag->get_updated_html(); } return $block_content; } }