PluginProbe
Double Opt-In for Contact Form 7 – Secure, GDPR-Compliant Email Verification / 5.7.0
Double Opt-In for Contact Form 7 – Secure, GDPR-Compliant Email Verification v5.7.0
5.7.0 5.6.2 5.6.3 5.6.1 5.6.0 5.5.0 5.4.0 5.3.2 5.3.1 5.1.6 5.1.5 trunk 2.1.5 2.11 2.12 2.13 2.15 3.0.0 3.0.1 3.0.2 3.0.3 3.0.5 3.0.51 3.0.60 3.0.61 All 39 releases
double-opt-in / src / Setup / FormDefaults.php

FormDefaults.php in Double Opt-In for Contact Form 7 – Secure, GDPR-Compliant Email Verification 5.7.0, at src/Setup/FormDefaults.php

138 lines 3.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Sender defaults for forms that have none of their own.
4 *
5 * Set in the first step of the setup wizard. Without them a form that gets
6 * Double Opt-In switched on later starts with the admin address and no
7 * sender name, and WordPress fills the gap with "WordPress" — one of the
8 * recurring support questions.
9 *
10 * A value a form already has is never replaced.
11 *
12 * @package Forge12\DoubleOptIn\Setup
13 * @since 5.7.0
14 */
15
16 declare( strict_types=1 );
17
18 namespace Forge12\DoubleOptIn\Setup;
19
20 if ( ! defined( 'ABSPATH' ) ) {
21 exit;
22 }
23
24 class FormDefaults {
25
26 public const OPTION = 'f12_doi_form_defaults';
27
28 /**
29 * @return array{sender: string, sender_name: string}
30 */
31 public static function get(): array {
32 $stored = get_option( self::OPTION, array() );
33 $stored = is_array( $stored ) ? $stored : array();
34
35 return array(
36 'sender' => isset( $stored['sender'] ) ? (string) $stored['sender'] : '',
37 'sender_name' => isset( $stored['sender_name'] ) ? (string) $stored['sender_name'] : '',
38 );
39 }
40
41 /**
42 * Store sanitized defaults. An invalid address is dropped, the name kept.
43 */
44 public static function save( string $sender, string $senderName ): void {
45 $sender = sanitize_email( $sender );
46
47 update_option(
48 self::OPTION,
49 array(
50 'sender' => is_email( $sender ) ? $sender : '',
51 'sender_name' => sanitize_text_field( $senderName ),
52 ),
53 false
54 );
55 }
56
57 public static function register(): void {
58 add_filter( 'f12_cf7_doubleoptin_get_parameter', array( self::class, 'fillParameters' ) );
59 add_filter( 'f12-cf7-doubleoptin-cf7-args', array( self::class, 'fillMailArgs' ) );
60 }
61
62 /**
63 * Defaults for a form without saved settings (legacy runtime path).
64 *
65 * @param mixed $data Parameter defaults before the form's own meta is merged in.
66 *
67 * @return mixed
68 */
69 public static function fillParameters( $data ) {
70 if ( ! is_array( $data ) ) {
71 return $data;
72 }
73 return self::fill( $data, 'sender', 'sender_name' );
74 }
75
76 /**
77 * Fill an empty sender name at send time, so a form saved before the
78 * defaults existed does not go out as "WordPress".
79 *
80 * @param mixed $args CF7 mail arguments.
81 *
82 * @return mixed
83 */
84 public static function fillMailArgs( $args ) {
85 if ( ! is_array( $args ) ) {
86 return $args;
87 }
88 $defaults = self::get();
89 if ( trim( (string) ( $args['sender_name'] ?? '' ) ) === '' && $defaults['sender_name'] !== '' ) {
90 $args['sender_name'] = $defaults['sender_name'];
91 }
92 return $args;
93 }
94
95 /**
96 * @param array<string, mixed> $data
97 *
98 * @return array<string, mixed>
99 */
100 private static function fill( array $data, string $senderKey, string $nameKey ): array {
101 $defaults = self::get();
102 if ( $defaults['sender'] !== '' && self::isFallbackSender( (string) ( $data[ $senderKey ] ?? '' ) ) ) {
103 $data[ $senderKey ] = $defaults['sender'];
104 }
105 if ( $defaults['sender_name'] !== '' && trim( (string) ( $data[ $nameKey ] ?? '' ) ) === '' ) {
106 $data[ $nameKey ] = $defaults['sender_name'];
107 }
108 return $data;
109 }
110
111 /**
112 * Empty, or the admin address Core puts in when nothing was chosen.
113 */
114 private static function isFallbackSender( string $sender ): bool {
115 return $sender === '' || $sender === (string) get_bloginfo( 'admin_email' );
116 }
117
118 /**
119 * Apply the defaults to a new, unsaved settings object.
120 *
121 * @param string $sender Current sender (the admin address by default).
122 * @param string $senderName Current sender name.
123 *
124 * @return array{0: string, 1: string}
125 */
126 public static function forNewForm( string $sender, string $senderName ): array {
127 $filled = self::fill(
128 array(
129 'sender' => $sender,
130 'sender_name' => $senderName,
131 ),
132 'sender',
133 'sender_name'
134 );
135 return array( (string) $filled['sender'], (string) $filled['sender_name'] );
136 }
137 }
138