| 1 |
<?php |
| 2 |
|
| 3 |
class FrmReviews { |
| 4 |
|
| 5 |
private $option_name = 'frm_reviewed'; |
| 6 |
|
| 7 |
private $review_status = array(); |
| 8 |
|
| 9 |
/** |
| 10 |
* Add admin notices as needed for reviews |
| 11 |
* |
| 12 |
* @since 3.04.03 |
| 13 |
*/ |
| 14 |
public function review_request() { |
| 15 |
|
| 16 |
// Only show the review request to high-level users on Formidable pages |
| 17 |
if ( ! current_user_can( 'frm_change_settings' ) || ! FrmAppHelper::is_formidable_admin() ) { |
| 18 |
return; |
| 19 |
} |
| 20 |
|
| 21 |
// Verify that we can do a check for reviews |
| 22 |
$this->set_review_status(); |
| 23 |
|
| 24 |
// Check if it has been dismissed or if we can ask later |
| 25 |
$dismissed = $this->review_status['dismissed']; |
| 26 |
if ( $dismissed === 'later' && $this->review_status['asked'] < 3 ) { |
| 27 |
$dismissed = false; |
| 28 |
} |
| 29 |
|
| 30 |
$week_ago = ( $this->review_status['time'] + WEEK_IN_SECONDS ) <= time(); |
| 31 |
|
| 32 |
if ( empty( $dismissed ) && $week_ago ) { |
| 33 |
$this->review(); |
| 34 |
} |
| 35 |
} |
| 36 |
|
| 37 |
/** |
| 38 |
* When was the review request last dismissed? |
| 39 |
* |
| 40 |
* @since 3.04.03 |
| 41 |
*/ |
| 42 |
private function set_review_status() { |
| 43 |
$user_id = get_current_user_id(); |
| 44 |
$review = get_user_meta( $user_id, $this->option_name, true ); |
| 45 |
$default = array( |
| 46 |
'time' => time(), |
| 47 |
'dismissed' => false, |
| 48 |
'asked' => 0, |
| 49 |
); |
| 50 |
|
| 51 |
if ( empty( $review ) ) { |
| 52 |
// Set the review request to show in a week |
| 53 |
update_user_meta( $user_id, $this->option_name, $default ); |
| 54 |
} |
| 55 |
|
| 56 |
$review = array_merge( $default, (array) $review ); |
| 57 |
$review['asked'] = (int) $review['asked']; |
| 58 |
$this->review_status = $review; |
| 59 |
} |
| 60 |
|
| 61 |
/** |
| 62 |
* Maybe show review request |
| 63 |
* |
| 64 |
* @since 3.04.03 |
| 65 |
* @param int $asked |
| 66 |
*/ |
| 67 |
private function review() { |
| 68 |
|
| 69 |
// show the review request 3 times, depending on the number of entries |
| 70 |
$show_intervals = array( 50, 200, 500 ); |
| 71 |
$asked = $this->review_status['asked']; |
| 72 |
|
| 73 |
if ( ! isset( $show_intervals[ $asked ] ) ) { |
| 74 |
return; |
| 75 |
} |
| 76 |
|
| 77 |
$entries = FrmEntry::getRecordCount(); |
| 78 |
$count = $show_intervals[ $asked ]; |
| 79 |
$user = wp_get_current_user(); |
| 80 |
|
| 81 |
// Only show review request if the site has collected enough entries |
| 82 |
if ( $entries < $count ) { |
| 83 |
// check the entry count again in a week |
| 84 |
$this->review_status['time'] = time(); |
| 85 |
update_user_meta( $user->ID, $this->option_name, $this->review_status ); |
| 86 |
return; |
| 87 |
} |
| 88 |
|
| 89 |
if ( $entries <= 100 ) { |
| 90 |
// round to the nearest 10 |
| 91 |
$entries = floor( $entries / 10 ) * 10; |
| 92 |
} else { |
| 93 |
// round to the nearest 50 |
| 94 |
$entries = floor( $entries / 50 ) * 50; |
| 95 |
} |
| 96 |
$name = $user->first_name; |
| 97 |
if ( ! empty( $name ) ) { |
| 98 |
$name = ' ' . $name; |
| 99 |
} |
| 100 |
|
| 101 |
// We have a candidate! Output a review message. |
| 102 |
include( FrmAppHelper::plugin_path() . '/classes/views/shared/review.php' ); |
| 103 |
} |
| 104 |
|
| 105 |
/** |
| 106 |
* Save the request to hide the review |
| 107 |
* |
| 108 |
* @since 3.04.03 |
| 109 |
*/ |
| 110 |
public function dismiss_review() { |
| 111 |
FrmAppHelper::permission_check( 'frm_change_settings' ); |
| 112 |
check_ajax_referer( 'frm_ajax', 'nonce' ); |
| 113 |
|
| 114 |
$user_id = get_current_user_id(); |
| 115 |
$review = get_user_meta( $user_id, $this->option_name, true ); |
| 116 |
if ( empty( $review ) ) { |
| 117 |
$review = array(); |
| 118 |
} |
| 119 |
|
| 120 |
if ( isset( $review['dismissed'] ) && $review['dismissed'] === 'done' ) { |
| 121 |
// if feedback was submitted, don't update it again when the review is dismissed |
| 122 |
wp_die(); |
| 123 |
} |
| 124 |
|
| 125 |
$dismissed = FrmAppHelper::get_post_param( 'link', 'no', 'sanitize_text_field' ); |
| 126 |
$review['time'] = time(); |
| 127 |
$review['dismissed'] = $dismissed === 'done' ? true : 'later'; |
| 128 |
$review['asked'] = isset( $review['asked'] ) ? $review['asked'] + 1 : 1; |
| 129 |
|
| 130 |
update_user_meta( $user_id, $this->option_name, $review ); |
| 131 |
wp_die(); |
| 132 |
} |
| 133 |
} |
| 134 |
|