class-product-upsell-notice.php
5.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
<?php
/**
* WPSEO plugin file.
*
* @package WPSEO\Admin
*/
/**
* Represents the upsell notice.
*/
class WPSEO_Product_Upsell_Notice {
/**
* Holds the name of the user meta key.
*
* The value of this database field holds whether the user has dismissed this notice or not.
*
* @var string
*/
const USER_META_DISMISSED = 'wpseo-remove-upsell-notice';
/**
* Holds the option name.
*
* @var string
*/
const OPTION_NAME = 'wpseo';
/**
* Holds the options.
*
* @var array
*/
protected $options;
/**
* Sets the options, because they always have to be there on instance.
*/
public function __construct() {
$this->options = $this->get_options();
}
/**
* Checks if the notice should be added or removed.
*/
public function initialize() {
$this->remove_notification();
}
/**
* Sets the upgrade notice.
*/
public function set_upgrade_notice() {
if ( $this->has_first_activated_on() ) {
return;
}
$this->set_first_activated_on();
$this->add_notification();
}
/**
* Listener for the upsell notice.
*/
public function dismiss_notice_listener() {
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are validating a nonce here.
if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'dismiss-5star-upsell' ) ) {
return;
}
$dismiss_upsell = isset( $_GET['yoast_dismiss'] ) && is_string( $_GET['yoast_dismiss'] ) ? sanitize_text_field( wp_unslash( $_GET['yoast_dismiss'] ) ) : '';
if ( $dismiss_upsell !== 'upsell' ) {
return;
}
$this->dismiss_notice();
if ( wp_safe_redirect( admin_url( 'admin.php?page=wpseo_dashboard' ) ) ) {
exit;
}
}
/**
* When the notice should be shown.
*
* @return bool
*/
protected function should_add_notification() {
return ( $this->options['first_activated_on'] < strtotime( '-2weeks' ) );
}
/**
* Checks if the options has a first activated on date value.
*
* @return bool
*/
protected function has_first_activated_on() {
return $this->options['first_activated_on'] !== false;
}
/**
* Sets the first activated on.
*/
protected function set_first_activated_on() {
$this->options['first_activated_on'] = strtotime( '-2weeks' );
$this->save_options();
}
/**
* Adds a notification to the notification center.
*/
protected function add_notification() {
$notification_center = Yoast_Notification_Center::get();
$notification_center->add_notification( $this->get_notification() );
}
/**
* Removes a notification to the notification center.
*/
protected function remove_notification() {
$notification_center = Yoast_Notification_Center::get();
$notification_center->remove_notification( $this->get_notification() );
}
/**
* Returns a premium upsell section if using the free plugin.
*
* @return string
*/
protected function get_premium_upsell_section() {
if ( ! YoastSEO()->helpers->product->is_premium() ) {
return sprintf(
/* translators: %1$s expands anchor to premium plugin page, %2$s expands to </a> */
__( 'By the way, did you know we also have a %1$sPremium plugin%2$s? It offers advanced features, like a redirect manager and support for multiple keyphrases. It also comes with 24/7 personal support.', 'wordpress-seo' ),
"<a href='" . WPSEO_Shortlinker::get( 'https://yoa.st/premium-notification' ) . "'>",
'</a>'
);
}
return '';
}
/**
* Gets the notification value.
*
* @return Yoast_Notification
*/
protected function get_notification() {
$message = sprintf(
/* translators: %1$s expands to Yoast SEO, %2$s is a link start tag to the plugin page on WordPress.org, %3$s is the link closing tag. */
__( 'We\'ve noticed you\'ve been using %1$s for some time now; we hope you love it! We\'d be thrilled if you could %2$sgive us a 5 stars rating on WordPress.org%3$s!', 'wordpress-seo' ),
'Yoast SEO',
'<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/rate-yoast-seo' ) . '">',
'</a>'
) . "\n\n";
$message .= sprintf(
/* translators: %1$s is a link start tag to the bugreport guidelines on the Yoast help center, %2$s is the link closing tag. */
__( 'If you are experiencing issues, %1$splease file a bug report%2$s and we\'ll do our best to help you out.', 'wordpress-seo' ),
'<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/bugreport' ) . '">',
'</a>'
) . "\n\n";
$message .= $this->get_premium_upsell_section() . "\n\n";
$message .= '<a class="button" href="' . wp_nonce_url( admin_url( '?page=' . WPSEO_Admin::PAGE_IDENTIFIER . '&yoast_dismiss=upsell' ), 'dismiss-5star-upsell' ) . '">' . __( 'Please don\'t show me this notification anymore', 'wordpress-seo' ) . '</a>';
$notification = new Yoast_Notification(
$message,
[
'type' => Yoast_Notification::WARNING,
'id' => 'wpseo-upsell-notice',
'capabilities' => 'wpseo_manage_options',
'priority' => 0.8,
]
);
return $notification;
}
/**
* Dismisses the notice.
*
* @return bool
*/
protected function is_notice_dismissed() {
return get_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true ) === '1';
}
/**
* Dismisses the notice.
*/
protected function dismiss_notice() {
update_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true );
}
/**
* Returns the set options.
*
* @return mixed
*/
protected function get_options() {
return get_option( self::OPTION_NAME );
}
/**
* Saves the options to the database.
*/
protected function save_options() {
update_option( self::OPTION_NAME, $this->options );
}
}