PluginProbe ʕ •ᴥ•ʔ
Yoast SEO – Advanced SEO with real-time guidance and built-in AI / 21.2
Yoast SEO – Advanced SEO with real-time guidance and built-in AI v21.2
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 3 years ago capabilities 3 years ago endpoints 5 years ago exceptions 7 years ago filters 3 years ago formatter 2 years ago google_search_console 3 years ago import 3 years ago listeners 8 years ago menu 3 years ago metabox 2 years ago notifiers 3 years ago pages 3 years ago roles 3 years ago services 5 years ago statistics 5 years ago taxonomy 2 years ago tracking 2 years ago views 2 years ago watchers 2 years ago admin-settings-changed-listener.php 5 years ago ajax.php 3 years ago class-admin-asset-analysis-worker-location.php 5 years ago class-admin-asset-dev-server-location.php 3 years ago class-admin-asset-location.php 8 years ago class-admin-asset-manager.php 2 years ago class-admin-asset-seo-location.php 4 years ago class-admin-asset-yoast-components-l10n.php 4 years ago class-admin-editor-specific-replace-vars.php 5 years ago class-admin-gutenberg-compatibility-notification.php 5 years ago class-admin-help-panel.php 5 years ago class-admin-init.php 3 years ago class-admin-recommended-replace-vars.php 3 years ago class-admin-user-profile.php 3 years ago class-admin-utils.php 5 years ago class-admin.php 3 years ago class-asset.php 5 years ago class-bulk-description-editor-list-table.php 5 years ago class-bulk-editor-list-table.php 3 years ago class-bulk-title-editor-list-table.php 6 years ago class-collector.php 6 years ago class-config.php 2 years ago class-customizer.php 5 years ago class-database-proxy.php 3 years ago class-export.php 3 years ago class-expose-shortlinks.php 2 years ago class-gutenberg-compatibility.php 2 years ago class-meta-columns.php 3 years ago class-my-yoast-proxy.php 3 years ago class-option-tab.php 4 years ago class-option-tabs-formatter.php 4 years ago class-option-tabs.php 3 years ago class-paper-presenter.php 5 years ago class-plugin-availability.php 5 years ago class-plugin-conflict.php 3 years ago class-premium-popup.php 5 years ago class-premium-upsell-admin-block.php 2 years ago class-primary-term-admin.php 3 years ago class-product-upsell-notice.php 3 years ago class-remote-request.php 5 years ago class-schema-person-upgrade-notification.php 3 years ago class-suggested-plugins.php 3 years ago class-wincher-dashboard-widget.php 3 years ago class-yoast-columns.php 3 years ago class-yoast-dashboard-widget.php 3 years ago class-yoast-form.php 3 years ago class-yoast-input-validation.php 4 years ago class-yoast-network-admin.php 3 years ago class-yoast-network-settings-api.php 4 years ago class-yoast-notification-center.php 3 years ago class-yoast-notification.php 3 years ago class-yoast-notifications.php 3 years ago class-yoast-plugin-conflict.php 3 years ago index.php 10 years ago interface-collection.php 7 years ago interface-installable.php 8 years ago
class-product-upsell-notice.php
216 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 const USER_META_DISMISSED = 'wpseo-remove-upsell-notice';
21
22 /**
23 * Holds the option name.
24 *
25 * @var string
26 */
27 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 public function initialize() {
47 $this->remove_notification();
48 }
49
50 /**
51 * Sets the upgrade notice.
52 */
53 public function set_upgrade_notice() {
54
55 if ( $this->has_first_activated_on() ) {
56 return;
57 }
58
59 $this->set_first_activated_on();
60 $this->add_notification();
61 }
62
63 /**
64 * Listener for the upsell notice.
65 */
66 public function dismiss_notice_listener() {
67 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are validating a nonce here.
68 if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'dismiss-5star-upsell' ) ) {
69 return;
70 }
71
72 $dismiss_upsell = isset( $_GET['yoast_dismiss'] ) && is_string( $_GET['yoast_dismiss'] ) ? sanitize_text_field( wp_unslash( $_GET['yoast_dismiss'] ) ) : '';
73
74 if ( $dismiss_upsell !== 'upsell' ) {
75 return;
76 }
77
78 $this->dismiss_notice();
79
80 if ( wp_safe_redirect( admin_url( 'admin.php?page=wpseo_dashboard' ) ) ) {
81 exit;
82 }
83 }
84
85 /**
86 * When the notice should be shown.
87 *
88 * @return bool
89 */
90 protected function should_add_notification() {
91 return ( $this->options['first_activated_on'] < strtotime( '-2weeks' ) );
92 }
93
94 /**
95 * Checks if the options has a first activated on date value.
96 *
97 * @return bool
98 */
99 protected function has_first_activated_on() {
100 return $this->options['first_activated_on'] !== false;
101 }
102
103 /**
104 * Sets the first activated on.
105 */
106 protected function set_first_activated_on() {
107 $this->options['first_activated_on'] = strtotime( '-2weeks' );
108
109 $this->save_options();
110 }
111
112 /**
113 * Adds a notification to the notification center.
114 */
115 protected function add_notification() {
116 $notification_center = Yoast_Notification_Center::get();
117 $notification_center->add_notification( $this->get_notification() );
118 }
119
120 /**
121 * Removes a notification to the notification center.
122 */
123 protected function remove_notification() {
124 $notification_center = Yoast_Notification_Center::get();
125 $notification_center->remove_notification( $this->get_notification() );
126 }
127
128 /**
129 * Returns a premium upsell section if using the free plugin.
130 *
131 * @return string
132 */
133 protected function get_premium_upsell_section() {
134 if ( ! YoastSEO()->helpers->product->is_premium() ) {
135 return sprintf(
136 /* translators: %1$s expands anchor to premium plugin page, %2$s expands to </a> */
137 __( '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' ),
138 "<a href='" . WPSEO_Shortlinker::get( 'https://yoa.st/premium-notification' ) . "'>",
139 '</a>'
140 );
141 }
142
143 return '';
144 }
145
146 /**
147 * Gets the notification value.
148 *
149 * @return Yoast_Notification
150 */
151 protected function get_notification() {
152 $message = sprintf(
153 /* 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. */
154 __( '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' ),
155 'Yoast SEO',
156 '<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/rate-yoast-seo' ) . '">',
157 '</a>'
158 ) . "\n\n";
159
160 $message .= sprintf(
161 /* translators: %1$s is a link start tag to the bugreport guidelines on the Yoast help center, %2$s is the link closing tag. */
162 __( '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' ),
163 '<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/bugreport' ) . '">',
164 '</a>'
165 ) . "\n\n";
166
167 $message .= $this->get_premium_upsell_section() . "\n\n";
168
169 $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>';
170
171 $notification = new Yoast_Notification(
172 $message,
173 [
174 'type' => Yoast_Notification::WARNING,
175 'id' => 'wpseo-upsell-notice',
176 'capabilities' => 'wpseo_manage_options',
177 'priority' => 0.8,
178 ]
179 );
180
181 return $notification;
182 }
183
184 /**
185 * Dismisses the notice.
186 *
187 * @return bool
188 */
189 protected function is_notice_dismissed() {
190 return get_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true ) === '1';
191 }
192
193 /**
194 * Dismisses the notice.
195 */
196 protected function dismiss_notice() {
197 update_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true );
198 }
199
200 /**
201 * Returns the set options.
202 *
203 * @return mixed
204 */
205 protected function get_options() {
206 return get_option( self::OPTION_NAME );
207 }
208
209 /**
210 * Saves the options to the database.
211 */
212 protected function save_options() {
213 update_option( self::OPTION_NAME, $this->options );
214 }
215 }
216