diff --git a/inc/ThirdParty/Plugins/ContactForm7.php b/inc/ThirdParty/Plugins/ContactForm7.php index 773c705fa8..b94518c772 100644 --- a/inc/ThirdParty/Plugins/ContactForm7.php +++ b/inc/ThirdParty/Plugins/ContactForm7.php @@ -4,25 +4,58 @@ use WP_Rocket\Event_Management\Subscriber_Interface; class ContactForm7 implements Subscriber_Interface { + + /** + * Required CF6 version. + * + * Version in which the wpcf7_shortcode_callback action was introduced. + * + * @var string + */ + const REQUIRED_CF7_VERSION = '5.8.1'; + /** * Subscribed events. */ public static function get_subscribed_events() { return [ - 'wp' => [ 'maybe_optimize_contact_form_7', 10 ], + 'template_redirect' => [ 'maybe_optimize_contact_form_7', 10 ], ]; } /** * Optimize ContactForm7 scripts. - * - * @return array */ public function maybe_optimize_contact_form_7() { - if ( defined( 'WPCF7_LOAD_JS' ) && WPCF7_LOAD_JS && ! has_action( 'wpcf7_shortcode_callback' ) ) { - // Only load the frontend scripts on the new 'wpcf7_shortcode_callback' hook. - add_filter( 'wpcf7_load_js', '__return_false' ); - add_action( 'wpcf7_shortcode_callback', 'wpcf7_enqueue_scripts' ); + // The wpcf7_shortcode_callback action was added in CF7 version 5.8.1. + if ( ! defined( 'WPCF7_VERSION' ) || version_compare( WPCF7_VERSION, self::REQUIRED_CF7_VERSION, '<' ) ) { + return; + } + + // Force scripts and styles to not load by default. + add_filter( 'wpcf7_load_js', '__return_false', PHP_INT_MAX ); + add_filter( 'wpcf7_load_css', '__return_false', PHP_INT_MAX ); + + // Conditionally enqueue scripts. + add_action( 'wpcf7_shortcode_callback', [ $this, 'conditionally_enqueue_scripts' ] ); + add_action( 'wpcf7_shortcode_callback', [ $this, 'conditionally_enqueue_styles' ] ); + } + + /** + * Enqueue scripts if not already enqueued. + */ + public function conditionally_enqueue_scripts() { + if ( ! did_action( 'wpcf7_enqueue_scripts' ) ) { // Prevent double-enqueueing when multiple forms present. + wpcf7_enqueue_scripts(); + } + } + + /** + * Enqueue styles if not already enqueued. + */ + public function conditionally_enqueue_styles() { + if ( ! did_action( 'wpcf7_enqueue_styles' ) ) { // Prevent double-enqueueing when multiple forms present. + wpcf7_enqueue_styles(); } } }