PluginProbe
Getwid – Gutenberg Blocks / 3.0.2
Getwid – Gutenberg Blocks v3.0.2
3.0.2 3.0.1 3.0.0 2.1.0 2.1.1 2.1.2 2.1.3 2.2.0 trunk 1.8.7 1.9.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9
← All changes | includes/blocks/contact-form.php +295 -348 2.0.53.0.2 View file →
@@ -1,348 +1,295 @@
1 -<?php
2 -
3 -namespace Getwid\Blocks;
4 -
5 -class ContactForm extends \Getwid\Blocks\AbstractBlock {
6 -
7 - protected static $blockName = 'getwid/contact-form';
8 -
9 - public function __construct() {
10 -
11 - parent::__construct( self::$blockName );
12 -
13 - add_action( 'wp_ajax_getwid_update_recaptcha_credentials', [ $this, 'update_recaptcha_credentials' ] );
14 -
15 - add_action( 'wp_ajax_getwid_send_mail', [ $this, 'send' ] );
16 - add_action( 'wp_ajax_nopriv_getwid_send_mail', [ $this, 'send' ] );
17 -
18 - $this->register_contact_form_blocks();
19 - }
20 -
21 - public function getLabel() {
22 - return __('Contact Form', 'getwid');
23 - }
24 -
25 - private function register_contact_form_blocks() {
26 -
27 - /* #region register all blocks */
28 - register_block_type(
29 - 'getwid/contact-form',
30 - array(
31 - 'render_callback' => [ $this, 'render_callback' ]
32 - )
33 - );
34 -
35 - $field_name = 'getwid/field-name';
36 - register_block_type(
37 - $field_name,
38 - array(
39 - 'render_callback' => [ $this, 'render_field_name_block' ]
40 - )
41 - );
42 -
43 - $field_email = 'getwid/field-email';
44 - register_block_type(
45 - $field_email,
46 - array(
47 - 'render_callback' => [ $this, 'render_field_email_block' ]
48 - )
49 - );
50 -
51 - $field_textarea = 'getwid/field-textarea';
52 - register_block_type(
53 - $field_textarea,
54 - array(
55 - 'render_callback' => [ $this, 'render_field_textarea_block' ]
56 - )
57 - );
58 - /* #endregion */
59 - }
60 -
61 - /* #region render inner blocks methods */
62 - public function render_field_name_block( $attributes ) {
63 - ob_start();?>
64 - <?php getwid_get_template_part( 'contact-form/field-name', $attributes, false ); ?><?php
65 -
66 - $result = ob_get_clean();
67 - return $result;
68 - }
69 -
70 - public function render_field_email_block( $attributes ) {
71 - ob_start();?>
72 - <?php getwid_get_template_part( 'contact-form/field-email', $attributes, false ); ?><?php
73 -
74 - $result = ob_get_clean();
75 - return $result;
76 - }
77 -
78 - public function render_field_textarea_block( $attributes ) {
79 - ob_start();?>
80 - <?php getwid_get_template_part( 'contact-form/field-textarea', $attributes, false ); ?><?php
81 -
82 - $result = ob_get_clean();
83 - return $result;
84 - }
85 -
86 - public function render_captcha_block( $attributes ) {
87 -
88 - $site_key = get_option( 'getwid_recaptcha_v2_site_key', '' );
89 -
90 - $extra_attr = array(
91 - 'site_key' => $site_key
92 - );
93 -
94 - $result = '';
95 - if ( $site_key ) {
96 -
97 - wp_enqueue_script( 'recaptcha', 'https://www.google.com/recaptcha/api.js?render=explicit' );
98 -
99 - ob_start();?>
100 - <?php getwid_get_template_part( 'contact-form/captcha', $attributes, false, $extra_attr ); ?><?php
101 -
102 - $result = ob_get_clean();
103 - }
104 -
105 - return $result;
106 - }
107 - /* #endregion */
108 -
109 - public function block_frontend_assets() {
110 -
111 - if ( is_admin() ) {
112 - return;
113 - }
114 -
115 - if ( FALSE == getwid()->assetsOptimization()->load_assets_on_demand() ) {
116 - return;
117 - }
118 -
119 - $rtl = is_rtl() ? '.rtl' : '';
120 -
121 - wp_enqueue_style(
122 - self::$blockName,
123 - getwid_get_plugin_url( 'assets/blocks/contact-form/style' . $rtl . '.css' ),
124 - [],
125 - getwid()->settings()->getVersion()
126 - );
127 -
128 - wp_enqueue_script(
129 - self::$blockName,
130 - getwid_get_plugin_url( 'assets/blocks/contact-form/frontend.js' ),
131 - [ 'jquery' ],
132 - getwid()->settings()->getVersion(),
133 - true
134 - );
135 -
136 - $inline_script =
137 - 'var Getwid = Getwid || {};' .
138 - 'Getwid["ajax_url"] = ' . json_encode( admin_url( 'admin-ajax.php' ) ) . ';' .
139 - 'Getwid["nonces"] = ' . json_encode(
140 - array( 'contact_form' => wp_create_nonce( 'getwid_nonce_send_contact_form' ) )
141 - ) . ';'
142 - ;
143 -
144 - wp_add_inline_script(
145 - self::$blockName,
146 - $inline_script,
147 - 'before'
148 - );
149 -
150 - }
151 -
152 - public function render_callback( $attributes, $content ) {
153 -
154 - $class = 'wp-block-getwid-contact-form';
155 - $block_name = $class;
156 -
157 - if ( isset( $attributes[ 'className' ] ) ) {
158 - $class .= ' ' . $attributes[ 'className' ];
159 - }
160 -
161 - if ( isset( $attributes[ 'align' ] ) ) {
162 - $class .= ' align' . $attributes[ 'align' ];
163 - }
164 -
165 - $button_style = '';
166 - $button_class = '';
167 -
168 - getwid_custom_color_style_and_class( $button_style, $button_class, $attributes, 'color' );
169 - getwid_custom_color_style_and_class( $button_style, $button_class, $attributes, 'background' );
170 -
171 - $recaptcha_theme = isset( $attributes['recaptchaTheme'] ) ? $attributes['recaptchaTheme'] : '';
172 - $captcha = $this->render_captcha_block( [ 'theme' => $recaptcha_theme ] );
173 -
174 - $extra_attr = array(
175 - 'class' => $class,
176 - 'block_name' => $block_name,
177 - 'content' => $content . $captcha,
178 -
179 - 'button_style' => $button_style,
180 - 'button_class' => $button_class
181 - );
182 -
183 - ob_start();?>
184 - <div class="<?php echo esc_attr( $class ); ?>" >
185 - <?php getwid_get_template_part( 'contact-form/contact-form', $attributes, false, $extra_attr ); ?>
186 - </div><?php
187 -
188 - $result = ob_get_clean();
189 -
190 - $this->block_frontend_assets();
191 -
192 - return $result;
193 - }
194 -
195 - public function send() {
196 -
197 - check_ajax_referer( 'getwid_nonce_send_contact_form', 'nonce' );
198 -
199 - $recaptcha_secret_key = get_option( 'getwid_recaptcha_v2_secret_key', false );
200 -
201 - if ( $recaptcha_secret_key ) {
202 -
203 - if ( empty( $_POST['data']['g-recaptcha-response'] ) ) {
204 - wp_send_json_error( $this->get_error( 'bad-request' ) );
205 - }
206 -
207 - $recaptcha_challenge = sanitize_text_field( wp_unslash( $_POST['data']['g-recaptcha-response'] ) );
208 -
209 - $request = wp_remote_get(
210 - 'https://google.com/recaptcha/api/siteverify?secret=' . $recaptcha_secret_key . '&response=' . $recaptcha_challenge,
211 - array( 'timeout' => 15 )
212 - );
213 -
214 - $response = json_decode( wp_remote_retrieve_body( $request ), false );
215 -
216 - $errors = '';
217 - if ( ! $response->{ 'success' } ) {
218 - foreach ( $response->{ 'error-codes' } as $index => $value ) {
219 - $errors .= $this->get_error( $value );
220 - }
221 - wp_send_json_error( $errors );
222 - } else {
223 - $this->send_mail( $_POST['data'] );
224 - }
225 -
226 - } else {
227 - $this->send_mail( $_POST['data'] );
228 - }
229 - }
230 -
231 - private function send_mail( $data ) {
232 -
233 - $to = get_option( 'admin_email' );
234 -
235 - $subject = esc_html__( 'Contact Form', 'getwid' );
236 -
237 - if ( ! empty( $data['subject'] ) ) {
238 - $subject = sprintf(
239 - //translators: %s is email subject
240 - esc_html__( 'Contact Form: %s', 'getwid' ),
241 - sanitize_text_field( wp_unslash( $data[ 'subject' ] ) )
242 - );
243 - }
244 -
245 - $email = sanitize_email( wp_unslash( $data[ 'email' ] ) );
246 - $name = sanitize_text_field( wp_unslash( $data[ 'name' ] ) );
247 - $message[] = sanitize_textarea_field( wp_unslash( $data[ 'message' ] ) );
248 - $message[] = '<br/><br/>';
249 - $message[] = '<hr/>';
250 - $message[] = sprintf(
251 - //translators: %s is a blogname
252 - __( 'This e-mail was sent from a contact form on %s', 'getwid' ),
253 - get_option( 'blogname' )
254 - );
255 -
256 - $body = implode( '', $message );
257 -
258 - if ( $email ) {
259 - $headers = array( 'Reply-To: ' . $name . ' <' . $email . '>' );
260 - }
261 -
262 - $response = getwid()->mailer()->send( $to, $subject, $body, $headers );
263 -
264 - if ( $response ) {
265 - wp_send_json_success(
266 - __( 'Thank you for your message. It has been sent.',
267 - 'getwid'
268 - ) );
269 - return;
270 - }
271 -
272 - wp_send_json_error(
273 - __('There was an error trying to send your message. Please try again later.', 'getwid')
274 - );
275 - }
276 -
277 - public function update_recaptcha_credentials() {
278 -
279 - check_ajax_referer( 'getwid_nonce_recaptcha_v2', 'nonce' );
280 -
281 - if ( ! current_user_can( 'manage_options' ) ) {
282 - wp_send_json_error();
283 - }
284 -
285 - $site_key = sanitize_text_field( wp_unslash( $_POST['data']['site_key'] ) );
286 - $secret_key = sanitize_text_field( wp_unslash( $_POST['data']['secret_key'] ) );
287 -
288 - if ( ! empty( $site_key ) ) {
289 - update_option( 'getwid_recaptcha_v2_site_key', $site_key );
290 - } else {
291 - delete_option( 'getwid_recaptcha_v2_site_key' );
292 - }
293 -
294 - if ( ! empty( $secret_key ) ) {
295 - update_option( 'getwid_recaptcha_v2_secret_key', $secret_key );
296 - } else {
297 - delete_option( 'getwid_recaptcha_v2_secret_key' );
298 - }
299 -
300 - wp_send_json_success();
301 - }
302 -
303 - private function get_error( $error_code ) {
304 - switch ( $error_code ) {
305 - case 'bad-request':
306 - return __( 'The request is invalid or malformed.',
307 - 'getwid'
308 - );
309 - break;
310 -
311 - case 'missing-input-secret':
312 - return __( 'The secret parameter is missing.',
313 - 'getwid'
314 - );
315 - break;
316 -
317 - case 'missing-input-response':
318 - return __( 'Please check the captcha.',
319 - 'getwid'
320 - );
321 - break;
322 -
323 - case 'invalid-input-secret':
324 - return __( 'The secret parameter is invalid or malformed.',
325 - 'getwid'
326 - );
327 - break;
328 -
329 - case 'invalid-input-response':
330 - return __( 'The response parameter is invalid or malformed.',
331 - 'getwid'
332 - );
333 - break;
334 -
335 - case 'timeout-or-duplicate':
336 - return __( 'The response is no longer valid: either is too old or has been used previously.',
337 - 'getwid'
338 - );
339 - break;
340 - default:
341 - return;
342 - }
343 - }
344 -}
345 -
346 -getwid()->blocksManager()->addBlock(
347 - new \Getwid\Blocks\ContactForm()
348 -);
1 +<?php
2 +
3 +namespace Getwid\Blocks;
4 +
5 +class ContactForm extends AbstractBlock {
6 +
7 + public function __construct() {
8 +
9 + parent::__construct( 'getwid/contact-form' );
10 +
11 + add_action( 'wp_ajax_getwid_update_recaptcha_credentials', array( $this, 'update_recaptcha_credentials' ) );
12 +
13 + add_action( 'wp_ajax_getwid_send_mail', array( $this, 'send' ) );
14 + add_action( 'wp_ajax_nopriv_getwid_send_mail', array( $this, 'send' ) );
15 +
16 + $this->register_contact_form_blocks();
17 +
18 + add_action( 'enqueue_block_assets', array( $this, 'block_frontend_assets' ) );
19 + }
20 +
21 + public function get_label() {
22 + return __( 'Contact Form', 'getwid' );
23 + }
24 +
25 + private function register_contact_form_blocks() {
26 +
27 + register_block_type(
28 + getwid_get_plugin_path( 'assets/blocks/contact-form/contact-form' ),
29 + array(
30 + 'render_callback' => array( $this, 'render_callback' ),
31 + )
32 + );
33 +
34 + register_block_type(
35 + getwid_get_plugin_path( 'assets/blocks/contact-form/field-name' ),
36 + array(
37 + 'render_callback' => array( $this, 'render_field_name_block' ),
38 + )
39 + );
40 +
41 + register_block_type(
42 + getwid_get_plugin_path( 'assets/blocks/contact-form/field-email' ),
43 + array(
44 + 'render_callback' => array( $this, 'render_field_email_block' ),
45 + )
46 + );
47 +
48 + register_block_type(
49 + getwid_get_plugin_path( 'assets/blocks/contact-form/field-textarea' ),
50 + array(
51 + 'render_callback' => array( $this, 'render_field_textarea_block' ),
52 + )
53 + );
54 + }
55 +
56 + public function render_field_name_block( $attributes ) {
57 +
58 + ob_start();
59 + getwid_get_template_part( 'contact-form/field-name', $attributes, false );
60 +
61 + return ob_get_clean();
62 + }
63 +
64 + public function render_field_email_block( $attributes ) {
65 +
66 + ob_start();
67 + getwid_get_template_part( 'contact-form/field-email', $attributes, false );
68 +
69 + return ob_get_clean();
70 + }
71 +
72 + public function render_field_textarea_block( $attributes ) {
73 +
74 + ob_start();
75 + getwid_get_template_part( 'contact-form/field-textarea', $attributes, false );
76 +
77 + return ob_get_clean();
78 + }
79 +
80 + public function render_captcha_block( $attributes ) {
81 +
82 + $site_key = get_option( 'getwid_recaptcha_v2_site_key', '' );
83 +
84 + $extra_attr = array(
85 + 'site_key' => $site_key,
86 + );
87 +
88 + $result = '';
89 + if ( $site_key ) {
90 +
91 + wp_enqueue_script( 'recaptcha', 'https://www.google.com/recaptcha/api.js?render=explicit' );
92 +
93 + ob_start();
94 + getwid_get_template_part( 'contact-form/captcha', $attributes, false, $extra_attr );
95 +
96 + $result = ob_get_clean();
97 + }
98 +
99 + return $result;
100 + }
101 +
102 + public function block_frontend_assets() {
103 +
104 + if ( is_admin() ) {
105 + return;
106 + }
107 +
108 + $inline_script = 'var Getwid = Getwid || {};';
109 + $inline_script .= 'Getwid["ajax_url"] = ' . wp_json_encode( admin_url( 'admin-ajax.php' ) ) . ';';
110 + $inline_script .= 'Getwid["nonces"] = ' . wp_json_encode(
111 + array(
112 + 'contact_form' => wp_create_nonce( 'getwid_nonce_send_contact_form' ),
113 + )
114 + ) . ';';
115 +
116 + wp_add_inline_script(
117 + 'getwid-contact-form-view-script',
118 + $inline_script,
119 + 'before'
120 + );
121 + }
122 +
123 + public function render_callback( $attributes, $content ) {
124 +
125 + $class = 'wp-block-getwid-contact-form';
126 + $block_name = $class;
127 +
128 + $button_style = '';
129 + $button_class = '';
130 +
131 + getwid_custom_color_style_and_class( $button_style, $button_class, $attributes, 'color' );
132 + getwid_custom_color_style_and_class( $button_style, $button_class, $attributes, 'background' );
133 +
134 + $recaptcha_theme = isset( $attributes['recaptchaTheme'] ) ? $attributes['recaptchaTheme'] : '';
135 + $captcha = $this->render_captcha_block( array( 'theme' => $recaptcha_theme ) );
136 +
137 + $extra_attr = array(
138 + 'class' => $class,
139 + 'block_name' => $block_name,
140 + 'content' => $content . $captcha,
141 + 'button_style' => $button_style,
142 + 'button_class' => $button_class,
143 + );
144 +
145 + $wrapper_attributes = get_block_wrapper_attributes();
146 +
147 + ob_start();
148 + ?>
149 + <div <?php echo $wrapper_attributes; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>>
150 + <?php getwid_get_template_part( 'contact-form/contact-form', $attributes, false, $extra_attr ); ?>
151 + </div>
152 + <?php
153 +
154 + return ob_get_clean();
155 + }
156 +
157 + public function send() {
158 +
159 + check_ajax_referer( 'getwid_nonce_send_contact_form', 'nonce' );
160 +
161 + $recaptcha_secret_key = get_option( 'getwid_recaptcha_v2_secret_key', false );
162 +
163 + if ( $recaptcha_secret_key ) {
164 +
165 + if ( empty( $_POST['data']['g-recaptcha-response'] ) ) {
166 + wp_send_json_error( $this->get_error( 'bad-request' ) );
167 + }
168 +
169 + $recaptcha_challenge = sanitize_text_field( wp_unslash( $_POST['data']['g-recaptcha-response'] ) );
170 +
171 + $request = wp_remote_get(
172 + 'https://google.com/recaptcha/api/siteverify?secret=' . $recaptcha_secret_key . '&response=' . $recaptcha_challenge,
173 + array( 'timeout' => 15 )
174 + );
175 +
176 + $response = json_decode( wp_remote_retrieve_body( $request ), false );
177 +
178 + $errors = '';
179 + if ( ! $response->{'success'} ) {
180 + foreach ( $response->{'error-codes'} as $value ) {
181 + $errors .= $this->get_error( $value );
182 + }
183 + wp_send_json_error( $errors );
184 + } else {
185 + $this->send_mail( $_POST['data'] );
186 + }
187 + } else {
188 + $this->send_mail( $_POST['data'] );
189 + }
190 + }
191 +
192 + private function send_mail( $data ) {
193 +
194 + $default_recipient = get_option( 'admin_email' );
195 + $recipient = get_option( 'getwid_contact_form_recipient_email', '' );
196 + $to = '' !== $recipient ? $recipient : $default_recipient;
197 +
198 + $subject = esc_html__( 'Contact Form', 'getwid' );
199 +
200 + if ( ! empty( $data['subject'] ) ) {
201 + $subject = sprintf(
202 + // translators: %s is email subject.
203 + esc_html__( 'Contact Form: %s', 'getwid' ),
204 + sanitize_text_field( wp_unslash( $data['subject'] ) )
205 + );
206 + }
207 +
208 + $email = sanitize_email( wp_unslash( $data['email'] ) );
209 + $name = sanitize_text_field( wp_unslash( $data['name'] ) );
210 + $message = array();
211 + $message[] = sanitize_textarea_field( wp_unslash( $data['message'] ) );
212 + $message[] = '<br/><br/>';
213 + $message[] = '<hr/>';
214 + $message[] = sprintf(
215 + // translators: %s is a blogname.
216 + __( 'This e-mail was sent from a contact form on %s', 'getwid' ),
217 + get_option( 'blogname' )
218 + );
219 +
220 + $body = implode( '', $message );
221 +
222 + if ( $email ) {
223 + $headers = array( 'Reply-To: ' . $name . ' <' . $email . '>' );
224 + }
225 +
226 + $response = getwid()->mailer()->send( $to, $subject, $body, $headers );
227 +
228 + if ( $response ) {
229 + wp_send_json_success(
230 + __( 'Thank you for your message. It has been sent.', 'getwid' )
231 + );
232 + return;
233 + }
234 +
235 + wp_send_json_error(
236 + __( 'There was an error trying to send your message. Please try again later.', 'getwid' )
237 + );
238 + }
239 +
240 + public function update_recaptcha_credentials() {
241 +
242 + check_ajax_referer( 'getwid_nonce_recaptcha_v2', 'nonce' );
243 +
244 + if ( ! current_user_can( 'manage_options' ) ) {
245 + wp_send_json_error();
246 + }
247 +
248 + $site_key = sanitize_text_field( wp_unslash( $_POST['data']['site_key'] ) );
249 + $secret_key = sanitize_text_field( wp_unslash( $_POST['data']['secret_key'] ) );
250 +
251 + if ( ! empty( $site_key ) ) {
252 + update_option( 'getwid_recaptcha_v2_site_key', $site_key );
253 + } else {
254 + delete_option( 'getwid_recaptcha_v2_site_key' );
255 + }
256 +
257 + if ( ! empty( $secret_key ) ) {
258 + update_option( 'getwid_recaptcha_v2_secret_key', $secret_key );
259 + } else {
260 + delete_option( 'getwid_recaptcha_v2_secret_key' );
261 + }
262 +
263 + wp_send_json_success();
264 + }
265 +
266 + private function get_error( $error_code ) {
267 +
268 + switch ( $error_code ) {
269 + case 'bad-request':
270 + return __( 'The request is invalid or malformed.', 'getwid' );
271 +
272 + case 'missing-input-secret':
273 + return __( 'The secret parameter is missing.', 'getwid' );
274 +
275 + case 'missing-input-response':
276 + return __( 'Please check the captcha.', 'getwid' );
277 +
278 + case 'invalid-input-secret':
279 + return __( 'The secret parameter is invalid or malformed.', 'getwid' );
280 +
281 + case 'invalid-input-response':
282 + return __( 'The response parameter is invalid or malformed.', 'getwid' );
283 +
284 + case 'timeout-or-duplicate':
285 + return __( 'The response is no longer valid: either is too old or has been used previously.', 'getwid' );
286 +
287 + default:
288 + return null;
289 + }
290 + }
291 +}
292 +
293 +getwid()->blocksManager()->addBlock(
294 + new ContactForm()
295 +);