From 1a306e0aa49137874c9aa4692d25b094bf07434d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 14 Jan 2026 16:22:05 +0000 Subject: [PATCH 1/5] Fix Resend button missing in Gravity Forms Entries view The resend button was relying on an external #action element that may not exist in newer Gravity Forms versions. Fixed by: - Adding a dedicated form with its own action field for resend functionality - Implementing proper WordPress nonce verification for security - Showing a message when no active feeds are available - Improving HTML output with explicit wp_kses allowed tags Fixes #145 Co-authored-by: david --- .../class-gravityforms-widget.php | 116 ++++++++++++------ 1 file changed, 78 insertions(+), 38 deletions(-) diff --git a/includes/formscrm-library/class-gravityforms-widget.php b/includes/formscrm-library/class-gravityforms-widget.php index af81bf6..2c86605 100644 --- a/includes/formscrm-library/class-gravityforms-widget.php +++ b/includes/formscrm-library/class-gravityforms-widget.php @@ -52,55 +52,95 @@ public function resend_metabox( $args ) { $form = ! empty( $args['form'] ) ? $args['form'] : array(); $form_id = isset( $form['id'] ) ? (int) $form['id'] : 0; $entry = ! empty( $args['entry'] ) ? $args['entry'] : array(); + $entry_id = isset( $entry['id'] ) ? (int) $entry['id'] : 0; $feeds = GFCRM::get_instance()->get_feeds( null, $form_id, 'formscrm', true ); - if ( rgpost( 'action' ) === $action ) { - check_admin_referer( 'gforms_save_entry', 'gforms_save_entry' ); - $html .= '

' . esc_html__( 'Feeds processed:', 'formscrm' ) . '

'; - $html .= ''; - } else { - $html .= '

' . esc_html__( 'This will resend the entry to the CRM.', 'formscrm' ) . '

'; - $html .= '

' . esc_html__( 'Actual feeds actived:', 'formscrm' ) . '

'; - $html .= ''; + + if ( $active_feeds > 0 ) { + $html .= '
'; + $html .= '
'; + $html .= wp_nonce_field( 'formscrm_resend_entry_' . $entry_id, 'formscrm_resend_nonce', true, false ); + $html .= ''; $html .= sprintf( - '', - __( 'Resend Entry', 'formscrm' ), - $action + '', + esc_attr__( 'Resend Entry', 'formscrm' ) ); + $html .= '
'; + } else { + $html .= '

' . esc_html__( 'No active feeds found for this form.', 'formscrm' ) . '

