PluginProbe ʕ •ᴥ•ʔ
Yoast SEO – Advanced SEO with real-time guidance and built-in AI / 23.8
Yoast SEO – Advanced SEO with real-time guidance and built-in AI v23.8
27.8 27.7 27.6 27.5 trunk 18.0 18.1 18.2 18.3 18.4 18.4.1 18.5 18.5.1 18.6 18.7 18.8 18.9 19.0 19.1 19.10 19.11 19.12 19.13 19.14 19.2 19.3 19.4 19.5 19.5.1 19.6 19.6.1 19.7 19.7.1 19.7.2 19.8 19.9 20.0 20.1 20.10 20.11 20.12 20.13 20.2 20.2.1 20.3 20.4 20.5 20.6 20.7 20.8 20.9 21.0 21.1 21.2 21.3 21.4 21.5 21.6 21.7 21.8 21.8.1 21.9 21.9.1 22.0 22.1 22.2 22.3 22.4 22.5 22.6 22.7 22.8 22.9 23.0 23.1 23.2 23.3 23.4 23.5 23.6 23.7 23.8 23.9 24.0 24.1 24.2 24.3 24.4 24.5 24.6 24.7 24.8 24.8.1 24.9 25.0 25.1 25.2 25.3 25.3.1 25.4 25.5 25.6 25.7 25.8 25.9 26.0 26.1 26.1.1 26.2 26.3 26.4 26.5 26.6 26.7 26.8 26.9 27.0 27.1 27.1.1 27.2 27.3 27.4
wordpress-seo / admin / class-product-upsell-notice.php
wordpress-seo / admin Last commit date
ajax 2 years ago capabilities 2 years ago endpoints 2 years ago exceptions 7 years ago filters 2 years ago formatter 1 year ago google_search_console 2 years ago import 2 years ago listeners 8 years ago menu 1 year ago metabox 1 year ago notifiers 3 years ago pages 2 years ago roles 2 years ago services 5 years ago statistics 2 years ago taxonomy 1 year ago tracking 1 year ago views 1 year ago watchers 2 years ago admin-settings-changed-listener.php 2 years ago ajax.php 2 years ago class-admin-asset-analysis-worker-location.php 5 years ago class-admin-asset-dev-server-location.php 2 years ago class-admin-asset-location.php 8 years ago class-admin-asset-manager.php 1 year ago class-admin-asset-seo-location.php 4 years ago class-admin-editor-specific-replace-vars.php 2 years ago class-admin-gutenberg-compatibility-notification.php 2 years ago class-admin-help-panel.php 5 years ago class-admin-init.php 2 years ago class-admin-recommended-replace-vars.php 2 years ago class-admin-user-profile.php 1 year ago class-admin-utils.php 2 years ago class-admin.php 1 year ago class-asset.php 1 year ago class-bulk-description-editor-list-table.php 5 years ago class-bulk-editor-list-table.php 2 years ago class-bulk-title-editor-list-table.php 6 years ago class-collector.php 2 years ago class-config.php 1 year ago class-database-proxy.php 2 years ago class-export.php 2 years ago class-expose-shortlinks.php 2 years ago class-gutenberg-compatibility.php 1 year ago class-meta-columns.php 2 years ago class-my-yoast-proxy.php 2 years ago class-option-tab.php 4 years ago class-option-tabs-formatter.php 2 years ago class-option-tabs.php 2 years ago class-paper-presenter.php 5 years ago class-plugin-availability.php 1 year ago class-plugin-conflict.php 2 years ago class-premium-popup.php 2 years ago class-premium-upsell-admin-block.php 1 year ago class-primary-term-admin.php 2 years ago class-product-upsell-notice.php 2 years ago class-remote-request.php 2 years ago class-schema-person-upgrade-notification.php 2 years ago class-suggested-plugins.php 2 years ago class-wincher-dashboard-widget.php 2 years ago class-yoast-columns.php 2 years ago class-yoast-dashboard-widget.php 2 years ago class-yoast-form.php 1 year ago class-yoast-input-validation.php 1 year ago class-yoast-network-admin.php 2 years ago class-yoast-network-settings-api.php 4 years ago class-yoast-notification-center.php 1 year ago class-yoast-notification.php 1 year ago class-yoast-notifications.php 2 years ago class-yoast-plugin-conflict.php 2 years ago index.php 10 years ago interface-collection.php 7 years ago interface-installable.php 8 years ago
class-product-upsell-notice.php
232 lines
1 <?php
2 /**
3 * WPSEO plugin file.
4 *
5 * @package WPSEO\Admin
6 */
7
8 /**
9 * Represents the upsell notice.
10 */
11 class WPSEO_Product_Upsell_Notice {
12
13 /**
14 * Holds the name of the user meta key.
15 *
16 * The value of this database field holds whether the user has dismissed this notice or not.
17 *
18 * @var string
19 */
20 public const USER_META_DISMISSED = 'wpseo-remove-upsell-notice';
21
22 /**
23 * Holds the option name.
24 *
25 * @var string
26 */
27 public const OPTION_NAME = 'wpseo';
28
29 /**
30 * Holds the options.
31 *
32 * @var array
33 */
34 protected $options;
35
36 /**
37 * Sets the options, because they always have to be there on instance.
38 */
39 public function __construct() {
40 $this->options = $this->get_options();
41 }
42
43 /**
44 * Checks if the notice should be added or removed.
45 *
46 * @return void
47 */
48 public function initialize() {
49 $this->remove_notification();
50 }
51
52 /**
53 * Sets the upgrade notice.
54 *
55 * @return void
56 */
57 public function set_upgrade_notice() {
58
59 if ( $this->has_first_activated_on() ) {
60 return;
61 }
62
63 $this->set_first_activated_on();
64 $this->add_notification();
65 }
66
67 /**
68 * Listener for the upsell notice.
69 *
70 * @return void
71 */
72 public function dismiss_notice_listener() {
73 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are validating a nonce here.
74 if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'dismiss-5star-upsell' ) ) {
75 return;
76 }
77
78 $dismiss_upsell = isset( $_GET['yoast_dismiss'] ) && is_string( $_GET['yoast_dismiss'] ) ? sanitize_text_field( wp_unslash( $_GET['yoast_dismiss'] ) ) : '';
79
80 if ( $dismiss_upsell !== 'upsell' ) {
81 return;
82 }
83
84 $this->dismiss_notice();
85
86 if ( wp_safe_redirect( admin_url( 'admin.php?page=wpseo_dashboard' ) ) ) {
87 exit;
88 }
89 }
90
91 /**
92 * When the notice should be shown.
93 *
94 * @return bool
95 */
96 protected function should_add_notification() {
97 return ( $this->options['first_activated_on'] < strtotime( '-2weeks' ) );
98 }
99
100 /**
101 * Checks if the options has a first activated on date value.
102 *
103 * @return bool
104 */
105 protected function has_first_activated_on() {
106 return $this->options['first_activated_on'] !== false;
107 }
108
109 /**
110 * Sets the first activated on.
111 *
112 * @return void
113 */
114 protected function set_first_activated_on() {
115 $this->options['first_activated_on'] = strtotime( '-2weeks' );
116
117 $this->save_options();
118 }
119
120 /**
121 * Adds a notification to the notification center.
122 *
123 * @return void
124 */
125 protected function add_notification() {
126 $notification_center = Yoast_Notification_Center::get();
127 $notification_center->add_notification( $this->get_notification() );
128 }
129
130 /**
131 * Removes a notification to the notification center.
132 *
133 * @return void
134 */
135 protected function remove_notification() {
136 $notification_center = Yoast_Notification_Center::get();
137 $notification_center->remove_notification( $this->get_notification() );
138 }
139
140 /**
141 * Returns a premium upsell section if using the free plugin.
142 *
143 * @return string
144 */
145 protected function get_premium_upsell_section() {
146 if ( ! YoastSEO()->helpers->product->is_premium() ) {
147 return sprintf(
148 /* translators: %1$s expands anchor to premium plugin page, %2$s expands to </a> */
149 __( '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' ),
150 "<a href='" . WPSEO_Shortlinker::get( 'https://yoa.st/premium-notification' ) . "'>",
151 '</a>'
152 );
153 }
154
155 return '';
156 }
157
158 /**
159 * Gets the notification value.
160 *
161 * @return Yoast_Notification
162 */
163 protected function get_notification() {
164 $message = sprintf(
165 /* 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. */
166 __( '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' ),
167 'Yoast SEO',
168 '<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/rate-yoast-seo' ) . '">',
169 '</a>'
170 ) . "\n\n";
171
172 $message .= sprintf(
173 /* translators: %1$s is a link start tag to the bugreport guidelines on the Yoast help center, %2$s is the link closing tag. */
174 __( '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' ),
175 '<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/bugreport' ) . '">',
176 '</a>'
177 ) . "\n\n";
178
179 $message .= $this->get_premium_upsell_section() . "\n\n";
180
181 $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>';
182
183 $notification = new Yoast_Notification(
184 $message,
185 [
186 'type' => Yoast_Notification::WARNING,
187 'id' => 'wpseo-upsell-notice',
188 'capabilities' => 'wpseo_manage_options',
189 'priority' => 0.8,
190 ]
191 );
192
193 return $notification;
194 }
195
196 /**
197 * Dismisses the notice.
198 *
199 * @return bool
200 */
201 protected function is_notice_dismissed() {
202 return get_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true ) === '1';
203 }
204
205 /**
206 * Dismisses the notice.
207 *
208 * @return void
209 */
210 protected function dismiss_notice() {
211 update_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true );
212 }
213
214 /**
215 * Returns the set options.
216 *
217 * @return mixed
218 */
219 protected function get_options() {
220 return get_option( self::OPTION_NAME );
221 }
222
223 /**
224 * Saves the options to the database.
225 *
226 * @return void
227 */
228 protected function save_options() {
229 update_option( self::OPTION_NAME, $this->options );
230 }
231 }
232