/home/vianto5/ceibaresidencial.mx/wp-content/plugins/wpforms/src/Pro/Emails
NameSizeModeActions
Templates/-0755rm
LicenseBanner.php63500644editdlrm
ReengagementAlert.php70470644editdlrm
Summaries.php16090644editdlrm
Edit: /home/vianto5/ceibaresidencial.mx/wp-content/plugins/wpforms/src/Pro/Emails/ReengagementAlert.php (7047B)
[ trigger_days, utm_content ]. * * @since 1.10.1.1 */ private const VARIANTS = [ 'phase-a-early' => [ 'trigger_days' => [ 30, 60, 90 ], 'utm_content' => '0entries-phase-a-early', ], 'phase-a-late' => [ 'trigger_days' => [ 120, 150 ], 'utm_content' => '0entries-phase-a-late', ], 'phase-b' => [ 'trigger_days' => [ 180, 210, 240, 270 ], 'utm_content' => '0entries-phase-b', ], ]; /** * Initialize the class. * * @since 1.10.1.1 */ public function init(): void { $this->hooks(); } /** * Register hooks. * * @since 1.10.1.1 */ private function hooks(): void { add_filter( 'wpforms_emails_summaries_template', [ $this, 'maybe_add_alert_args' ] ); add_filter( 'wpforms_emails_summaries_cron_skip_empty', [ $this, 'maybe_allow_empty_entries' ] ); } /** * Resolve the active variant for the current site, or null when no alert should fire. * * @since 1.10.1.1 * * @return string|null Variant slug or null. */ private function get_active_variant(): ?string { $tenure_days = $this->get_tenure_days(); if ( $tenure_days < 0 ) { return null; } $variant = $this->resolve_variant( $tenure_days ); if ( $variant === null ) { return null; } if ( ! $this->has_forms() || ! $this->has_zero_entries() ) { return null; } return $variant; } /** * Allow the weekly summary cron to send when this site qualifies for a re-engagement alert. * * @since 1.10.1.1 * * @param bool $skip_empty Whether to skip sending when entries are empty. * * @return bool */ public function maybe_allow_empty_entries( $skip_empty ): bool { $skip_empty = (bool) $skip_empty; if ( ! $skip_empty ) { return false; } return $this->get_active_variant() === null; } /** * Resolve the active variant slug for the given tenure days, or null if none. * * @since 1.10.1.1 * * @param int $tenure_days Days since Pro plugin activation. * * @return string|null Variant slug or null when outside all trigger windows. */ private function resolve_variant( int $tenure_days ): ?string { if ( $tenure_days < 30 || $tenure_days >= self::HARD_STOP_DAY + self::WINDOW_DAYS ) { return null; } foreach ( self::VARIANTS as $slug => $config ) { foreach ( $config['trigger_days'] as $trigger ) { if ( $tenure_days >= $trigger && $tenure_days < $trigger + self::WINDOW_DAYS ) { return $slug; } } } return null; } /** * Days elapsed since Pro plugin activation. Returns -1 if activation timestamp is missing. * * @since 1.10.1.1 * * @return int */ private function get_tenure_days(): int { $activated = get_option( 'wpforms_activated', [] ); $pro_activated_at = isset( $activated['pro'] ) ? (int) $activated['pro'] : 0; if ( $pro_activated_at <= 0 ) { return -1; } return (int) floor( ( time() - $pro_activated_at ) / DAY_IN_SECONDS ); } /** * Whether the site has at least one form. * * @since 1.10.1.1 * * @return bool */ private function has_forms(): bool { $form_obj = wpforms()->obj( 'form' ); if ( ! $form_obj ) { return false; } $forms = $form_obj->get( '', [ 'fields' => 'ids', 'numberposts' => 1, ] ); return ! empty( $forms ); } /** * Whether the site has zero entries across all forms. * * @since 1.10.1.1 * * @return bool */ private function has_zero_entries(): bool { $entry_obj = wpforms()->obj( 'entry' ); if ( ! $entry_obj ) { return false; } return (int) $entry_obj->get_entries( [], true ) === 0; } /** * Build the alert template args for the resolved variant. * * @since 1.10.1.1 * * @param string $variant Variant slug. * * @return array Alert args (slug, title, content, button_text, button_url). */ private function build_args( string $variant ): array { $utm_content = self::VARIANTS[ $variant ]['utm_content']; $utm_medium = 'email'; $utm_campaign = 'weekly-summary-reengagement'; // Copy table per issue #17326. $copy = [ 'phase-a-early' => [ 'title' => __( 'Your forms aren\'t collecting entries yet', 'wpforms' ), 'content' => __( 'Forms only collect entries when they\'re embedded on a page visitors can see. Check that each form is added to a page (via shortcode or block) and that the page actually gets traffic.', 'wpforms' ), 'button_text' => __( 'Check Your Forms', 'wpforms' ), 'admin_path' => 'admin.php?page=wpforms-overview', ], 'phase-a-late' => [ 'title' => __( 'Your forms have been quiet for a while', 'wpforms' ), 'content' => __( 'After a few months at zero, the most common cause is page placement. Try moving your form to a higher-traffic page: homepage, pricing, or a top blog post.', 'wpforms' ), 'button_text' => __( 'Check Your Forms', 'wpforms' ), 'admin_path' => 'admin.php?page=wpforms-overview', ], 'phase-b' => [ 'title' => __( 'Still no entries? Try a different form type.', 'wpforms' ), 'content' => __( 'When placement isn\'t the issue, matching the form to visitor intent usually unsticks things: quote request for services, newsletter signup for content, or demo booking for software.', 'wpforms' ), 'button_text' => __( 'Browse Templates', 'wpforms' ), 'admin_path' => 'admin.php?page=wpforms-builder', ], ][ $variant ]; $button_url = add_query_arg( [ 'utm_source' => 'wpforms-plugin', 'utm_medium' => $utm_medium, 'utm_campaign' => $utm_campaign, 'utm_content' => $utm_content, ], admin_url( $copy['admin_path'] ) ); return [ 'slug' => $variant, 'title' => $copy['title'], 'content' => $copy['content'], 'button_text' => $copy['button_text'], 'button_url' => $button_url, ]; } /** * Inject the re-engagement alert args into the summary template when conditions are met. * * @since 1.10.1.1 * * @param Summary $template Summary email template. * * @return Summary */ public function maybe_add_alert_args( $template ) { if ( ! $template instanceof Summary ) { return $template; } $variant = $this->get_active_variant(); if ( $variant === null ) { return $template; } $template->set_args( [ 'body' => [ 'reengagement_alert' => $this->build_args( $variant ), ], ] ); return $template; } }