'; } - echo wp_kses_post( $html ); + + echo wp_kses( + $html, + array( + 'p' => array( 'style' => array() ), + 'strong' => array(), + 'ul' => array(), + 'li' => array(), + 'br' => array(), + 'form' => array( + 'method' => array(), + 'style' => array(), + ), + 'input' => array( + 'type' => array(), + 'name' => array(), + 'value' => array(), + 'class' => array(), + 'id' => array(), + ), + 'em' => array(), + ) + ); } } new FormsCRM_GravityForms_Widget(); From 25b15d8d8181f64775cd7ee67adf1dfe4ab923e3 Mon Sep 17 00:00:00 2001 From: davidperezgar Date: Thu, 15 Jan 2026 10:29:40 +0100 Subject: [PATCH 2/5] readme --- readme.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/readme.txt b/readme.txt index a8ba21a..826378a 100644 --- a/readme.txt +++ b/readme.txt @@ -130,6 +130,9 @@ WordPress installation and then activate the Plugin from Plugins page. [Official Repository GitHub](https://github.com/closemarketing/formscrm/) == Changelog == += n.e.x.t. = +* Fixed: Resend button missing in Gravity Forms Entries view. + = 4.2.1 = * Hotfix: Error not sending correctly entry id in webhook. From 9a4b19ed0b392a7eded74b2d4975d4ac88de6574 Mon Sep 17 00:00:00 2001 From: davidperezgar Date: Thu, 15 Jan 2026 11:30:12 +0100 Subject: [PATCH 3/5] select --- blueprint.json | 8 --- formscrm.php | 4 +- .../class-gravityforms-widget.php | 51 ++++++++++++++++--- readme.txt | 1 + 4 files changed, 46 insertions(+), 18 deletions(-) delete mode 100644 blueprint.json diff --git a/blueprint.json b/blueprint.json deleted file mode 100644 index 82f8ae7..0000000 --- a/blueprint.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "steps": [ - { - "step": "activatePlugin", - "pluginPath": "/wordpress/wp-content/plugins/formscrm/formscrm.php" - } - ] -} \ No newline at end of file diff --git a/formscrm.php b/formscrm.php index 5f91a1c..91f5192 100644 --- a/formscrm.php +++ b/formscrm.php @@ -3,7 +3,7 @@ * Plugin Name: FormsCRM * Plugin URI : https://close.technology/wordpress-plugins/formscrm/ * Description: Connects Forms with CRM, ERP and Email Marketing. - * Version: 4.2.1 + * Version: 4.2.2-beta.1 * Author: CloseTechnology * Author URI: https://close.technology * Text Domain: formscrm @@ -23,7 +23,7 @@ defined( 'ABSPATH' ) || die( 'No script kiddies please!' ); -define( 'FORMSCRM_VERSION', '4.2.1' ); +define( 'FORMSCRM_VERSION', '4.2.2-beta.1' ); define( 'FORMSCRM_PLUGIN', __FILE__ ); define( 'FORMSCRM_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); define( 'FORMSCRM_PLUGIN_PATH', plugin_dir_path( __FILE__ ) ); diff --git a/includes/formscrm-library/class-gravityforms-widget.php b/includes/formscrm-library/class-gravityforms-widget.php index 2c86605..b0e5e77 100644 --- a/includes/formscrm-library/class-gravityforms-widget.php +++ b/includes/formscrm-library/class-gravityforms-widget.php @@ -64,6 +64,10 @@ public function resend_metabox( $args ) { if ( ! isset( $_POST['formscrm_resend_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['formscrm_resend_nonce'] ) ), 'formscrm_resend_entry_' . $entry_id ) ) { $html .= '

' . esc_html__( 'Security check failed. Please try again.', 'formscrm' ) . '

'; } else { + // Get selected feed(s). + $selected_feeds = isset( $_POST['formscrm_selected_feeds'] ) && is_array( $_POST['formscrm_selected_feeds'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['formscrm_selected_feeds'] ) ) : array(); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce verified above. + $process_all = in_array( 'all', $selected_feeds, true ); + $html .= '

' . esc_html__( 'Feeds processed:', 'formscrm' ) . '

'; $html .= '
    '; @@ -71,14 +75,18 @@ public function resend_metabox( $args ) { if ( ! $feed['is_active'] || $form_id !== (int) $feed['form_id'] ) { continue; } - GFCRM::get_instance()->process_feed( $feed, $entry, $form ); - $html .= '
  • '; - $html .= sprintf( - // translators: %s is the name of the feed. - __( 'Feed: %s', 'formscrm' ), - isset( $feed['meta']['feedName'] ) ? $feed['meta']['feedName'] : $feed['id'], - ); - $html .= '
  • '; + + // Process feed if "all" is selected or if this specific feed is selected. + if ( $process_all || in_array( (string) $feed['id'], $selected_feeds, true ) ) { + GFCRM::get_instance()->process_feed( $feed, $entry, $form ); + $html .= '
  • '; + $html .= sprintf( + // translators: %s is the name of the feed. + __( 'Feed: %s', 'formscrm' ), + isset( $feed['meta']['feedName'] ) ? $feed['meta']['feedName'] : $feed['id'], + ); + $html .= '
  • '; + } } $html .= '
'; } @@ -110,6 +118,21 @@ public function resend_metabox( $args ) { $html .= '
'; $html .= wp_nonce_field( 'formscrm_resend_entry_' . $entry_id, 'formscrm_resend_nonce', true, false ); $html .= ''; + $html .= ' '; + $html .= '

'; $html .= sprintf( '', esc_attr__( 'Resend Entry', 'formscrm' ) @@ -138,6 +161,18 @@ public function resend_metabox( $args ) { 'class' => array(), 'id' => array(), ), + 'select' => array( + 'name' => array(), + 'id' => array(), + 'multiple' => array(), + 'style' => array(), + ), + 'option' => array( + 'value' => array(), + ), + 'label' => array( + 'for' => array(), + ), 'em' => array(), ) ); diff --git a/readme.txt b/readme.txt index 826378a..1ca9117 100644 --- a/readme.txt +++ b/readme.txt @@ -132,6 +132,7 @@ WordPress installation and then activate the Plugin from Plugins page. == Changelog == = n.e.x.t. = * Fixed: Resend button missing in Gravity Forms Entries view. +* Enhanced: Added feed selector in Resend Entry widget to choose between all feeds or individual feed. = 4.2.1 = * Hotfix: Error not sending correctly entry id in webhook. From d6f15ec4b08a05eb3737b95cc4c1b7d97e82fbf2 Mon Sep 17 00:00:00 2001 From: davidperezgar Date: Tue, 20 Jan 2026 08:44:58 +0100 Subject: [PATCH 4/5] fix lint --- .../formscrm-library/class-gravityforms-widget.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/includes/formscrm-library/class-gravityforms-widget.php b/includes/formscrm-library/class-gravityforms-widget.php index b0e5e77..aaad6f6 100644 --- a/includes/formscrm-library/class-gravityforms-widget.php +++ b/includes/formscrm-library/class-gravityforms-widget.php @@ -47,11 +47,11 @@ public function widget_resend_entries( $meta_boxes, $entry, $form ) { * @param array $args An array containing the form and entry objects. */ public function resend_metabox( $args ) { - $html = ''; - $action = 'formscrm_process_feeds'; - $form = ! empty( $args['form'] ) ? $args['form'] : array(); - $form_id = isset( $form['id'] ) ? (int) $form['id'] : 0; - $entry = ! empty( $args['entry'] ) ? $args['entry'] : array(); + $html = ''; + $action = 'formscrm_process_feeds'; + $form = ! empty( $args['form'] ) ? $args['form'] : array(); + $form_id = isset( $form['id'] ) ? (int) $form['id'] : 0; + $entry = ! empty( $args['entry'] ) ? $args['entry'] : array(); $entry_id = isset( $entry['id'] ) ? (int) $entry['id'] : 0; $feeds = GFCRM::get_instance()->get_feeds( null, $form_id, 'formscrm', true ); From 03f417fa9356d11e93bf9062fe2e15495bcbab09 Mon Sep 17 00:00:00 2001 From: davidperezgar Date: Tue, 20 Jan 2026 08:48:00 +0100 Subject: [PATCH 5/5] fix lint --- includes/formscrm-library/class-gravityforms-widget.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/formscrm-library/class-gravityforms-widget.php b/includes/formscrm-library/class-gravityforms-widget.php index aaad6f6..56c63fb 100644 --- a/includes/formscrm-library/class-gravityforms-widget.php +++ b/includes/formscrm-library/class-gravityforms-widget.php @@ -126,7 +126,7 @@ public function resend_metabox( $args ) { continue; } $feed_name = isset( $feed['meta']['feedName'] ) ? $feed['meta']['feedName'] : $feed['id']; - $html .= sprintf( + $html .= sprintf( '', esc_attr( $feed['id'] ), esc_html( $feed_name )