PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.26.1
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.26.1
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
formidable / classes / models / FrmReviews.php

FrmReviews.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.26.1, at classes/models/FrmReviews.php

267 lines 6.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 class FrmReviews {
7
8 /**
9 * @var string
10 */
11 private $option_name = 'frm_reviewed';
12
13 /**
14 * @var array
15 */
16 private $review_status = array();
17
18 /**
19 * @var string
20 */
21 private $inbox_key = 'review';
22
23 /**
24 * Add admin notices as needed for reviews
25 *
26 * @since 3.04.03
27 *
28 * @return void
29 */
30 public function review_request() {
31
32 // Only show the review request to high-level users on Formidable pages
33 if ( ! current_user_can( 'frm_change_settings' ) || ! FrmAppHelper::is_formidable_admin() ) {
34 return;
35 }
36
37 // Verify that we can do a check for reviews
38 $this->set_review_status();
39
40 // Check if it has been dismissed or if we can ask later
41 $dismissed = $this->review_status['dismissed'];
42
43 if ( $dismissed === 'later' && $this->review_status['asked'] < 3 ) {
44 $dismissed = false;
45 }
46
47 $week_ago = $this->review_status['time'] + WEEK_IN_SECONDS <= time();
48
49 if ( empty( $dismissed ) && $week_ago ) {
50 $this->review();
51 }
52 }
53
54 /**
55 * When was the review request last dismissed?
56 *
57 * @since 3.04.03
58 *
59 * @return void
60 */
61 private function set_review_status() {
62 $user_id = get_current_user_id();
63 $review = get_user_meta( $user_id, $this->option_name, true );
64 $default = array(
65 'time' => time(),
66 'dismissed' => false,
67 'asked' => 0,
68 );
69
70 if ( empty( $review ) ) {
71 // Set the review request to show in a week
72 update_user_meta( $user_id, $this->option_name, $default );
73 }
74
75 $review = array_merge( $default, (array) $review );
76 $review['asked'] = (int) $review['asked'];
77 $this->review_status = $review;
78 }
79
80 /**
81 * Maybe show review request
82 *
83 * @since 3.04.03
84 *
85 * @return void
86 */
87 private function review() {
88
89 // show the review request 3 times, depending on the number of entries
90 $show_intervals = array( 50, 200, 500 );
91 $asked = $this->review_status['asked'];
92
93 if ( ! isset( $show_intervals[ $asked ] ) ) {
94 return;
95 }
96
97 $entries = FrmEntry::getRecordCount();
98 $count = $show_intervals[ $asked ];
99 $user = wp_get_current_user();
100
101 // Only show review request if the site has collected enough entries
102 if ( $entries < $count ) {
103 // check the entry count again in a week
104 $this->review_status['time'] = time();
105 update_user_meta( $user->ID, $this->option_name, $this->review_status );
106
107 return;
108 }
109
110 if ( $entries <= 100 ) {
111 // round to the nearest 10
112 $entries = floor( $entries / 10 ) * 10;
113 } else {
114 // round to the nearest 50
115 $entries = floor( $entries / 50 ) * 50;
116 }
117
118 $name = $user->first_name;
119
120 if ( ! empty( $name ) ) {
121 $name = ' ' . $name;
122 }
123
124 $title = sprintf(
125 /* translators: %1$d: number of entries */
126 esc_html__( 'You have collected %1$d form submissions.', 'formidable' ),
127 absint( $entries )
128 );
129
130 $this->add_to_inbox( $title, $name, $asked );
131
132 // We have a candidate! Output a review message.
133 include FrmAppHelper::plugin_path() . '/classes/views/shared/review.php';
134 }
135
136 /**
137 * @param string $title
138 * @param string $name
139 * @param int $asked
140 *
141 * @return void
142 */
143 private function add_to_inbox( $title, $name, $asked ) {
144 $message = new FrmInbox();
145 $requests = $message->get_messages();
146 $key = $this->inbox_key . ( $asked ? $asked : '' );
147
148 if ( isset( $requests[ $key ] ) ) {
149 return;
150 }
151
152 // Remove previous requests.
153 if ( $asked > 0 ) {
154 $message->remove( $this->inbox_key );
155 }
156
157 if ( $asked > 1 ) {
158 $message->remove( $this->inbox_key . '1' );
159 }
160
161 if ( $this->has_later_request( $requests, $asked ) ) {
162 // Don't add a request that has already been passed.
163 return;
164 }
165
166 $message->add_message(
167 array(
168 'key' => $key,
169 'message' => __( 'If you are enjoying Formidable, could you do me a BIG favor and give us a review to help me grow my little business and boost our motivation?', 'formidable' ) . '<br/>' .
170 '- Steph Wells<br/>' .
171 '<span>' . esc_html__( 'Co-Founder and CTO of Formidable Forms', 'formidable' ) . '<span>',
172 'subject' => str_replace( $name, '', $title ),
173 'cta' => '<a href="https://wordpress.org/support/plugin/formidable/reviews/?filter=5#new-post" class="frm-dismiss-review-notice frm-review-out button frm-button-secondary" data-link="yes" target="_blank" rel="noopener noreferrer">' .
174 esc_html__( 'Ok, you deserve it', 'formidable' ) . '</a>',
175 'type' => 'feedback',
176 )
177 );
178 }
179
180 /**
181 * If there are already later requests, don't add it to the inbox again.
182 *
183 * @since 4.05.02
184 *
185 * @param array $requests Array of requests.
186 * @param int $asked Number of times the review has been asked.
187 *
188 * @return bool
189 */
190 private function has_later_request( $requests, $asked ) {
191 return isset( $requests[ $this->inbox_key . ( $asked + 1 ) ] ) || isset( $requests[ $this->inbox_key . ( $asked + 2 ) ] );
192 }
193
194 /**
195 * @since 4.05.02
196 *
197 * @return array
198 */
199 private function inbox_keys() {
200 return array(
201 $this->inbox_key,
202 $this->inbox_key . '1',
203 $this->inbox_key . '2',
204 );
205 }
206
207 /**
208 * @since 4.05.01
209 *
210 * @return void
211 */
212 private function set_inbox_dismissed() {
213 $message = new FrmInbox();
214
215 foreach ( $this->inbox_keys() as $key ) {
216 $message->dismiss( $key );
217 }
218 }
219
220 /**
221 * @since 4.05.01
222 *
223 * @return void
224 */
225 private function set_inbox_read() {
226 $message = new FrmInbox();
227
228 foreach ( $this->inbox_keys() as $key ) {
229 $message->mark_read( $key );
230 }
231 }
232
233 /**
234 * Save the request to hide the review
235 *
236 * @since 3.04.03
237 *
238 * @return void
239 */
240 public function dismiss_review() {
241 FrmAppHelper::permission_check( 'frm_change_settings' );
242 check_ajax_referer( 'frm_ajax', 'nonce' );
243
244 $user_id = get_current_user_id();
245 $review = get_user_meta( $user_id, $this->option_name, true );
246
247 if ( empty( $review ) ) {
248 $review = array();
249 }
250
251 if ( isset( $review['dismissed'] ) && $review['dismissed'] === 'done' ) {
252 // if feedback was submitted, don't update it again when the review is dismissed
253 $this->set_inbox_dismissed();
254 wp_die();
255 }
256
257 $dismissed = FrmAppHelper::get_post_param( 'link', 'no', 'sanitize_text_field' );
258 $review['time'] = time();
259 $review['dismissed'] = $dismissed === 'done' ? true : 'later';
260 $review['asked'] = isset( $review['asked'] ) ? $review['asked'] + 1 : 1;
261
262 update_user_meta( $user_id, $this->option_name, $review );
263 $this->set_inbox_read();
264 wp_die();
265 }
266 }
267