PluginProbe ʕ •ᴥ•ʔ
OttoKit: All-in-One Automation Platform / trunk
OttoKit: All-in-One Automation Platform vtrunk
1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.9 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 1.0.25 1.0.26 1.0.27 1.0.28 1.0.29 1.0.30 1.0.31 1.0.32 1.0.33 1.0.34 1.0.35 1.0.36 1.0.37 1.0.38 1.0.39 1.0.40 1.0.41 1.0.42 1.0.43 1.0.44 1.0.45 1.0.46 1.0.47 1.0.48 1.0.49 1.0.50 1.0.51 1.0.52 1.0.53 1.0.54 1.0.55 1.0.56 1.0.57 1.0.58 1.0.59 1.0.60 1.0.61 1.0.62 1.0.63 1.0.64 1.0.65 1.0.66 1.0.67 1.0.68 1.0.69 1.0.7 1.0.70 1.0.71 1.0.72 1.0.73 1.0.74 1.0.75 1.0.76 1.0.77 1.0.78 1.0.79 1.0.8 1.0.80 1.0.81 1.0.82 1.0.83 1.0.84 1.0.85 1.0.86 1.0.87 1.0.88 1.0.89 1.0.9 1.0.90 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.20 1.1.21 1.1.22 1.1.23 1.1.24 1.1.25 1.1.26 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8
suretriggers / functions.php
suretriggers Last commit date
app 4 weeks ago assets 2 months ago languages 2 weeks ago src 2 weeks ago autoloader.php 3 years ago changelog.txt 2 weeks ago functions.php 1 month ago readme.txt 2 weeks ago suretriggers.php 2 weeks ago tailwind.config.js 6 months ago
functions.php
374 lines
1 <?php
2 /**
3 * Global AutomatePlug Functions.
4 *
5 * @package Automateplug
6 */
7
8 /**
9 * Safely unserialize a value, blocking PHP object instantiation.
10 *
11 * Drop-in replacement for unserialize() / maybe_unserialize() on any data
12 * that originates from user input or external storage. Uses is_serialized()
13 * to detect serialized strings without calling unserialize(), then deserializes
14 * with allowed_classes => false so no PHP objects are ever instantiated.
15 *
16 * @param mixed $data Value to unserialize.
17 * @return mixed Unserialized value, or original value if not serialized.
18 */
19 function st_safe_unserialize( $data ) {
20 if ( ! is_string( $data ) || ! is_serialized( $data ) ) {
21 return $data;
22 }
23 // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctionParameters.unserialize_optionsFound -- allowed_classes requires PHP 7.0+; WP minimum is 7.2+
24 return unserialize( $data, [ 'allowed_classes' => false ] );
25 }
26
27 /**
28 * Get or prepare user id.
29 *
30 * @return int
31 */
32 function ap_get_current_user_id() {
33
34 $user_id = get_current_user_id();
35
36 if ( $user_id ) {
37 return $user_id;
38 }
39
40 if ( ! session_id() ) { //phpcs:ignore
41 session_start(); //phpcs:ignore
42 }
43
44 if ( isset( $_SESSION['ap_user_identifier'] ) ) {
45 return $_SESSION['ap_user_identifier']; //phpcs:ignore
46 }
47
48 $ap_user_id = wp_rand( 1000000000, 9999999999 );
49 $_SESSION['ap_user_identifier'] = $ap_user_id; //phpcs:ignore
50
51 return $_SESSION['ap_user_identifier']; //phpcs:ignore
52
53 }
54
55 /**
56 * Get or prepare user id.
57 *
58 * @param string $email user email.
59 *
60 * @return int|bool
61 */
62 function ap_get_user_id_from_email( $email ) {
63
64 if ( empty( $email ) || ! email_exists( $email ) ) {
65 return false;
66 }
67
68 $get_user = get_user_by( 'email', $email );
69 if ( ! $get_user instanceof WP_User ) {
70 return false;
71 }
72 return intval( $get_user->ID );
73
74 }
75
76 add_action(
77 'in_admin_header',
78 function () {
79 if ( isset( $_GET['page'] ) && 'suretriggers' === sanitize_text_field( $_GET['page'] ) ) { // phpcs:ignore
80 remove_all_actions( 'admin_notices' );
81 remove_all_actions( 'all_admin_notices' );
82 }
83 },
84 999
85 );
86
87 add_action( 'wp_login', 'suretrigger_capture_login_time', 10, 2 );
88
89 /**
90 * Login time.
91 *
92 * @param string $user_login user login.
93 * @param object $user user.
94 * @return void
95 */
96 function suretrigger_capture_login_time( $user_login, $user ) {
97 if ( ! property_exists( $user, 'ID' ) ) {
98 return;
99 }
100 update_user_meta( $user->ID, 'st_last_login', time() );
101 }
102
103 /**
104 * Add 5-star rating display to plugin row.
105 */
106 add_filter( 'plugin_row_meta', 'suretriggers_add_plugin_rating', 10, 2 );
107
108 /**
109 * Add 5-star rating to plugin meta row.
110 *
111 * @param array $links An array of the plugin's metadata.
112 * @param string $file Path to the plugin file relative to the plugins directory.
113 * @return array Modified array of plugin metadata.
114 */
115 function suretriggers_add_plugin_rating( $links, $file ) {
116 if ( plugin_basename( SURE_TRIGGERS_FILE ) === $file ) {
117 // Check if user has already clicked the rating (stored in user meta).
118 $user_id = get_current_user_id();
119 $rating_clicked = get_user_meta( $user_id, 'suretriggers_rating_clicked', true );
120
121 // If rating has been clicked, don't show it.
122 if ( $rating_clicked ) {
123 return $links;
124 }
125
126 $rating_html = '<span class="suretriggers-rating-wrapper" id="suretriggers-rating-wrapper">';
127 $rating_html .= '<a href="https://wordpress.org/support/plugin/suretriggers/reviews/" target="_blank" class="suretriggers-rating-link" title="Rate this plugin" aria-label="Rate SureTriggers 5 stars on WordPress.org">';
128 $rating_html .= '<span class="star-rating" role="img" aria-label="5 out of 5 stars">';
129 for ( $i = 1; $i <= 5; $i++ ) {
130 $rating_html .= '<span class="star star-full" aria-hidden="true"></span>';
131 }
132 $rating_html .= '</span>';
133 $rating_html .= '<span class="screen-reader-text">Rate this plugin</span>';
134 $rating_html .= '</a>';
135 $rating_html .= '</span>';
136 $links[] = $rating_html;
137 }
138 return $links;
139 }
140
141 /**
142 * Enqueue rating styles for plugin meta row.
143 */
144 add_action( 'admin_enqueue_scripts', 'suretriggers_enqueue_rating_styles' );
145
146 /**
147 * Enqueue CSS styles for 5-star rating display.
148 * Following modular CSS organization best practices.
149 *
150 * @return void
151 */
152 function suretriggers_enqueue_rating_styles() {
153 // Only enqueue on plugins page where rating is displayed.
154 $screen = get_current_screen();
155 if ( $screen && 'plugins' === $screen->id ) {
156 wp_enqueue_style(
157 'suretriggers-rating',
158 plugin_dir_url( SURE_TRIGGERS_FILE ) . 'assets/css/st-rating.css',
159 [],
160 defined( 'SURE_TRIGGERS_VER' ) ? SURE_TRIGGERS_VER : '1.0.0'
161 );
162
163 wp_enqueue_script(
164 'suretriggers-rating-js',
165 plugin_dir_url( SURE_TRIGGERS_FILE ) . 'assets/js/st-rating.js',
166 [ 'jquery' ],
167 defined( 'SURE_TRIGGERS_VER' ) ? SURE_TRIGGERS_VER : '1.0.0',
168 true
169 );
170
171 // Localize script with AJAX URL and nonce.
172 wp_localize_script(
173 'suretriggers-rating-js',
174 'suretriggers_rating_ajax',
175 [
176 'ajax_url' => admin_url( 'admin-ajax.php' ),
177 'nonce' => wp_create_nonce( 'suretriggers_rating_nonce' ),
178 ]
179 );
180 }
181 }
182
183 /**
184 * Handle AJAX request to mark rating as clicked.
185 */
186 add_action( 'wp_ajax_suretriggers_rating_clicked', 'suretriggers_handle_rating_clicked' );
187
188 /**
189 * Mark rating as clicked for current user.
190 *
191 * @return void
192 */
193 function suretriggers_handle_rating_clicked() {
194 // Check if nonce is set and verify it.
195 if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'suretriggers_rating_nonce' ) ) {
196 wp_die( 'Security check failed' );
197 }
198
199 // Mark rating as clicked for current user.
200 $user_id = get_current_user_id();
201 if ( $user_id ) {
202 update_user_meta( $user_id, 'suretriggers_rating_clicked', true );
203 wp_send_json_success( 'Rating marked as clicked' );
204 } else {
205 wp_send_json_error( 'User not logged in' );
206 }
207 }
208
209 /**
210 * SureTrigger Trigger Button shortcode.
211 *
212 * @param array $atts Attributes.
213 * @param null $content Content.
214 * @return string|bool
215 */
216 function suretrigger_button( $atts, $content = null ) {
217 $atts = shortcode_atts(
218 [
219 'id' => 0,
220 'button_label' => __( 'Click here', 'suretriggers' ),
221 'user_redirect_url' => '',
222 'visitor_redirect_url' => '',
223 'button_class' => 'suretrigger_button',
224 'button_id' => 'suretrigger_button',
225 'click_loading_label' => __( 'Clicking...', 'suretriggers' ),
226 'after_clicked_label' => __( 'Clicked!!', 'suretriggers' ),
227 'click_once' => 'true',
228 'cookie_duration' => '15',
229 ],
230 $atts,
231 'trigger_button'
232 );
233 ob_start();
234 $user_id = get_current_user_id();
235 ?>
236
237 <form method="post" class="suretrigger_button_form" id="suretrigger_button_form_<?php echo esc_attr( (string) $atts['id'] ); ?>">
238 <input type="hidden" name="st_trigger_id" value="<?php echo esc_attr( (string) $atts['id'] ); ?>" />
239 <input type="hidden" name="st_nonce" value="<?php echo esc_attr( wp_create_nonce( 'suretrigger_form' ) ); ?>"/>
240 <input type="hidden" name="st_login_url" value="<?php echo esc_attr( $atts['user_redirect_url'] ); ?>"/>
241 <input type="hidden" name="st_non_login_url" value="<?php echo esc_attr( $atts['visitor_redirect_url'] ); ?>"/>
242 <input type="hidden" name="st_click" value="<?php echo esc_attr( $atts['click_once'] ); ?>"/>
243 <input type="hidden" name="st_button_label" value="<?php echo esc_attr( $atts['button_label'] ); ?>"/>
244 <input type="hidden" name="st_loading_label" value="<?php echo esc_attr( $atts['click_loading_label'] ); ?>"/>
245 <input type="hidden" name="st_clicked_label" value="<?php echo esc_attr( $atts['after_clicked_label'] ); ?>"/>
246 <input type="hidden" name="action" value="handle_trigger_button_click"/>
247 <input type="hidden" name="st_cookie_duration" value="<?php echo esc_attr( $atts['cookie_duration'] ); ?>"/>
248 <input type="hidden" name="st_user_id" value="<?php echo esc_attr( (string) $user_id ); ?>"/>
249 <?php
250 global $post;
251 if ( ! empty( $post ) && is_object( $post ) && isset( $post->ID ) && isset( $post->post_title ) ) {
252 ?>
253 <input type="hidden" name="st_button_post_id" value="<?php echo esc_attr( $post->ID ); ?>"/>
254 <input type="hidden" name="st_button_post_title" value="<?php echo esc_attr( $post->post_title ); ?>"/>
255 <?php
256 }
257 $cookie_name = 'st_trigger_button_clicked_' . esc_attr( (string) $atts['id'] );
258 if ( isset( $_COOKIE[ $cookie_name ] ) && 'yes_' . $user_id == $_COOKIE[ $cookie_name ] ) {
259 ?>
260 <button type="button" class="<?php echo esc_attr( $atts['button_class'] ); ?>" id="<?php echo esc_attr( $atts['button_id'] ); ?>"><?php echo esc_html( $atts['after_clicked_label'] ); ?></button>
261 <?php
262 } else {
263 ?>
264 <button type="button" class="<?php echo esc_attr( $atts['button_class'] ); ?>" id="<?php echo esc_attr( $atts['button_id'] ); ?>" onclick="st_trigger_ajax(this);return false;"><?php echo esc_html( $atts['button_label'] ); ?></button>
265 <?php
266 }
267 ?>
268 </form>
269
270 <?php
271 return ob_get_clean();
272 }
273 add_shortcode( 'st_trigger_button', 'suretrigger_button' );
274
275 /**
276 * SureTrigger Trigger Button custom style.
277 *
278 * @return void
279 */
280 function suretrigger_button_custom_style() {
281 wp_enqueue_style( 'st-trigger-button-style', SURE_TRIGGERS_URL . 'assets/css/st-trigger-button.css', [], SURE_TRIGGERS_VER );
282 wp_enqueue_script( 'st-trigger-button-script', SURE_TRIGGERS_URL . 'assets/js/st-trigger-button.js', [], SURE_TRIGGERS_VER, true );
283 wp_localize_script( 'st-trigger-button-script', 'st_ajax_object', [ 'ajax_url' => admin_url( 'admin-ajax.php' ) ] );
284 }
285 add_action( 'wp_enqueue_scripts', 'suretrigger_button_custom_style' );
286
287 /**
288 * SureTrigger Trigger Button action.
289 *
290 * @return void
291 */
292 function suretrigger_trigger_button_action() {
293
294 // Trigger the custom hook before ajax response.
295 do_action( 'st_trigger_button_before_click_hook' );
296
297 if ( ! isset( $_POST['st_nonce'] ) || ! wp_verify_nonce( wp_strip_all_tags( $_POST['st_nonce'] ), 'suretrigger_form' ) ) {
298 wp_send_json_error( [ 'error' => 'Invalid nonce' ] );
299 }
300
301 if ( is_user_logged_in() ) {
302 $user_id = get_current_user_id();
303
304 if ( isset( $_POST['st_trigger_id'] ) && ! empty( $_POST['st_trigger_id'] ) ) {
305
306 $st_trigger_id = sanitize_text_field( $_POST['st_trigger_id'] );
307
308 $cookie_duration = isset( $_POST['st_cookie_duration'] ) ? sanitize_text_field( $_POST['st_cookie_duration'] ) : '';
309 $st_click = isset( $_POST['st_click'] ) ? sanitize_text_field( $_POST['st_click'] ) : '';
310
311 $post_data = [];
312
313 if ( isset( $_POST['st_button_post_id'] ) ) {
314 $post_data['parent_post_id'] = sanitize_text_field( $_POST['st_button_post_id'] );
315 }
316
317 if ( isset( $_POST['st_button_post_title'] ) ) {
318 $post_data['parent_post_title'] = sanitize_text_field( $_POST['st_button_post_title'] );
319 }
320 do_action( 'st_trigger_button_action', $st_trigger_id, $user_id, sanitize_text_field( $cookie_duration ), $st_click, $post_data );
321
322 if ( isset( $_POST['st_login_url'] ) && ! empty( $_POST['st_login_url'] ) ) {
323 wp_send_json_success( esc_url_raw( $_POST['st_login_url'] ) );
324 }
325 }
326 } else {
327 if ( isset( $_POST['st_non_login_url'] ) && ! empty( $_POST['st_non_login_url'] ) ) {
328 wp_send_json_success( esc_url_raw( $_POST['st_non_login_url'] ) );
329 } else {
330 wp_send_json_success( wp_login_url() );
331 }
332 }
333
334 // Trigger the custom hook after ajax response.
335 do_action( 'st_trigger_button_after_click_hook' );
336
337 wp_die();
338 }
339 add_action( 'wp_ajax_handle_trigger_button_click', 'suretrigger_trigger_button_action' );
340 add_action( 'wp_ajax_nopriv_handle_trigger_button_click', 'suretrigger_trigger_button_action' );
341
342 /**
343 * SureTrigger Trigger Button set cookie.
344 *
345 * @param int $st_trigger_id Trigger ID.
346 * @param int $user_id User ID.
347 * @param int $cookie_duration Cookie Duration.
348 *
349 * @return void
350 */
351 function st_trigger_button_set_cookie( $st_trigger_id, $user_id, $cookie_duration ) {
352 // Set the cookie.
353 $cookie_name = 'st_trigger_button_clicked_' . $st_trigger_id;
354 $cookie_value = 'yes_' . $user_id;
355 if ( isset( $cookie_duration ) ) {
356 $expiration = time() + 60 * 60 * 24 * intval( $cookie_duration ); // Set the expiration time as per user requested.
357 } else {
358 $expiration = time() + 60 * 60 * 24 * 15;
359 }
360
361 if ( ! defined( 'COOKIEPATH' ) ) {
362 define( 'COOKIEPATH', '/' );
363 }
364
365 if ( ! defined( 'COOKIE_DOMAIN' ) ) {
366 define( 'COOKIE_DOMAIN', false );
367 }
368
369 $secure = is_ssl();
370 setcookie( $cookie_name, $cookie_value, $expiration, COOKIEPATH, COOKIE_DOMAIN, $secure, true ); // phpcs:ignore
371
372 }
373 add_action( 'st_trigger_button_set_cookie', 'st_trigger_button_set_cookie', 10, 3 );
374