get_results( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->prepare( "SELECT DISTINCT p.ID, p.post_title, pm.meta_value FROM {$wpdb->posts} p INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE pm.meta_key = %s AND pm.meta_value LIKE %s AND p.post_status = 'publish'", '_bricks_page_content_2', '%s:4:"name";s:4:"form"%' ) ); $forms = []; foreach ( $results as $result ) { $bricks_data = maybe_unserialize( $result->meta_value ); if ( is_array( $bricks_data ) ) { $forms = array_merge( $forms, $this->extract_forms_from_bricks_data( $bricks_data, $result->ID, $result->post_title ) ); } } // Cache the results for 1 hour. wp_cache_set( $cache_key, $forms, $cache_group, HOUR_IN_SECONDS ); set_transient( $cache_key, $forms, HOUR_IN_SECONDS ); return $forms; } /** * Extract form elements from Bricks data structure. * * @param array $bricks_data The Bricks data structure. * @param int $post_id The post ID. * @param string $post_title The post title. * * @return array */ private function extract_forms_from_bricks_data( $bricks_data, $post_id, $post_title ) { $forms = []; foreach ( $bricks_data as $element ) { if ( isset( $element['name'] ) && 'form' === $element['name'] ) { $form_title = ! empty( $element['settings']['formTitle'] ) ? $element['settings']['formTitle'] : $post_title; $forms[] = [ 'ID' => $element['id'], 'post_title' => $form_title, 'post_id' => $post_id, 'element_id' => $element['id'], ]; } // Recursively check children. if ( isset( $element['children'] ) && is_array( $element['children'] ) ) { $forms = array_merge( $forms, $this->extract_forms_from_bricks_data( $element['children'], $post_id, $post_title ) ); } } return $forms; } /** * Get a specific form by ID. * * @param int|string $id The form element ID. * * @return array|false */ public function get_form( $id ) { $forms = $this->get_forms(); foreach ( $forms as $form ) { if ( $form['element_id'] === $id ) { return $form; } } return false; } /** * Get a select list of all forms. * * @return array */ public function get_form_selectlist() { $form_selectlist = []; $forms = $this->get_forms(); foreach ( $forms as $form ) { $form_selectlist[ $form['element_id'] ] = $form['post_title']; } return $form_selectlist; } /** * Custom scripts for Bricks Builder integration. * Since we're using JavaScript event handling, no additional server-side processing needed. * * @param array $js JavaScript array. * * @return array */ public function custom_scripts( $js = [] ) { return $js; } /** * Custom styles for Bricks Builder integration. * * @param array $css CSS array. * * @return array */ public function custom_styles( $css = [] ) { return $css; } /** * Maybe clear forms cache when Bricks content is updated. * * @param int $meta_id ID of updated metadata entry. * @param int $object_id Post ID. * @param string $meta_key Metadata key. * @param mixed $meta_value Metadata value. */ public function maybe_clear_cache( $meta_id, $object_id, $meta_key, $meta_value ) { // Only clear cache when Bricks content is modified. if ( '_bricks_page_content_2' === $meta_key ) { $this->clear_forms_cache(); } } /** * Clear the forms cache. */ public function clear_forms_cache() { $cache_key = 'pum_bricks_forms_v2'; $cache_group = 'popup_maker'; wp_cache_delete( $cache_key, $cache_group ); delete_transient( $cache_key ); } }