Yoast SEO - Version 7.8

Version Description

Download this release

Release Info

Developer Yoast
Plugin Icon 128x128 Yoast SEO
Version 7.8
Comparing to
See all releases

Code changes from version 7.7.3 to 7.8

Files changed (85) hide show
  1. admin/banner/class-admin-banner-renderer.php +0 -50
  2. admin/banner/class-admin-banner-sidebar-renderer.php +0 -62
  3. admin/banner/class-admin-banner-sidebar.php +0 -358
  4. admin/banner/class-admin-banner-spot-renderer.php +0 -39
  5. admin/banner/class-admin-banner-spot.php +0 -120
  6. admin/banner/class-admin-banner.php +0 -89
  7. admin/class-add-keyword-modal.php +2 -2
  8. admin/class-admin.php +0 -1
  9. admin/class-keyword-synonyms-modal.php +61 -0
  10. admin/class-premium-benefits-for-synonyms-list.php +54 -0
  11. admin/class-yoast-form.php +1 -11
  12. admin/class-yoast-notification-center.php +11 -1
  13. admin/config-ui/components/class-component-suggestions.php +14 -6
  14. admin/metabox/class-metabox-keyword-synonyms-button.php +50 -0
  15. admin/metabox/class-metabox.php +5 -0
  16. admin/views/sidebar.php +125 -0
  17. admin/watchers/class-slug-change-watcher.php +59 -2
  18. css/dist/{admin-global-773-rtl.min.css → admin-global-780-rtl.min.css} +0 -0
  19. css/dist/{admin-global-773.min.css → admin-global-780.min.css} +0 -0
  20. css/dist/{adminbar-773-rtl.min.css → adminbar-780-rtl.min.css} +0 -0
  21. css/dist/{adminbar-773.min.css → adminbar-780.min.css} +0 -0
  22. css/dist/{alerts-773-rtl.min.css → alerts-780-rtl.min.css} +0 -0
  23. css/dist/{alerts-773.min.css → alerts-780.min.css} +0 -0
  24. css/dist/{dashboard-773-rtl.min.css → dashboard-780-rtl.min.css} +0 -0
  25. css/dist/{dashboard-773.min.css → dashboard-780.min.css} +0 -0
  26. css/dist/{edit-page-773-rtl.min.css → edit-page-780-rtl.min.css} +0 -0
  27. css/dist/{edit-page-773.min.css → edit-page-780.min.css} +0 -0
  28. css/dist/{featured-image-773-rtl.min.css → featured-image-780-rtl.min.css} +0 -0
  29. css/dist/{featured-image-773.min.css → featured-image-780.min.css} +0 -0
  30. css/dist/{filter-explanation-773-rtl.min.css → filter-explanation-780-rtl.min.css} +0 -0
  31. css/dist/{filter-explanation-773.min.css → filter-explanation-780.min.css} +0 -0
  32. css/dist/{inside-editor-773-rtl.min.css → inside-editor-780-rtl.min.css} +0 -0
  33. css/dist/{inside-editor-773.min.css → inside-editor-780.min.css} +0 -0
  34. css/dist/{metabox-773-rtl.min.css → metabox-780-rtl.min.css} +1 -1
  35. css/dist/{metabox-773.min.css → metabox-780.min.css} +1 -1
  36. css/dist/{metabox-primary-category-773-rtl.min.css → metabox-primary-category-780-rtl.min.css} +0 -0
  37. css/dist/{metabox-primary-category-773.min.css → metabox-primary-category-780.min.css} +0 -0
  38. css/dist/{search-appearance-773-rtl.min.css → search-appearance-780-rtl.min.css} +0 -0
  39. css/dist/{search-appearance-773.min.css → search-appearance-780.min.css} +0 -0
  40. css/dist/{snippet-773-rtl.min.css → snippet-780-rtl.min.css} +0 -0
  41. css/dist/{snippet-773.min.css → snippet-780.min.css} +0 -0
  42. css/dist/{toggle-switch-773-rtl.min.css → toggle-switch-780-rtl.min.css} +0 -0
  43. css/dist/{toggle-switch-773.min.css → toggle-switch-780.min.css} +0 -0
  44. css/dist/{wpseo-dismissible-773-rtl.min.css → wpseo-dismissible-780-rtl.min.css} +0 -0
  45. css/dist/{wpseo-dismissible-773.min.css → wpseo-dismissible-780.min.css} +0 -0
  46. css/dist/{yoast-components-773-rtl.min.css → yoast-components-780-rtl.min.css} +0 -0
  47. css/dist/{yoast-components-773.min.css → yoast-components-780.min.css} +0 -0
  48. css/dist/{yoast-extensions-773-rtl.min.css → yoast-extensions-780-rtl.min.css} +0 -0
  49. css/dist/{yoast-extensions-773.min.css → yoast-extensions-780.min.css} +0 -0
  50. css/dist/{yst_plugin_tools-773-rtl.min.css → yst_plugin_tools-780-rtl.min.css} +1 -1
  51. css/dist/{yst_plugin_tools-773.min.css → yst_plugin_tools-780.min.css} +1 -1
  52. css/dist/{yst_seo_score-773-rtl.min.css → yst_seo_score-780-rtl.min.css} +0 -0
  53. css/dist/{yst_seo_score-773.min.css → yst_seo_score-780.min.css} +0 -0
  54. frontend/class-breadcrumbs.php +81 -25
  55. frontend/class-frontend-page-type.php +28 -1
  56. frontend/class-frontend.php +25 -12
  57. frontend/class-opengraph-image.php +43 -6
  58. frontend/class-twitter.php +12 -2
  59. images/BasicSEO.svg +1 -0
  60. images/Local_SEO_Icon.svg +1 -0
  61. images/News_SEO_Icon.svg +1 -0
  62. images/SEO_for_beginners.svg +1 -0
  63. images/Video_SEO_Icon.svg +1 -0
  64. images/Woo_SEO_Icon.svg +1 -0
  65. images/banner/basic-seo-training.png +0 -0
  66. images/banner/configuration-service.png +0 -0
  67. images/banner/keyword-research-training.png +0 -0
  68. images/banner/local-seo-for-woocommerce.png +0 -0
  69. images/banner/local-seo.png +0 -0
  70. images/banner/news-seo.png +0 -0
  71. images/banner/premium-seo.png +0 -0
  72. images/banner/seo-care.png +0 -0
  73. images/banner/seo-copywriting-training.png +0 -0
  74. images/banner/seo-for-beginners-training.png +0 -0
  75. images/banner/site-structure-training.png +0 -0
  76. images/banner/structured-data-course.png +0 -0
  77. images/banner/technical-seo-training.png +0 -0
  78. images/banner/video-seo.png +0 -0
  79. images/banner/website-review.png +0 -0
  80. images/banner/woocommerce-seo.png +0 -0
  81. images/banner/yoast-seo-for-wordpress-training-2018.png +0 -0
  82. inc/class-upgrade.php +18 -1
  83. inc/class-wpseo-replace-vars.php +76 -5
  84. js/dist/{commons-773.min.js → commons-780.min.js} +7 -7
  85. js/dist/configuration-wizard-773.min.js +0 -12
admin/banner/class-admin-banner-renderer.php DELETED
@@ -1,50 +0,0 @@
1
- <?php
2
- /**
3
- * WPSEO plugin file.
4
- *
5
- * @package WPSEO\Admin\Banner
6
- */
7
-
8
- /**
9
- * Represents the render object for generating the html for the given banner.
10
- */
11
- class WPSEO_Admin_Banner_Renderer {
12
-
13
- /** @var string */
14
- protected $base_path = '';
15
-
16
- /**
17
- * Renders the admin banner.
18
- *
19
- * @param WPSEO_Admin_Banner $banner The banner to render.
20
- *
21
- * @return string
22
- */
23
- public function render( WPSEO_Admin_Banner $banner ) {
24
- $output = '<a class="wpseo-banner__link" target="_blank" href="' . esc_url( $banner->get_url() ) . '">';
25
- $output .= '<img class="wpseo-banner__image" width="' . esc_attr( $banner->get_width() ) . '" height="' . esc_attr( $banner->get_height() ) . '" src="' . esc_attr( $this->get_image_path( $banner->get_image() ) ) . '" alt="' . esc_attr( $banner->get_alt() ) . '"/>';
26
- $output .= '</a>';
27
-
28
- return $output;
29
- }
30
-
31
- /**
32
- * Sets the base path, where the images are located.
33
- *
34
- * @param string $base_path The image location.
35
- */
36
- public function set_base_path( $base_path ) {
37
- $this->base_path = $base_path;
38
- }
39
-
40
- /**
41
- * Returns the full path for the image.
42
- *
43
- * @param string $image The image path.
44
- *
45
- * @return string
46
- */
47
- protected function get_image_path( $image ) {
48
- return rtrim( $this->base_path, '/' ) . '/' . ltrim( $image, '/' );
49
- }
50
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/banner/class-admin-banner-sidebar-renderer.php DELETED
@@ -1,62 +0,0 @@
1
- <?php
2
- /**
3
- * WPSEO plugin file.
4
- *
5
- * @package WPSEO\Admin\Banner
6
- */
7
-
8
- /**
9
- * Represents the render object for generating the html for the banner sidebar
10
- */
11
- class WPSEO_Admin_Banner_Sidebar_Renderer {
12
-
13
- /** @var WPSEO_Admin_Banner_Spot_Renderer */
14
- protected $spot_renderer;
15
-
16
- /**
17
- * Sets the spot renderer.
18
- *
19
- * @param WPSEO_Admin_Banner_Spot_Renderer $spot_renderer The spot renderer that has to be used.
20
- */
21
- public function __construct( WPSEO_Admin_Banner_Spot_Renderer $spot_renderer ) {
22
- $this->spot_renderer = $spot_renderer;
23
- }
24
-
25
- /**
26
- * Renders the admin banner sidebar.
27
- *
28
- * @param WPSEO_Admin_Banner_Sidebar $banner_sidebar The sidebar to render.
29
- *
30
- * @return string
31
- */
32
- public function render( WPSEO_Admin_Banner_Sidebar $banner_sidebar ) {
33
- return sprintf( '
34
- <div class="wpseo_content_cell" id="sidebar-container">
35
- <div id="sidebar">
36
- <div class="wpseo_content_cell_title yoast-sidebar__title ">
37
- %1$s
38
- </div>
39
- %2$s
40
- </div>
41
- </div>',
42
- $banner_sidebar->get_title(),
43
- $this->render_banner_spots( $banner_sidebar->get_banner_spots() )
44
- );
45
- }
46
-
47
- /**
48
- * Renders the admin banner spots.
49
- *
50
- * @param WPSEO_Admin_Banner_Spot[] $banner_spots The banner spots to render.
51
- *
52
- * @return string
53
- */
54
- protected function render_banner_spots( array $banner_spots ) {
55
- $return = '';
56
- foreach ( $banner_spots as $banner_spot ) {
57
- $return .= $this->spot_renderer->render( $banner_spot );
58
- }
59
-
60
- return $return;
61
- }
62
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/banner/class-admin-banner-sidebar.php DELETED
@@ -1,358 +0,0 @@
1
- <?php
2
- /**
3
- * WPSEO plugin file.
4
- *
5
- * @package WPSEO\Admin\Banner
6
- */
7
-
8
- /**
9
- * Represents the render object for generating the html for the given banner.
10
- */
11
- class WPSEO_Admin_Banner_Sidebar {
12
-
13
- /** @var string */
14
- protected $title = '';
15
-
16
- /** @var WPSEO_Admin_Banner_Spot[] */
17
- protected $banner_spots = array();
18
-
19
- /** @var WPSEO_Admin_Banner_Renderer */
20
- protected $banner_renderer;
21
-
22
- /**
23
- * WPSEO_Admin_Banner_Sidebar constructor.
24
- *
25
- * @param string $title The title for the sidebar.
26
- * @param WPSEO_Admin_Banner_Renderer $banner_renderer The render class for banners.
27
- */
28
- public function __construct( $title, WPSEO_Admin_Banner_Renderer $banner_renderer ) {
29
- $this->title = $title;
30
- $this->banner_renderer = $banner_renderer;
31
- }
32
-
33
- /**
34
- * Returns the set title.
35
- *
36
- * @return string
37
- */
38
- public function get_title() {
39
- return $this->title;
40
- }
41
-
42
- /**
43
- * Initializes the banner sidebar by setting its banner spots.
44
- *
45
- * @param WPSEO_Features $features Class regarding WPSEO Features.
46
- */
47
- public function initialize( WPSEO_Features $features ) {
48
- if ( $features->is_free() ) {
49
- $this->add_banner_spot( $this->get_premium_spot() );
50
- }
51
-
52
- $this->add_banner_spot( $this->get_services_spot() );
53
-
54
- $extensions_spot = $this->get_extensions_spot( $this->get_active_extensions() );
55
- if ( $extensions_spot->has_banners() ) {
56
- $this->add_banner_spot( $extensions_spot );
57
- }
58
-
59
- $this->add_banner_spot( $this->get_courses_spot() );
60
- $this->add_banner_spot( $this->get_remove_banner_spot() );
61
- }
62
-
63
- /**
64
- * Returns array with bannerspots.
65
- *
66
- * @return WPSEO_Admin_Banner_Spot[]
67
- */
68
- public function get_banner_spots() {
69
- return $this->banner_spots;
70
- }
71
-
72
- /**
73
- * Adds a banner spot.
74
- *
75
- * @param WPSEO_Admin_Banner_Spot $spot The spot to add.
76
- */
77
- protected function add_banner_spot( WPSEO_Admin_Banner_Spot $spot ) {
78
- $this->banner_spots[] = $spot;
79
- }
80
-
81
- /**
82
- * Returns the premium banner spot.
83
- *
84
- * @return WPSEO_Admin_Banner_Spot
85
- */
86
- protected function get_premium_spot() {
87
- $premium_spot = new WPSEO_Admin_Banner_Spot( '', $this->banner_renderer );
88
-
89
- $premium_uri = WPSEO_Shortlinker::get( 'https://yoa.st/jj' );
90
-
91
- $premium_spot->set_extra(
92
- /* translators: %1$s expands to the plugin name */
93
- '<h2>' . sprintf( esc_html__( 'Upgrade to %1$s', 'wordpress-seo' ), 'Yoast SEO Premium' ) . '</h2>' .
94
- '<ul>' .
95
- '<li><strong>' . esc_html__( 'Rank for up to 5 focus keywords per page', 'wordpress-seo' ) . '</strong></li>' .
96
- '<li><strong>' . esc_html__( 'Preview your page in Facebook and Twitter', 'wordpress-seo' ) . '</strong></li>' .
97
- '<li><strong>' . esc_html__( 'Get real-time suggestions for internal links', 'wordpress-seo' ) . '</strong></li>' .
98
- '<li><strong>' . esc_html__( 'No more dead links a.k.a. 404 pages', 'wordpress-seo' ) . '</strong></li>' .
99
- '<li><strong>' . esc_html__( '24/7 email support', 'wordpress-seo' ) . '</strong></li>' .
100
- '<li><strong>' . esc_html__( 'No ads', 'wordpress-seo' ) . '</strong></li>' .
101
- '</ul>' .
102
- /* translators: %s expands to Yoast SEO Premium */
103
- '<a id="wpseo-premium-button" class="button button-primary" href="' . $premium_uri . '" target="_blank">' . sprintf( __( 'Get %s now', 'wordpress-seo' ), 'Yoast SEO Premium' ) . '</a><br/>'
104
- );
105
-
106
- return $premium_spot;
107
- }
108
-
109
- /**
110
- * Returns the services banner spot.
111
- *
112
- * @return WPSEO_Admin_Banner_Spot
113
- */
114
- protected function get_services_spot() {
115
- $service_spot = new WPSEO_Admin_Banner_Spot( __( 'Services', 'wordpress-seo' ), $this->banner_renderer );
116
-
117
- $service_spot->set_description(
118
- sprintf(
119
- /* translators: %1$s expands to a link start tag to the Yoast Services page, %2$s to Yoast, %3$s is the link closing tag. */
120
- __( 'Do you want to know how to improve your rankings? %1$sLet team %2$s help you!%3$s', 'wordpress-seo' ),
121
- '<a target="_blank" href="' . WPSEO_Shortlinker::get( 'https://yoa.st/jk' ) . '">',
122
- 'Yoast',
123
- '</a>'
124
- )
125
- );
126
-
127
- $service_spot->add_banner(
128
- new WPSEO_Admin_Banner(
129
- WPSEO_Shortlinker::get( 'https://yoa.st/jm' ),
130
- 'configuration-service.png',
131
- 261,
132
- 152,
133
- sprintf(
134
- /* translators: %1$s expands to Yoast SEO Premium. */
135
- __( 'Let our experts set up your %1$s plugin!', 'wordpress-seo' ),
136
- 'Yoast SEO Premium'
137
- )
138
- )
139
- );
140
-
141
- return $service_spot;
142
- }
143
-
144
- /**
145
- * Returns an array with the Yoast SEO extensions with the value true when they are active.
146
- *
147
- * @return array
148
- */
149
- protected function get_active_extensions() {
150
- return array(
151
- 'video' => class_exists( 'wpseo_Video_Sitemap' ),
152
- 'woocommerce' => class_exists( 'Woocommerce' ) && class_exists( 'Yoast_WooCommerce_SEO' ),
153
- 'news' => class_exists( 'WPSEO_News' ),
154
- 'local' => defined( 'WPSEO_LOCAL_VERSION' ),
155
- );
156
- }
157
-
158
- /**
159
- * Returns the extensions banner spot.
160
- *
161
- * @param array $active_extensions The active extensions.
162
- *
163
- * @return WPSEO_Admin_Banner_Spot
164
- */
165
- protected function get_extensions_spot( array $active_extensions ) {
166
- $extension_spot = new WPSEO_Admin_Banner_Spot( __( 'Extensions', 'wordpress-seo' ), $this->banner_renderer );
167
-
168
- $extension_spot->set_description(
169
- sprintf(
170
- /* translators: %1$s expands to a link start tag to the Yoast plugin page, %2$s is the link closing tag. */
171
- __( 'Take your SEO to the next level and outrank your competition with our %1$sSEO plugins%2$s.', 'wordpress-seo' ),
172
- '<a target="_blank" href="' . WPSEO_Shortlinker::get( 'https://yoa.st/jn' ) . '">',
173
- '</a>'
174
- )
175
- );
176
-
177
- if ( empty( $active_extensions['video'] ) ) {
178
- $extension_spot->add_banner(
179
- new WPSEO_Admin_Banner(
180
- WPSEO_Shortlinker::get( 'https://yoa.st/jo' ),
181
- 'video-seo.png',
182
- 261,
183
- 152,
184
- sprintf(
185
- /* translators: %1$s expands to Yoast Video SEO. */
186
- __( 'Buy the %1$s plugin now and optimize your videos for video search results and social media!', 'wordpress-seo' ),
187
- 'Yoast Video SEO'
188
- )
189
- )
190
- );
191
- }
192
-
193
- if ( empty( $active_extensions['woocommerce'] ) ) {
194
- $extension_spot->add_banner(
195
- new WPSEO_Admin_Banner(
196
- WPSEO_Shortlinker::get( 'https://yoa.st/jp' ),
197
- 'woocommerce-seo.png',
198
- 261,
199
- 152,
200
- sprintf(
201
- /* translators: %1$s expands to Yoast WooCommerce SEO. */
202
- __( 'Buy the %1$s plugin now and optimize your shop today to improve your product promotion!', 'wordpress-seo' ),
203
- 'Yoast WooCommerce SEO'
204
- )
205
- )
206
- );
207
- }
208
-
209
- if ( empty( $active_extensions['local'] ) ) {
210
- $extension_spot->add_banner(
211
- new WPSEO_Admin_Banner(
212
- WPSEO_Shortlinker::get( 'https://yoa.st/jq' ),
213
- 'local-seo.png', 261,
214
- 152,
215
- sprintf(
216
- /* translators: %1$s expands to Yoast Local SEO. */
217
- __( 'Buy the %1$s plugin now to improve your site&#8217;s Local SEO and ranking in Google Maps!', 'wordpress-seo' ),
218
- 'Yoast Local SEO'
219
- )
220
- )
221
- );
222
- }
223
-
224
- if ( empty( $active_extensions['news'] ) ) {
225
- $extension_spot->add_banner(
226
- new WPSEO_Admin_Banner(
227
- WPSEO_Shortlinker::get( 'https://yoa.st/jr' ),
228
- 'news-seo.png',
229
- 261,
230
- 152,
231
- sprintf(
232
- /* translators: %1$s expands to Yoast News SEO. */
233
- __( 'Buy the %1$s plugin now and start optimizing to get your site featured in Google News!', 'wordpress-seo' ),
234
- 'Yoast News SEO'
235
- )
236
- )
237
- );
238
- }
239
-
240
- return $extension_spot;
241
- }
242
-
243
- /**
244
- * Returns the courses banner spot.
245
- *
246
- * @return WPSEO_Admin_Banner_Spot
247
- */
248
- protected function get_courses_spot() {
249
- $courses_spot = new WPSEO_Admin_Banner_Spot( __( 'Improve your SEO skills', 'wordpress-seo' ), $this->banner_renderer );
250
-
251
- $courses_spot->set_description(
252
- sprintf(
253
- /* translators: %1$s expands to a link start tag to the Yoast Services page, %2$s is the link closing tag. */
254
- __( 'We believe SEO should be for everyone. That’s why we develop courses on any topic related to SEO. %1$sDiscover our online SEO courses &raquo;%2$s', 'wordpress-seo' ),
255
- '<a target="_blank" href="' . WPSEO_Shortlinker::get( 'https://yoa.st/jt' ) . '">',
256
- '</a>'
257
- )
258
- );
259
-
260
- $courses_spot->add_banner(
261
- new WPSEO_Admin_Banner(
262
- WPSEO_Shortlinker::get( 'https://yoa.st/ju' ),
263
- 'basic-seo-training.png',
264
- 261,
265
- 152,
266
- __( 'Take the online Basic SEO Training course and learn the fundamentals of SEO!', 'wordpress-seo' )
267
- )
268
- );
269
-
270
- $courses_spot->add_banner(
271
- new WPSEO_Admin_Banner(
272
- WPSEO_Shortlinker::get( 'https://yoa.st/jv' ),
273
- 'yoast-seo-for-wordpress-training-2018.png',
274
- 261,
275
- 152,
276
- sprintf(
277
- /* translators: %1$s expands to Yoast SEO for WordPress Training, %2$s to Yoast SEO for WordPress. */
278
- __( 'Take the %1$s course and become a certified %2$s expert!', 'wordpress-seo' ),
279
- 'Yoast SEO for WordPress Training',
280
- 'Yoast SEO for WordPress'
281
- )
282
- )
283
- );
284
-
285
- $courses_spot->add_banner(
286
- new WPSEO_Admin_Banner(
287
- WPSEO_Shortlinker::get( 'https://yoa.st/jw' ),
288
- 'seo-copywriting-training.png',
289
- 261,
290
- 152,
291
- __( 'Take the online SEO Copywriting Training course and learn how to write awesome copy that ranks!', 'wordpress-seo' )
292
- )
293
- );
294
-
295
- $courses_spot->add_banner(
296
- new WPSEO_Admin_Banner(
297
- WPSEO_Shortlinker::get( 'https://yoa.st/qy' ),
298
- 'site-structure-training.png',
299
- 261,
300
- 152,
301
- __( 'Take the online Site Structure Training course and learn how to structure your website!', 'wordpress-seo' )
302
- )
303
- );
304
-
305
- $courses_spot->add_banner(
306
- new WPSEO_Admin_Banner(
307
- WPSEO_Shortlinker::get( 'https://yoa.st/jaa' ),
308
- 'technical-seo-training.png',
309
- 261,
310
- 152,
311
- __( 'Take the online Technical SEO Training course and learn essential technical SEO-concepts!', 'wordpress-seo' )
312
- )
313
- );
314
-
315
- $courses_spot->add_banner(
316
- new WPSEO_Admin_Banner(
317
- WPSEO_Shortlinker::get( 'https://yoa.st/15h' ),
318
- 'structured-data-course.png',
319
- 261,
320
- 152,
321
- __( 'Take the online Structured Data Training course and learn how to create rich snippets!', 'wordpress-seo' )
322
- )
323
- );
324
-
325
- $courses_spot->add_banner(
326
- new WPSEO_Admin_Banner(
327
- WPSEO_Shortlinker::get( 'https://yoa.st/2oi' ),
328
- 'seo-for-beginners-training.png',
329
- 261,
330
- 152,
331
- __( 'Get the FREE SEO for beginners training course and learn the SEO basics to make your site rank higher.', 'wordpress-seo' )
332
- )
333
- );
334
-
335
- return $courses_spot;
336
- }
337
-
338
- /**
339
- * Returns the remove banner spot.
340
- *
341
- * @return WPSEO_Admin_Banner_Spot
342
- */
343
- protected function get_remove_banner_spot() {
344
-
345
- $remove_banner_spot = new WPSEO_Admin_Banner_Spot(
346
- __( 'Remove these ads?', 'wordpress-seo' )
347
- );
348
-
349
- $remove_banner_spot->set_description(
350
- '<a target="_blank" href="' . WPSEO_Shortlinker::get( 'https://yoa.st/jy' ) . '">' .
351
- /* translators: %1$s expands to Yoast SEO Premium */
352
- sprintf( __( 'Upgrade to %1$s &raquo;', 'wordpress-seo' ), 'Yoast SEO Premium' ) .
353
- '</a>'
354
- );
355
-
356
- return $remove_banner_spot;
357
- }
358
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/banner/class-admin-banner-spot-renderer.php DELETED
@@ -1,39 +0,0 @@
1
- <?php
2
- /**
3
- * WPSEO plugin file.
4
- *
5
- * @package WPSEO\Admin\Banner
6
- */
7
-
8
- /**
9
- * Represents the render object for generating the html for the given banner spot.
10
- */
11
- class WPSEO_Admin_Banner_Spot_Renderer {
12
-
13
- /**
14
- * Renders the admin banner spot.
15
- *
16
- * @param WPSEO_Admin_Banner_Spot $banner_spot The spot to render.
17
- *
18
- * @return string
19
- */
20
- public function render( WPSEO_Admin_Banner_Spot $banner_spot ) {
21
- $output = '<div class="yoast-sidebar__spot">';
22
- if ( $banner_spot->get_title() !== '' ) {
23
- $output .= '<strong>' . $banner_spot->get_title() . '</strong>';
24
- }
25
-
26
- if ( $banner_spot->get_extra() !== '' ) {
27
- $output .= $banner_spot->get_extra();
28
- }
29
-
30
- if ( $banner_spot->get_description() !== '' ) {
31
- $output .= '<p>' . $banner_spot->get_description() . '</p>';
32
- }
33
-
34
- $output .= $banner_spot->render_banner();
35
- $output .= '</div>';
36
-
37
- return $output;
38
- }
39
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/banner/class-admin-banner-spot.php DELETED
@@ -1,120 +0,0 @@
1
- <?php
2
- /**
3
- * WPSEO plugin file.
4
- *
5
- * @package WPSEO\Admin\Banner
6
- */
7
-
8
- /**
9
- * Represents the an admin banner spot.
10
- */
11
- class WPSEO_Admin_Banner_Spot {
12
-
13
- /** @var string */
14
- private $title;
15
-
16
- /** @var string */
17
- private $description = '';
18
-
19
- /** @var string */
20
- private $extra = '';
21
-
22
- /** @var WPSEO_Admin_Banner[] */
23
- private $banners = array();
24
-
25
- /**
26
- * WPSEO_Admin_Banner_Spot constructor.
27
- *
28
- * @param string $title The title for the spot.
29
- * @param WPSEO_Admin_Banner_Renderer $banner_renderer The renderer for the banner.
30
- */
31
- public function __construct( $title, WPSEO_Admin_Banner_Renderer $banner_renderer = null ) {
32
- $this->title = $title;
33
- $this->banner_renderer = ( is_null( $banner_renderer ) ? new WPSEO_Admin_Banner_Renderer() : $banner_renderer );
34
- }
35
-
36
- /**
37
- * Returns the title.
38
- *
39
- * @return string
40
- */
41
- public function get_title() {
42
- return $this->title;
43
- }
44
-
45
- /**
46
- * Returns the description.
47
- *
48
- * @return string
49
- */
50
- public function get_description() {
51
- return $this->description;
52
- }
53
-
54
- /**
55
- * Returns the extra content.
56
- *
57
- * @return string
58
- */
59
- public function get_extra() {
60
- return $this->extra;
61
- }
62
-
63
- /**
64
- * Sets the description
65
- *
66
- * @param string $description The description.
67
- */
68
- public function set_description( $description ) {
69
- $this->description = $description;
70
- }
71
-
72
- /**
73
- * Sets the "extra"
74
- *
75
- * @param string $extra The "extra".
76
- */
77
- public function set_extra( $extra ) {
78
- $this->extra = $extra;
79
- }
80
-
81
- /**
82
- * Adds an admin banner.
83
- *
84
- * @param WPSEO_Admin_Banner $banner The banner to add.
85
- */
86
- public function add_banner( WPSEO_Admin_Banner $banner ) {
87
- $this->banners[] = $banner;
88
- }
89
-
90
- /**
91
- * Renders the banner.
92
- *
93
- * @return string
94
- */
95
- public function render_banner() {
96
- if ( ! $this->has_banners() ) {
97
- return '';
98
- }
99
-
100
- return $this->banner_renderer->render( $this->get_random_banner() );
101
- }
102
-
103
- /**
104
- * Checks if there are any banners set.
105
- *
106
- * @return bool
107
- */
108
- public function has_banners() {
109
- return ! empty( $this->banners );
110
- }
111
-
112
- /**
113
- * Returns a random banner.
114
- *
115
- * @return null|WPSEO_Admin_Banner
116
- */
117
- protected function get_random_banner() {
118
- return $this->banners[ array_rand( $this->banners, 1 ) ];
119
- }
120
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/banner/class-admin-banner.php DELETED
@@ -1,89 +0,0 @@
1
- <?php
2
- /**
3
- * WPSEO plugin file.
4
- *
5
- * @package WPSEO\Admin\Banner
6
- */
7
-
8
- /**
9
- * Represents an admin banner.
10
- */
11
- class WPSEO_Admin_Banner {
12
-
13
- /** @var string */
14
- private $url;
15
-
16
- /** @var string */
17
- private $image;
18
-
19
- /** @var integer */
20
- private $width;
21
-
22
- /** @var integer */
23
- private $height;
24
-
25
- /** @var string */
26
- private $alt;
27
-
28
- /**
29
- * Sets the attributes for this object.
30
- *
31
- * @param string $url The URL where the banner links to.
32
- * @param string $image The image filename.
33
- * @param integer $width The width of the image.
34
- * @param integer $height The height of the image.
35
- * @param string $alt The alt text for the image.
36
- */
37
- public function __construct( $url, $image, $width, $height, $alt = '' ) {
38
- $this->url = $url;
39
- $this->image = $image;
40
- $this->alt = $alt;
41
- $this->width = $width;
42
- $this->height = $height;
43
- }
44
-
45
- /**
46
- * Returns the set url.
47
- *
48
- * @return string
49
- */
50
- public function get_url() {
51
- return $this->url;
52
- }
53
-
54
- /**
55
- * Returns the image.
56
- *
57
- * @return string
58
- */
59
- public function get_image() {
60
- return $this->image;
61
- }
62
-
63
- /**
64
- * Returns the alt-text.
65
- *
66
- * @return string
67
- */
68
- public function get_alt() {
69
- return $this->alt;
70
- }
71
-
72
- /**
73
- * Returns the width.
74
- *
75
- * @return string
76
- */
77
- public function get_width() {
78
- return $this->width;
79
- }
80
-
81
- /**
82
- * Returns the height.
83
- *
84
- * @return string
85
- */
86
- public function get_height() {
87
- return $this->height;
88
- }
89
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/class-add-keyword-modal.php CHANGED
@@ -18,7 +18,7 @@ class WPSEO_Add_Keyword_Modal {
18
  */
19
  public function get_translations() {
20
  return array(
21
- 'title' => __( 'Want to add more than one keyword?', 'wordpress-seo' ),
22
  'intro' => sprintf(
23
  /* translators: %1$s expands to a 'Yoast SEO Premium' text linked to the yoast.com website. */
24
  __( 'Great news: you can, with %1$s!', 'wordpress-seo' ),
@@ -40,7 +40,7 @@ class WPSEO_Add_Keyword_Modal {
40
  }
41
 
42
  /**
43
- * Pass tanslations to JS for the Add Keyword modal component.
44
  *
45
  * @return array Translated text strings for the Add Keyword modal component.
46
  */
18
  */
19
  public function get_translations() {
20
  return array(
21
+ 'title' => __( 'Would you like to add more than one keyword?', 'wordpress-seo' ),
22
  'intro' => sprintf(
23
  /* translators: %1$s expands to a 'Yoast SEO Premium' text linked to the yoast.com website. */
24
  __( 'Great news: you can, with %1$s!', 'wordpress-seo' ),
40
  }
41
 
42
  /**
43
+ * Passes translations to JS for the Add Keyword modal component.
44
  *
45
  * @return array Translated text strings for the Add Keyword modal component.
46
  */
admin/class-admin.php CHANGED
@@ -95,7 +95,6 @@ class WPSEO_Admin {
95
  $integrations[] = new WPSEO_Yoast_Columns();
96
  $integrations[] = new WPSEO_License_Page_Manager();
97
  $integrations[] = new WPSEO_Statistic_Integration();
98
- $integrations[] = new WPSEO_Slug_Change_Watcher();
99
  $integrations[] = new WPSEO_Capability_Manager_Integration( WPSEO_Capability_Manager_Factory::get() );
100
  $integrations[] = new WPSEO_Admin_Media_Purge_Notification();
101
  $integrations = array_merge( $integrations, $this->initialize_seo_links() );
95
  $integrations[] = new WPSEO_Yoast_Columns();
96
  $integrations[] = new WPSEO_License_Page_Manager();
97
  $integrations[] = new WPSEO_Statistic_Integration();
 
98
  $integrations[] = new WPSEO_Capability_Manager_Integration( WPSEO_Capability_Manager_Factory::get() );
99
  $integrations[] = new WPSEO_Admin_Media_Purge_Notification();
100
  $integrations = array_merge( $integrations, $this->initialize_seo_links() );
admin/class-keyword-synonyms-modal.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package WPSEO\Admin
4
+ */
5
+
6
+ /**
7
+ * Class to print out the translatable strings for the Keyword Synonyms modal.
8
+ */
9
+ class WPSEO_Keyword_Synonyms_Modal {
10
+
11
+ /**
12
+ * Returns the translations for the Keyword Synonyms modal.
13
+ *
14
+ * These strings are not escaped because they're meant to be used with React
15
+ * which already takes care of that. If used in PHP, they should be escaped.
16
+ *
17
+ * @return array Translated text strings for the Keyword Synonyms modal.
18
+ */
19
+ public function get_translations() {
20
+ return array(
21
+ 'title' => __( 'Would you like to add keyword synonyms?', 'wordpress-seo' ),
22
+ 'intro' => sprintf(
23
+ /* translators: %1$s expands to a 'Yoast SEO Premium' text linked to the yoast.com website. */
24
+ __( 'Great news: you can, with %1$s!', 'wordpress-seo' ),
25
+ '{{link}}Yoast SEO Premium{{/link}}'
26
+ ),
27
+ 'link' => WPSEO_Shortlinker::get( 'https://yoa.st/pe-premium-page' ),
28
+ 'other' => sprintf(
29
+ /* translators: %s expands to 'Yoast SEO Premium'. */
30
+ __( 'Other benefits of %s for you:', 'wordpress-seo' ), 'Yoast SEO Premium'
31
+ ),
32
+ 'buylink' => WPSEO_Shortlinker::get( 'https://yoa.st/keyword-synonyms-popup' ),
33
+ 'buy' => sprintf(
34
+ /* translators: %s expands to 'Yoast SEO Premium'. */
35
+ __( 'Get %s now!', 'wordpress-seo' ), 'Yoast SEO Premium'
36
+ ),
37
+ 'small' => __( '1 year free updates and upgrades included!', 'wordpress-seo' ),
38
+ 'a11yNotice.opensInNewTab' => __( '(Opens in a new browser tab)', 'wordpress-seo' ),
39
+ );
40
+ }
41
+
42
+ /**
43
+ * Passes translations to JS for the Keyword Synonyms modal component.
44
+ *
45
+ * @return array Translated text strings for the Keyword Synonyms modal component.
46
+ */
47
+ public function get_translations_for_js() {
48
+ $translations = $this->get_translations();
49
+ return array(
50
+ 'locale' => WPSEO_Utils::get_user_locale(),
51
+ 'intl' => $translations,
52
+ );
53
+ }
54
+
55
+ /**
56
+ * Prints the localized Keyword Synonyms modal translations for JS.
57
+ */
58
+ public function enqueue_translations() {
59
+ wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'admin-global-script', 'yoastKeywordSynonymsModalL10n', $this->get_translations_for_js() );
60
+ }
61
+ }
admin/class-premium-benefits-for-synonyms-list.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package WPSEO\Admin
4
+ */
5
+
6
+ /**
7
+ * Class to print out a list of Premium benefits specific for the keyword synonyms.
8
+ */
9
+ class WPSEO_Premium_Benefits_For_Synonyms_List {
10
+
11
+ /**
12
+ * Returns the translations for the Premium benefits list.
13
+ *
14
+ * @return array Translated text strings for the Premium benefits list.
15
+ */
16
+ public function get_translations() {
17
+ return array(
18
+ '<strong>' . __( 'Rank for up to 5 focus keywords per page', 'wordpress-seo' ) . '</strong>',
19
+ sprintf(
20
+ /* translators: %1$s expands to a 'strong' start tag, %2$s to a 'strong' end tag. */
21
+ __( '%1$sNo more dead links%2$s: easy redirect manager', 'wordpress-seo' ),
22
+ '<strong>', '</strong>'
23
+ ),
24
+ '<strong>' . __( 'Superfast internal links suggestions', 'wordpress-seo' ) . '</strong>',
25
+ sprintf(
26
+ /* translators: %1$s expands to a 'strong' start tag, %2$s to a 'strong' end tag. */
27
+ __( '%1$sSocial media preview%2$s: Facebook & Twitter', 'wordpress-seo' ),
28
+ '<strong>', '</strong>'
29
+ ),
30
+ '<strong>' . __( '24/7 support', 'wordpress-seo' ) . '</strong>',
31
+ '<strong>' . __( 'No ads!', 'wordpress-seo' ) . '</strong>',
32
+ );
33
+ }
34
+
35
+ /**
36
+ * Passes translations to JS for the Add Keyword JS component Premium benefits list.
37
+ *
38
+ * @return array Translated text strings for the Premium benefits list component.
39
+ */
40
+ public function get_translations_for_js() {
41
+ $translations = $this->get_translations();
42
+ return array(
43
+ 'locale' => WPSEO_Utils::get_user_locale(),
44
+ 'intl' => $translations,
45
+ );
46
+ }
47
+
48
+ /**
49
+ * Prints the localized Premium benefits translations for JS.
50
+ */
51
+ public function enqueue_translations() {
52
+ wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'admin-global-script', 'yoastPremiumBenefitsForSynonymsL10n', $this->get_translations_for_js() );
53
+ }
54
+ }
admin/class-yoast-form.php CHANGED
@@ -183,17 +183,7 @@ class Yoast_Form {
183
  }
184
  }
185
 
186
- $sidebar_renderer = new WPSEO_Admin_Banner_Sidebar_Renderer( new WPSEO_Admin_Banner_Spot_Renderer() );
187
-
188
- $banner_renderer = new WPSEO_Admin_Banner_Renderer();
189
- $banner_renderer->set_base_path( plugins_url( 'images/banner/', WPSEO_FILE ) );
190
-
191
- /* translators: %1$s expands to "Yoast". */
192
- $sidebar = new WPSEO_Admin_Banner_Sidebar( sprintf( __( '%1s recommendations for you', 'wordpress-seo' ), 'Yoast' ), $banner_renderer );
193
- $sidebar->initialize( new WPSEO_Features() );
194
-
195
- echo $sidebar_renderer->render( $sidebar );
196
-
197
  }
198
 
199
  /**
183
  }
184
  }
185
 
186
+ require_once 'views/sidebar.php';
 
 
 
 
 
 
 
 
 
 
187
  }
188
 
189
  /**
admin/class-yoast-notification-center.php CHANGED
@@ -641,7 +641,13 @@ class Yoast_Notification_Center {
641
  */
642
  private function notification_to_array( Yoast_Notification $notification ) {
643
 
644
- return $notification->to_array();
 
 
 
 
 
 
645
  }
646
 
647
  /**
@@ -653,6 +659,10 @@ class Yoast_Notification_Center {
653
  */
654
  private function array_to_notification( $notification_data ) {
655
 
 
 
 
 
656
  return new Yoast_Notification(
657
  $notification_data['message'],
658
  $notification_data['options']
641
  */
642
  private function notification_to_array( Yoast_Notification $notification ) {
643
 
644
+ $notification_data = $notification->to_array();
645
+
646
+ if ( isset( $notification_data['nonce'] ) ) {
647
+ unset( $notification_data['nonce'] );
648
+ }
649
+
650
+ return $notification_data;
651
  }
652
 
653
  /**
659
  */
660
  private function array_to_notification( $notification_data ) {
661
 
662
+ if ( isset( $notification_data['options']['nonce'] ) ) {
663
+ unset( $notification_data['options']['nonce'] );
664
+ }
665
+
666
  return new Yoast_Notification(
667
  $notification_data['message'],
668
  $notification_data['options']
admin/config-ui/components/class-component-suggestions.php CHANGED
@@ -44,15 +44,23 @@ class WPSEO_Config_Component_Suggestions implements WPSEO_Config_Component {
44
  }
45
 
46
  $field->add_suggestion(
47
- __( 'Learn how to write copy that ranks', 'wordpress-seo' ),
48
- /* translators: %1$s resolves to SEO copywriting training */
49
- sprintf( __( 'Do you want to learn how to write content that generates traffic? Check out our %1$s. We will help you to write awesome copy that will rank in the search engines. The %1$s covers all the main steps in SEO copywriting: from keyword research to publishing.', 'wordpress-seo' ), 'SEO copywriting training' ),
 
 
 
 
 
 
 
 
50
  array(
51
- 'label' => 'SEO copywriting training',
52
  'type' => 'link',
53
- 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/configuration-wizard-copywrite-course-link' ),
54
  ),
55
- WPSEO_Shortlinker::get( 'https://yoa.st/video-course-copywriting' )
56
  );
57
 
58
  $field->add_suggestion(
44
  }
45
 
46
  $field->add_suggestion(
47
+ sprintf(
48
+ /* translators: %1$s resolves to Basic SEO training */
49
+ __( 'Learn all about SEO with our %1$s', 'wordpress-seo' ),
50
+ 'Basic SEO training'
51
+ ),
52
+ sprintf(
53
+ /* translators: %1$s resolves to Basic SEO training, 2: Yoast SEO */
54
+ __( 'Do you want to learn how you can improve your SEO yourself? In our %1$s you\'ll learn practical SEO skills from keyword research and copywriting to technical SEO and off-page SEO. Using the %2$s plugin is one thing. Doing good SEO day-to-day is another. You simply won\'t get the results you want without putting in work yourself. The %1$s teaches you how.', 'wordpress-seo' ),
55
+ 'Basic SEO training',
56
+ 'Yoast SEO'
57
+ ),
58
  array(
59
+ 'label' => 'Basic SEO training',
60
  'type' => 'link',
61
+ 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/2up' ),
62
  ),
63
+ WPSEO_Shortlinker::get( 'https://yoa.st/2v0' )
64
  );
65
 
66
  $field->add_suggestion(
admin/metabox/class-metabox-keyword-synonyms-button.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * WPSEO plugin file.
4
+ *
5
+ * @package WPSEO\Admin\Metabox
6
+ */
7
+
8
+ /**
9
+ * Button to show the premium upsell.
10
+ */
11
+ class WPSEO_Metabox_Keyword_Synonyms_Button {
12
+
13
+ /**
14
+ * Returns a button because a link is inappropriate here.
15
+ *
16
+ * @return string
17
+ */
18
+ public function get_link() {
19
+
20
+ $keyword_synonyms_modal_config = array(
21
+ 'mountHook' => '.wpseo-button-keyword-synonyms',
22
+ 'openButtonIcon' => '',
23
+ 'intl' => array(
24
+ 'open' => __( '+ Add synonyms', 'wordpress-seo' ),
25
+ 'modalAriaLabel' => sprintf(
26
+ /* translators: %s expands to 'Yoast SEO Premium'. */
27
+ __( 'Get %s now!', 'wordpress-seo' ), 'Yoast SEO Premium'
28
+ ),
29
+ 'heading' => sprintf(
30
+ /* translators: %s expands to 'Yoast SEO Premium'. */
31
+ __( 'Get %s now!', 'wordpress-seo' ), 'Yoast SEO Premium'
32
+ ),
33
+ ),
34
+ 'classes' => array(
35
+ 'openButton' => 'wpseo-keyword-synonyms button-link',
36
+ ),
37
+ 'content' => 'KeywordSynonyms',
38
+ );
39
+
40
+ $translations = new WPSEO_Keyword_Synonyms_Modal();
41
+ $translations->enqueue_translations();
42
+
43
+ $benefits = new WPSEO_Premium_Benefits_For_Synonyms_List();
44
+ $benefits->enqueue_translations();
45
+
46
+ Yoast_Modal::add( $keyword_synonyms_modal_config );
47
+
48
+ return '<div class="wpseo-button-keyword-synonyms"></div>';
49
+ }
50
+ }
admin/metabox/class-metabox.php CHANGED
@@ -596,6 +596,11 @@ class WPSEO_Metabox extends WPSEO_Meta {
596
  $content .= '<label for="' . $esc_form_key . '" class="screen-reader-text">' . esc_html( $meta_field_def['label'] ) . '</label>';
597
  $content .= '<input type="text"' . $placeholder . ' id="' . $esc_form_key . '" autocomplete="off" name="' . $esc_form_key . '" value="' . esc_attr( $meta_value ) . '" class="large-text' . $class . '"/>';
598
 
 
 
 
 
 
599
  if ( WPSEO_Options::get( 'enable_cornerstone_content', false ) ) {
600
  $cornerstone_field = new WPSEO_Cornerstone_Field();
601
 
596
  $content .= '<label for="' . $esc_form_key . '" class="screen-reader-text">' . esc_html( $meta_field_def['label'] ) . '</label>';
597
  $content .= '<input type="text"' . $placeholder . ' id="' . $esc_form_key . '" autocomplete="off" name="' . $esc_form_key . '" value="' . esc_attr( $meta_value ) . '" class="large-text' . $class . '"/>';
598
 
599
+ if ( WPSEO_UTILS::is_yoast_seo_premium() === false ) {
600
+ $button = new WPSEO_Metabox_Keyword_Synonyms_Button();
601
+ $content .= $button->get_link();
602
+ }
603
+
604
  if ( WPSEO_Options::get( 'enable_cornerstone_content', false ) ) {
605
  $cornerstone_field = new WPSEO_Cornerstone_Field();
606
 
admin/views/sidebar.php ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * View for the banner sidebar.
4
+ *
5
+ * @package WPSEO\Admin\Views
6
+ */
7
+
8
+ $wpseo_plugin_dir_url = plugin_dir_url( WPSEO_FILE );
9
+
10
+ ?>
11
+ <div class="wpseo_content_cell" id="sidebar-container">
12
+ <div id="sidebar">
13
+ <div class="wpseo_content_cell_title yoast-sidebar__title">
14
+ <?php
15
+ /* translators: %1$s expands to Yoast */
16
+ printf( esc_html__( '%1$s recommendations for you', 'wordpress-seo' ), 'Yoast' );
17
+ ?>
18
+ </div>
19
+ <div class="yoast-sidebar_section">
20
+ <h2>
21
+ <?php
22
+ /* translators: %1$s expands to the plugin name */
23
+ printf( esc_html__( 'Upgrade to %1$s', 'wordpress-seo' ), 'Yoast SEO Premium' );
24
+ ?>
25
+ </h2>
26
+ <ul>
27
+ <li><strong><?php esc_html_e( 'Rank for up to 5 focus keywords per page', 'wordpress-seo' ); ?></strong></li>
28
+ <li><strong><?php esc_html_e( 'Preview your page in Facebook and Twitter', 'wordpress-seo' ); ?></strong></li>
29
+ <li><strong><?php esc_html_e( 'Get real-time suggestions for internal links', 'wordpress-seo' ); ?></strong></li>
30
+ <li><strong><?php esc_html_e( 'No more dead links a.k.a. 404 pages', 'wordpress-seo' ); ?></strong></li>
31
+ <li><strong><?php esc_html_e( '24/7 email support', 'wordpress-seo' ); ?></strong></li>
32
+ <li><strong><?php esc_html_e( 'No ads', 'wordpress-seo' ); ?></strong></li>
33
+ </ul>
34
+
35
+ <a id="wpseo-premium-button" class="button button-primary" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jj' ); ?>" target="_blank">
36
+ <?php
37
+ /* translators: %s is replaced by the plugin name */
38
+ printf( esc_html__( 'Get %s now', 'wordpress-seo' ), 'Yoast SEO Premium' );
39
+ ?>
40
+ </a><br>
41
+ </div>
42
+ <div class="yoast-sidebar_section">
43
+ <h2><?php esc_html_e( 'Improve your SEO skills', 'wordpress-seo' ); ?></h2>
44
+ <div>
45
+ <a href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/2oi' ) ?>" target="_blank" rel="noopener noreferrer"><img src="<?php echo esc_url( $wpseo_plugin_dir_url . 'images/SEO_for_beginners.svg' ); ?>" alt=""></a>
46
+ <p>
47
+ <strong>
48
+ <?php
49
+ printf(
50
+ /* translators: %1$s and %2$s convert to anchors. */
51
+ esc_html__( 'Free: %1$sSEO for Beginners course%2$s', 'wordpress-seo' ),
52
+ '<a target="_blank" rel="noopener noreferrer" href="' . esc_url( WPSEO_Shortlinker::get( 'https://yoa.st/2oi' ) ) . '">',
53
+ '</a>'
54
+ );
55
+ ?>
56
+ </strong><br>
57
+ <?php esc_html_e( 'Get quick wins to make your site rank higher in search engines.', 'wordpress-seo' ); ?>
58
+ </p>
59
+ <br class="clear">
60
+ </div>
61
+ <div>
62
+ <a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jv' ); ?>"><img src="<?php echo esc_url( $wpseo_plugin_dir_url . 'images/yoast_seo_for_wp_2.svg' ); ?>" alt=""></a>
63
+ <p>
64
+ <strong><a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jv' ); ?>"><?php esc_html_e( 'Yoast SEO for WordPress course', 'wordpress-seo' ); ?></a></strong><br>
65
+ <?php esc_html_e( 'Don’t waste time figuring out the best settings yourself.', 'wordpress-seo' ); ?>
66
+ </p>
67
+ <br class="clear">
68
+ </div>
69
+ <div>
70
+ <a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/ju' ); ?>"><img src="<?php echo esc_url( $wpseo_plugin_dir_url . 'images/BasicSEO.svg' ); ?>" alt=""></a>
71
+ <p>
72
+ <strong><a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/ju' ); ?>"><?php esc_html_e( 'Basic SEO course', 'wordpress-seo' ); ?></a></strong><br>
73
+ <?php esc_html_e( 'Learn practical SEO skills to rank higher in Google.', 'wordpress-seo' ); ?>
74
+ </p>
75
+ <br class="clear">
76
+ </div>
77
+ </div>
78
+ <div class="yoast-sidebar_section">
79
+ <h2><?php esc_html_e( 'Extend Yoast SEO', 'wordpress-seo' ); ?></h2>
80
+ <div>
81
+ <a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jq' ); ?>"><img src="<?php echo esc_url( $wpseo_plugin_dir_url . 'images/Local_SEO_Icon.svg' ); ?>" alt=""></a>
82
+ <p>
83
+ <strong><a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jq' ); ?>"><?php esc_html_e( 'Local SEO', 'wordpress-seo' ); ?></a></strong><br>
84
+ <?php esc_html_e( 'Be found in Google Maps and local results.', 'wordpress-seo' ); ?>
85
+ </p>
86
+ <br class="clear">
87
+ </div>
88
+ <div>
89
+ <a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jo' ); ?>"><img src="<?php echo esc_url( $wpseo_plugin_dir_url . 'images/Video_SEO_Icon.svg' ); ?>" alt=""></a>
90
+ <p>
91
+ <strong><a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jo' ); ?>"><?php esc_html_e( 'Video SEO', 'wordpress-seo' ); ?></a></strong><br>
92
+ <?php esc_html_e( 'Be found in Google Video search and enhance your video sharing on social media.', 'wordpress-seo' ); ?>
93
+ </p>
94
+ <br class="clear">
95
+ </div>
96
+ <div>
97
+ <a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jp' ); ?>"><img src="<?php echo esc_url( $wpseo_plugin_dir_url . 'images/Woo_SEO_Icon.svg' ); ?>" alt=""></a>
98
+ <p>
99
+ <strong><a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jp' ); ?>"><?php esc_html_e( 'WooCommerce SEO', 'wordpress-seo' ); ?></a></strong><br>
100
+ <?php esc_html_e( 'Optimize your shop\'s SEO and sell more products!', 'wordpress-seo' ); ?>
101
+ </p>
102
+ <br class="clear">
103
+ </div>
104
+ <div>
105
+ <a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jr' ); ?>"><img src="<?php echo esc_url( $wpseo_plugin_dir_url . 'images/News_SEO_Icon.svg' ); ?>" alt=""></a>
106
+ <p>
107
+ <strong><a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jr' ); ?>"><?php esc_html_e( 'News SEO', 'wordpress-seo' ); ?></a></strong><br>
108
+ <?php esc_html_e( 'Optimize your site for Google News.', 'wordpress-seo' ); ?>
109
+ </p>
110
+ <br class="clear">
111
+ </div>
112
+ </div>
113
+ <div class="yoast-sidebar_section">
114
+ <strong>Remove these ads?</strong>
115
+ <p>
116
+ <a target="_blank" rel="noopener noreferrer" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/jy' ); ?>">
117
+ <?php
118
+ /* translators: %s expands to Yoast SEO Premium. */
119
+ printf( esc_html__( 'Upgrade to %s »', 'wordpress-seo' ), 'Yoast SEO Premium' );
120
+ ?>
121
+ </a>
122
+ </p>
123
+ </div>
124
+ </div>
125
+ </div>
admin/watchers/class-slug-change-watcher.php CHANGED
@@ -28,6 +28,9 @@ class WPSEO_Slug_Change_Watcher implements WPSEO_WordPress_Integration {
28
 
29
  // Detect a post delete.
30
  add_action( 'before_delete_post', array( $this, 'detect_post_delete' ) );
 
 
 
31
  }
32
 
33
  /**
@@ -38,7 +41,7 @@ class WPSEO_Slug_Change_Watcher implements WPSEO_WordPress_Integration {
38
  public function enqueue_assets() {
39
  global $pagenow;
40
 
41
- if ( ! in_array( $pagenow, array( 'edit.php' ), true ) ) {
42
  return;
43
  }
44
 
@@ -84,6 +87,24 @@ class WPSEO_Slug_Change_Watcher implements WPSEO_WordPress_Integration {
84
  $this->add_notification( $message );
85
  }
86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  /**
88
  * Checks if the post is viewable.
89
  *
@@ -105,6 +126,42 @@ class WPSEO_Slug_Change_Watcher implements WPSEO_WordPress_Integration {
105
  return true;
106
  }
107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  /**
109
  * Retrieves the singular post type label.
110
  *
@@ -120,7 +177,7 @@ class WPSEO_Slug_Change_Watcher implements WPSEO_WordPress_Integration {
120
  $post_type_object = get_post_type_object( 'post' );
121
  }
122
 
123
- return strtolower( $post_type_object->labels->singular_name );
124
  }
125
 
126
  /**
28
 
29
  // Detect a post delete.
30
  add_action( 'before_delete_post', array( $this, 'detect_post_delete' ) );
31
+
32
+ // Detects deletion of a term.
33
+ add_action( 'delete_term_taxonomy', array( $this, 'detect_term_delete' ) );
34
  }
35
 
36
  /**
41
  public function enqueue_assets() {
42
  global $pagenow;
43
 
44
+ if ( ! in_array( $pagenow, array( 'edit.php', 'edit-tags.php' ), true ) ) {
45
  return;
46
  }
47
 
87
  $this->add_notification( $message );
88
  }
89
 
90
+ /**
91
+ * Shows a message when a term is about to get deleted.
92
+ *
93
+ * @param integer $term_id The term ID that will be deleted.
94
+ *
95
+ * @return void
96
+ */
97
+ public function detect_term_delete( $term_id ) {
98
+ if ( ! $this->is_term_viewable( $term_id ) ) {
99
+ return;
100
+ }
101
+
102
+ $first_sentence = sprintf( __( 'You just deleted a %1$s.', 'wordpress-seo' ), $this->get_taxonomy_label_for_term( $term_id ) );
103
+ $message = $this->get_message( $first_sentence );
104
+
105
+ $this->add_notification( $message );
106
+ }
107
+
108
  /**
109
  * Checks if the post is viewable.
110
  *
126
  return true;
127
  }
128
 
129
+ /**
130
+ * Checks if the term is viewable.
131
+ *
132
+ * @param string $term_id The term ID to check.
133
+ *
134
+ * @return bool Whether the term is viewable or not.
135
+ */
136
+ protected function is_term_viewable( $term_id ) {
137
+ $term = get_term( $term_id );
138
+
139
+ if ( ! $term || is_wp_error( $term ) ) {
140
+ return false;
141
+ }
142
+
143
+ $taxonomy = get_taxonomy( $term->taxonomy );
144
+ if ( ! $taxonomy ) {
145
+ return false;
146
+ }
147
+
148
+ return $taxonomy->publicly_queryable || $taxonomy->public;
149
+ }
150
+
151
+ /**
152
+ * Gets the taxonomy label to use for a term.
153
+ *
154
+ * @param int $term_id The term ID.
155
+ *
156
+ * @return string The taxonomy's singular label.
157
+ */
158
+ protected function get_taxonomy_label_for_term( $term_id ) {
159
+ $term = get_term( $term_id );
160
+ $taxonomy = get_taxonomy( $term->taxonomy );
161
+
162
+ return $taxonomy->labels->singular_name;
163
+ }
164
+
165
  /**
166
  * Retrieves the singular post type label.
167
  *
177
  $post_type_object = get_post_type_object( 'post' );
178
  }
179
 
180
+ return $post_type_object->labels->singular_name;
181
  }
182
 
183
  /**
css/dist/{admin-global-773-rtl.min.css → admin-global-780-rtl.min.css} RENAMED
File without changes
css/dist/{admin-global-773.min.css → admin-global-780.min.css} RENAMED
File without changes
css/dist/{adminbar-773-rtl.min.css → adminbar-780-rtl.min.css} RENAMED
File without changes
css/dist/{adminbar-773.min.css → adminbar-780.min.css} RENAMED
File without changes
css/dist/{alerts-773-rtl.min.css → alerts-780-rtl.min.css} RENAMED
File without changes
css/dist/{alerts-773.min.css → alerts-780.min.css} RENAMED
File without changes
css/dist/{dashboard-773-rtl.min.css → dashboard-780-rtl.min.css} RENAMED
File without changes
css/dist/{dashboard-773.min.css → dashboard-780.min.css} RENAMED
File without changes
css/dist/{edit-page-773-rtl.min.css → edit-page-780-rtl.min.css} RENAMED
File without changes
css/dist/{edit-page-773.min.css → edit-page-780.min.css} RENAMED
File without changes
css/dist/{featured-image-773-rtl.min.css → featured-image-780-rtl.min.css} RENAMED
File without changes
css/dist/{featured-image-773.min.css → featured-image-780.min.css} RENAMED
File without changes
css/dist/{filter-explanation-773-rtl.min.css → filter-explanation-780-rtl.min.css} RENAMED
File without changes
css/dist/{filter-explanation-773.min.css → filter-explanation-780.min.css} RENAMED
File without changes
css/dist/{inside-editor-773-rtl.min.css → inside-editor-780-rtl.min.css} RENAMED
File without changes
css/dist/{inside-editor-773.min.css → inside-editor-780.min.css} RENAMED
File without changes
css/dist/{metabox-773-rtl.min.css → metabox-780-rtl.min.css} RENAMED
@@ -1 +1 @@
1
- .yoast-section{width:auto;max-width:640px}.snippet_container:after,.snippet_container:before{display:table;content:" "}.snippet_container:after{clear:both}.snippet-editor__view{clear:both;background:#fff}.snippet-editor__view-toggle{display:inline-block;margin-top:10px;margin-right:20px;border:1px solid #dbdbdb;border-radius:4px;background-color:#f7f7f7;vertical-align:top}.snippet-editor__view-icon{float:right;width:31px;height:31px;border:none;border-bottom:4px solid transparent;outline:0;background-color:transparent;background-repeat:no-repeat;background-position:center,center;cursor:pointer}.snippet-editor__view-icon:focus,.snippet-editor__view-icon:hover{border-color:#1074a8;background-color:#fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}.snippet-editor__view-icon--active{border-color:#555;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}.snippet-editor__view-icon.yoast-tooltip:before{bottom:-10px}.snippet-editor__view-icon.yoast-tooltip:after{margin-top:10px}.snippet-editor__view-icon-desktop{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1728%20992v%2D832q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D1600q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v832q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h1600q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm128%2D832v1088q0%2066%2D47%20113t%2D113%2047h%2D544q0%2037%2016%2077%2E5t32%2071%2016%2043%2E5q0%2026%2D19%2045t%2D45%2019h%2D512q%2D26%200%2D45%2D19t%2D19%2D45q0%2D14%2016%2D44t32%2D70%2016%2D78h%2D544q%2D66%200%2D113%2D47t%2D47%2D113v%2D1088q0%2D66%2047%2D113t113%2D47h1600q66%200%20113%2047t47%20113z%22%2F%3E%3C%2Fsvg%3E");background-size:18px}.snippet-editor__view-icon-desktop:focus,.snippet-editor__view-icon-desktop:hover{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M1728%20992v%2D832q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D1600q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v832q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h1600q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm128%2D832v1088q0%2066%2D47%20113t%2D113%2047h%2D544q0%2037%2016%2077%2E5t32%2071%2016%2043%2E5q0%2026%2D19%2045t%2D45%2019h%2D512q%2D26%200%2D45%2D19t%2D19%2D45q0%2D14%2016%2D44t32%2D70%2016%2D78h%2D544q%2D66%200%2D113%2D47t%2D47%2D113v%2D1088q0%2D66%2047%2D113t113%2D47h1600q66%200%20113%2047t47%20113z%22%2F%3E%3C%2Fsvg%3E")}.snippet-editor__view-icon-mobile{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M976%201408q0%2D33%2D23%2E5%2D56%2E5t%2D56%2E5%2D23%2E5%2D56%2E5%2023%2E5%2D23%2E5%2056%2E5%2023%2E5%2056%2E5%2056%2E5%2023%2E5%2056%2E5%2D23%2E5%2023%2E5%2D56%2E5zm208%2D160v%2D704q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D512q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v704q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h512q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm%2D192%2D848q0%2D16%2D16%2D16h%2D160q%2D16%200%2D16%2016t16%2016h160q16%200%2016%2D16zm288%2D16v1024q0%2052%2D38%2090t%2D90%2038h%2D512q%2D52%200%2D90%2D38t%2D38%2D90v%2D1024q0%2D52%2038%2D90t90%2D38h512q52%200%2090%2038t38%2090z%22%2F%3E%3C%2Fsvg%3E");background-size:22px}.snippet-editor__view-icon-mobile:focus,.snippet-editor__view-icon-mobile:hover{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M976%201408q0%2D33%2D23%2E5%2D56%2E5t%2D56%2E5%2D23%2E5%2D56%2E5%2023%2E5%2D23%2E5%2056%2E5%2023%2E5%2056%2E5%2056%2E5%2023%2E5%2056%2E5%2D23%2E5%2023%2E5%2D56%2E5zm208%2D160v%2D704q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D512q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v704q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h512q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm%2D192%2D848q0%2D16%2D16%2D16h%2D160q%2D16%200%2D16%2016t16%2016h160q16%200%2016%2D16zm288%2D16v1024q0%2052%2D38%2090t%2D90%2038h%2D512q%2D52%200%2D90%2D38t%2D38%2D90v%2D1024q0%2D52%2038%2D90t90%2D38h512q52%200%2090%2038t38%2090z%22%2F%3E%3C%2Fsvg%3E")}.snippet-editor__view--desktop{overflow:auto;width:640px;max-width:100%;padding:0 20px}.snippet-editor__view .snippet_container__title{width:600px;white-space:nowrap}.snippet-editor__view .snippet_container__title .title{display:inline-block;overflow:hidden;max-width:600px;vertical-align:top;text-overflow:ellipsis}.snippet-editor__view .snippet_container__title .title#snippet_sitename{display:inline}.snippet-editor__view .snippet_container__url{width:600px;line-height:1;white-space:nowrap}.snippet-editor__view .snippet_container__url .urlFull{display:inline-block;overflow:hidden;max-width:586px;font-size:14px;line-height:16px;vertical-align:top;text-overflow:ellipsis}.snippet-editor__view .snippet_container .down_arrow{display:inline-block;margin-top:6px;margin-right:6px;border-top:5px solid #006621;border-left:4px solid transparent;border-right:4px solid transparent;vertical-align:top}.snippet-editor__view .snippet_container__meta{width:600px}.snippet-editor__view--mobile{margin:0 20px 10px;padding:11px 0;border-bottom:1px hidden #fff;border-radius:2px;box-shadow:0 1px 2px rgba(0,0,0,.2)}.snippet-editor__view--mobile .snippet_container{display:block;line-height:20px}.snippet-editor__view--mobile .snippet_container__meta,.snippet-editor__view--mobile .snippet_container__title,.snippet-editor__view--mobile .snippet_container__url{box-sizing:border-box;width:100%}.snippet-editor__view--mobile .snippet_container__title{overflow:visible;padding:0 16px;white-space:normal;word-wrap:break-word}.snippet-editor__view--mobile .snippet_container__title .title{font-size:16px;line-height:20px}.snippet-editor__view--mobile .snippet_container__url{margin-bottom:9px;padding:0 16px 9px;border-bottom:1px solid #ebebeb}.snippet-editor__view--mobile .snippet_container__url .urlFull{max-width:100%;font-size:14px;line-height:20px}.snippet-editor__view--mobile .snippet_container .down_arrow{display:none}.snippet-editor__view--mobile .snippet_container__meta{padding:0 16px;font-size:14px;line-height:20px}.snippet-editor__view--mobile .snippet_container .desc{font-size:14px;line-height:20px}.snippet-editor__is-scrollable-hintwrapper{display:none;margin:1em 0 5px;text-align:center}.snippet-editor__view--desktop.snippet-editor__view--desktop-has-scroll+.snippet-editor__is-scrollable-hintwrapper{display:block}.snippet-editor__is-scrollable-hint{display:inline-block}.snippet-editor__is-scrollable-hint:before{display:inline-block;margin-left:10px;font-size:20px;line-height:inherit;vertical-align:text-top;content:"\21c4"}.snippet-editor__container{position:relative;cursor:pointer}.snippet-editor__container.editable-preview__container--no-caret{cursor:auto}.snippet-editor__heading{margin:0 0 15px;padding:8px 20px;color:#555;font-family:"Open Sans",sans-serif;font-size:.9rem;font-weight:300}.snippet-editor__heading-editor{border-top:1px solid #f7f7f7}.snippet-editor__heading-icon{padding-right:45px;background-repeat:no-repeat;background-position:right 20px top .6em;background-size:16px}.snippet-editor__container--focus:before,.snippet-editor__container--focus:hover:before,.snippet-editor__container:hover:before{position:absolute;right:-22px;width:24px;height:24px;background-size:25px;content:"";display:block;top:-3px}.snippet-editor__heading-icon-eye{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__container:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__container--focus:before,.snippet-editor__container--focus:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__preview{max-width:640px;padding:0 0 15px}.snippet-editor__preview #help-yoast-snippetpreview{padding:0 20px}.snippet-editor__button{padding:8px 10px;border:1px solid #dbdbdb;border-radius:4px;color:#555;background:#f7f7f7;font-size:.8rem;line-height:15px;cursor:pointer}.snippet-editor__edit-button{display:inline-block;box-sizing:border-box;margin-top:10px;padding-right:32px;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M491%201536l91%2D91%2D235%2D235%2D91%2091v107h128v128h107zm523%2D928q0%2D22%2D22%2D22%2D10%200%2D17%207l%2D542%20542q%2D7%207%2D7%2017%200%2022%2022%2022%2010%200%2017%2D7l542%2D542q7%2D7%207%2D17zm%2D54%2D192l416%20416%2D832%20832h%2D416v%2D416zm683%2096q0%2053%2D37%2090l%2D166%20166%2D416%2D416%20166%2D165q36%2D38%2090%2D38%2053%200%2091%2038l235%20234q37%2039%2037%2091z%22%20%2F%3E%3C%2Fsvg%3E") right 8px top 50% no-repeat #f7f7f7;background-size:16px}.snippet-editor__form{padding:20px}.snippet-editor__label{display:block;position:relative;width:100%;margin-top:1em}.snippet-editor__label--focus:before,.snippet-editor__label--hover:before{right:-22px;width:24px;height:24px;background-size:25px;display:block;content:"";position:absolute}.snippet-editor__label:first-child{margin-top:0}.snippet-editor__label--hover:before{top:-3px;top:20px;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__label--focus:before{top:-3px;top:20px;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__input{display:block;box-sizing:border-box;width:100%;max-width:100%;margin-top:5px;border:1px solid #bfbfbf}.snippet-editor__input:focus{border:1px solid #1074a8;outline:0}.rtl .snippet-editor__container:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.rtl .snippet-editor__container--focus:before,.rtl .snippet-editor__container--focus:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.rtl .snippet-editor__label--hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.rtl .snippet-editor__label--focus:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.snippet-editor__meta-description{height:84px}.snippet-editor__submit{margin-top:1em}#snippet_cite{min-width:20px}#meta_container{clear:both;min-height:20px}.snippet_container .title{margin:0;color:#1e0fbe;font-size:18px;font-weight:400;line-height:1.2;text-decoration:none}.snippet-editor__date,.snippet_container .desc{font-size:13px;line-height:1.4}.snippet_container .url{color:#006621;font-style:normal}.snippet_container .url strong{font-weight:700}.snippet_container .desc-default{color:#545454}.snippet_container .desc-default strong{color:#6a6a6a;font-weight:700}.snippet_container .desc-render{color:#777}.snippet_container .tooLong{color:red!important}.snippet-editor__field--invalid{color:red}.snippet-editor__progress{display:block;box-sizing:border-box;width:100%;height:8px;margin-top:5px;border:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.snippet-editor__progress::-webkit-progress-bar{height:8px;border:1px solid #bfbfbf;background-color:#f7f7f7}.snippet-editor__progress--fallback{height:8px;border:1px solid #bfbfbf;background-color:#f7f7f7}.snippet-editor__progress-bar{width:0;max-width:100%;height:100%}.snippet-editor__date{color:grey}.snippet-editor--hidden{display:none}.yoast-measurement-elements-holder{position:absolute;right:-9999em}.snippet-editor__progress--bad[value]{color:#dc3232}.snippet-editor__progress--bad[value]::-webkit-progress-value{background-color:#dc3232;transition:width 250ms}.snippet-editor__progress--bad[value]::-moz-progress-bar{background-color:#dc3232}.snippet-editor__progress--bad[value] .snippet-editor__progress-bar{background-color:#dc3232}.snippet-editor__progress--ok[value]{color:#ee7c1b}.snippet-editor__progress--ok[value]::-webkit-progress-value{background-color:#ee7c1b;transition:width 250ms}.snippet-editor__progress--ok[value]::-moz-progress-bar{background-color:#ee7c1b}.snippet-editor__progress--ok[value] .snippet-editor__progress-bar{background-color:#ee7c1b}.snippet-editor__progress--good[value]{color:#7ad03a}.snippet-editor__progress--good[value]::-webkit-progress-value{background-color:#7ad03a;transition:width 250ms}.snippet-editor__progress--good[value]::-moz-progress-bar{background-color:#7ad03a}.snippet-editor__progress--good[value] .snippet-editor__progress-bar{background-color:#7ad03a}.wpseoanalysis{padding-left:0}.wpseo-score-text{float:right;width:86%;width:calc(100% - 56px)}.assessment-results .wpseo-score-icon{float:right;width:12px;height:12px;margin:3px 0 0 10px;border-radius:50%;background:#888}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#999}.wpseo-score-icon.noindex{background-color:#1e8cbe}li.score{margin-bottom:6px;list-style-type:none!important}li.score:after{display:table;clear:both;content:""}.screen-reader-text{overflow:hidden;clip:rect(1px,1px,1px,1px);position:absolute!important;width:1px;height:1px}.assessment-results{clear:both}.assessment-results__mark.icon-eye-active,.assessment-results__mark.icon-eye-disabled,.assessment-results__mark.icon-eye-inactive{float:right;width:28px;height:28px;margin:-5px 3px 0;padding:4px;border:0;border-radius:100%;outline:0;background:center no-repeat;background-size:16px;cursor:pointer}.assessment-results__mark.icon-eye-inactive{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.assessment-results__mark.icon-eye-active{background-color:#a4286a;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23ffffff%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.assessment-results__mark.icon-eye-disabled{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%20role%3D%22img%22%20aria%2Dhidden%3D%22true%22%20focusable%3D%22false%22%3E%3Cpath%20fill%3D%22%23e6e6e6%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.assessment-results__mark:focus{border-radius:100%;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.assessment-results__mark-container{display:inline-block;float:left;width:33px;min-height:1px}.YoastSEO_msg .left,.YoastSEO_msg .right{display:none}@keyframes animatedBackground{from{background-position:100% 0}to{background-position:0 0}}.YoastSEO_msg .bufferbar{display:block;width:100%;height:12px;margin:10px 0;border:1px solid #dfdfdf;background-image:linear-gradient(to right,#fff,#0063ff,#fff,#0063ff);background-position:100% 0;background-size:300% 100%;animation:animatedBackground 5s linear infinite}.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip::after{display:none;position:absolute;z-index:1000000;padding:6px 8px 5px;border-radius:3px;opacity:0;color:#fff;background:rgba(0,0,0,.8);text-shadow:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";text-align:center;white-space:pre;text-decoration:none;letter-spacing:normal;text-transform:none;word-wrap:break-word;content:attr(aria-label);pointer-events:none;-webkit-font-smoothing:subpixel-antialiased}.yoast-tooltip-alt::after{content:attr(data-label)}.yoast-tooltip::before{display:none;position:absolute;z-index:1000001;width:0;height:0;border:5px solid transparent;opacity:0;color:rgba(0,0,0,.8);content:"\00a0";pointer-events:none}@keyframes yoast-tooltip-appear{from{opacity:0}to{opacity:1}}.yoast-tooltip:active::after,.yoast-tooltip:active::before,.yoast-tooltip:focus::after,.yoast-tooltip:focus::before,.yoast-tooltip:hover::after,.yoast-tooltip:hover::before{display:inline-block;text-decoration:none;animation-name:yoast-tooltip-appear;animation-duration:.1s;animation-timing-function:ease-in;animation-delay:.4s;animation-fill-mode:forwards}.yoast-tooltip-no-delay:active::after,.yoast-tooltip-no-delay:active::before,.yoast-tooltip-no-delay:focus::after,.yoast-tooltip-no-delay:focus::before,.yoast-tooltip-no-delay:hover::after,.yoast-tooltip-no-delay:hover::before{opacity:1;animation:none}.yoast-tooltip-multiline:active::after,.yoast-tooltip-multiline:focus::after,.yoast-tooltip-multiline:hover::after{display:table-cell}.yoast-tooltip-s::after,.yoast-tooltip-se::after,.yoast-tooltip-sw::after{top:100%;left:50%;margin-top:5px}.yoast-tooltip-s::before,.yoast-tooltip-se::before,.yoast-tooltip-sw::before{top:auto;left:50%;bottom:-5px;margin-left:-5px;border-bottom-color:rgba(0,0,0,.8)}.yoast-tooltip-se::after{left:auto;right:50%;margin-right:-15px}.yoast-tooltip-sw::after{margin-left:-15px}.yoast-tooltip-n::after,.yoast-tooltip-ne::after,.yoast-tooltip-nw::after{left:50%;bottom:100%;margin-bottom:5px}.yoast-tooltip-n::before,.yoast-tooltip-ne::before,.yoast-tooltip-nw::before{top:-5px;left:50%;bottom:auto;margin-left:-5px;border-top-color:rgba(0,0,0,.8)}.yoast-tooltip-ne::after{left:auto;right:50%;margin-right:-15px}.yoast-tooltip-nw::after{margin-left:-15px}.yoast-tooltip-n::after,.yoast-tooltip-s::after{-ms-transform:translateX(-50%);transform:translateX(-50%)}.yoast-tooltip-w::after{left:100%;bottom:50%;margin-left:5px;-ms-transform:translateY(50%);transform:translateY(50%)}.yoast-tooltip-w::before{top:50%;bottom:50%;right:-5px;margin-top:-5px;border-right-color:rgba(0,0,0,.8)}.yoast-tooltip-e::after{bottom:50%;right:100%;margin-right:5px;-ms-transform:translateY(50%);transform:translateY(50%)}.yoast-tooltip-e::before{top:50%;left:-5px;bottom:50%;margin-top:-5px;border-left-color:rgba(0,0,0,.8)}.yoast-tooltip-multiline::after{width:250px;width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;border-collapse:separate;white-space:pre-line;word-wrap:normal;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n::after,.yoast-tooltip-multiline.yoast-tooltip-s::after{left:auto;right:50%;-ms-transform:translateX(50%);transform:translateX(50%)}.yoast-tooltip-multiline.yoast-tooltip-e::after,.yoast-tooltip-multiline.yoast-tooltip-w::after{left:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline::after{width:250px}}.yoast-tooltip-sticky::after,.yoast-tooltip-sticky::before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline::after{display:table-cell}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w::after{margin-left:4.5px}}.postbox .yoast-help-center__button{min-height:0;margin:0;padding:8px 0;border:none;color:#0073aa;box-shadow:none;font:inherit;text-decoration:underline;text-transform:none}.wpseotab label,.wpseotab legend{font-weight:600}.postbox .yoast-help-center__button svg{margin:0 13px}#edittag .yoast-video-tutorial__video-container{float:none;max-width:100%;margin:0 auto}#edittag .yoast-video-tutorial__descriptions{margin:0 auto;padding:0}@media screen and (max-width:1480px){#poststuff .yoast-video-tutorial__video-container{float:none;max-width:100%;margin:0 auto}#poststuff .yoast-video-tutorial__descriptions{margin:0 auto;padding:0}}.wpseo-metabox #yoast-help-center-container{margin:8px 0}.draftJsMentionPlugin__mention__29BEd,.draftJsMentionPlugin__mention__29BEd:visited{display:inline-block;padding-left:2px;padding-right:2px;border-radius:2px;color:#575f67;background:#e6f3ff;text-decoration:none;cursor:pointer}.draftJsMentionPlugin__mention__29BEd:focus,.draftJsMentionPlugin__mention__29BEd:hover{outline:0;color:#677584;background:#edf5fd}.draftJsMentionPlugin__mention__29BEd:active{color:#222;background:#455261}.draftJsMentionPlugin__mentionSuggestionsEntry__3mSwm{padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.draftJsMentionPlugin__mentionSuggestionsEntry__3mSwm:active{background-color:#cce7ff}.draftJsMentionPlugin__mentionSuggestionsEntryFocused__3LcTd{background-color:#e6f3ff}.draftJsMentionPlugin__mentionSuggestionsEntryText__3Jobq{display:inline-block;overflow:hidden;max-width:368px;margin-bottom:.2em;margin-right:8px;font-size:.9em;white-space:nowrap;text-overflow:ellipsis}.draftJsMentionPlugin__mentionSuggestionsEntryAvatar__1xgA9{display:inline-block;width:24px;height:24px;border-radius:12px}.draftJsMentionPlugin__mentionSuggestions__2DWjA{display:-ms-flexbox;display:flex;flex-direction:column;position:absolute;z-index:2;box-sizing:border-box;min-width:220px;max-width:440px;margin-top:.4em;padding-top:8px;padding-bottom:8px;border:1px solid #eee;border-radius:2px;background:#fff;box-shadow:0 4px 30px 0 #dcdcdc;cursor:pointer;-ms-transform:scale(0);transform:scale(0);-ms-flex-direction:column}#edittag>#wp-description-wrap,.DraftEditorPlaceholder-hidden{display:none}.DraftEditor-root,.public-DraftEditor-block{position:relative}.DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-editorContainer{position:relative;z-index:1;border-left:.1px solid transparent;background-color:rgba(255,255,255,0)}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{width:100%;margin:0 auto;text-align:center}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{position:absolute;z-index:1;color:#9197a3}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{text-align:left;direction:ltr}.public-DraftStyleDefault-rtl{text-align:right;direction:rtl}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol,.public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{position:relative;list-style-type:square}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{position:relative;list-style-type:none}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{position:absolute;left:-36px;width:30px;text-align:right}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;width:30px;text-align:left}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4}#wpseo_meta{box-sizing:border-box}#wpseo_meta *,#wpseo_meta :after,#wpseo_meta :before{box-sizing:inherit}#wp-description-wrap .wp-editor-area{border:0}.term-description-wrap td>textarea#description{min-height:530px}ul.wpseo-metabox-tabs{display:none;margin-top:6px;margin-bottom:0}ul.wpseo-metabox-tabs:after{display:table;clear:both;content:""}.wpseo-metabox-tabs-div ul{list-style:none}ul.wpseo-metabox-tabs li.active{background-color:#fdfdfd}.wpseo-meta-section{display:none;width:100%;max-width:calc(100% - 50px);vertical-align:top}.wpseo-meta-section.active{display:inline-block}.wpseo-metabox-sidebar{float:right;width:50px;padding:0;background-color:#fff}.wpseo-metabox-sidebar ul{margin:0}.wpseo-metabox-sidebar li{display:inline-block;margin-bottom:0;padding:5px}.wpseo-metabox-sidebar a{display:inline-block;width:35px;height:35px;font-size:20px;line-height:30px;text-decoration:none}.wpseo-metabox-sidebar li span{margin:3px -5px 0 0;padding:0 5px 0 2px;border:0 solid transparent;border-right-width:3px;border-radius:3px}.wpseo-metabox-sidebar li span.wpseo-buy-premium{color:#a4286a}.wpseo-metabox-sidebar li span.wpseo-buy-premium:hover{color:#832055}.wpseo-metabox-sidebar li.active span{border-color:#333;color:#333}.wpseo-metabox-sidebar li.active span.wpseo-buy-premium{border-color:#a4286a;color:#a4286a}.wpseo-metabox-sidebar li.active span.wpseo-buy-premium:hover{border-color:#832055;color:#832055}ul.wpseo-metabox-tabs li{float:right;margin-left:5px;margin-bottom:-1px;padding:0;border:1px solid #dfdfdf;border-bottom:0 none}ul.wpseo-metabox-tabs li .wpseo-keyword{display:inline-block;overflow:hidden;max-width:8em;max-width:8rem;vertical-align:top;white-space:nowrap;text-overflow:ellipsis}.wpseotab{display:none;padding:20px 35px;border:1px solid #ddd;background-color:#fdfdfd}.wpseotab .wpseo-cornerstone-checkbox{margin-left:.5em}.wpseotab.content{padding:20px 15px}.wpseotab.active{display:block}#wpseofocuskeyword,#wpseosnippet{margin-bottom:2em}.wpseo-metabox-tabs .wpseo_tablink{display:inline-block;padding:5px 12px 6px;vertical-align:top;text-decoration:none}.wpseo-metabox-tabs .wpseo_content_tab a,.wpseo-metabox-tabs .wpseo_content_tab+.wpseo_keyword_tab a{padding-left:12px}.wpseo-metabox-tabs .wpseo-score-icon{margin-right:0}#wpseo-meta-section-social .wpseo-metabox-tabs .wpseo_tablink{padding:5px 7px}.wpseo-metabox-tabs .wpseo_tablink .dashicons{width:16px;height:16px;font-size:16px}.wpseo-metabox-sidebar .dashicons{width:30px;height:30px;font-size:30px}.wpseo-metabox-tabs-div div.wpseo-tabs-panel{overflow:auto;padding:.5em .9em;border:1px solid}#wpseo_meta .inside{margin:0}#wpseo_meta .inside::after{display:table;clear:both;content:""}#wpseo_meta .postbox .inside .wpseotab{font-size:13px!important}.wpseotab .select2-container,.wpseotab input,.wpseotab label,.wpseotab p.error-message,.wpseotab textarea,.yoast-metabox__description{max-width:600px}.wpseotab fieldset{padding-top:5px}.wpseotab label{display:block}.wpseotab input[type=checkbox]+label,.wpseotab input[type=radio]+label{display:inline-block;font-weight:400}.wpseotab fieldset,.wpseotab label{margin-top:2em;margin-bottom:.5em}.wpseotab input[type=checkbox],.wpseotab input[type=checkbox]+label{margin-top:2em;margin-bottom:0;font-size:1em}.wpseotab fieldset:first-child,.wpseotab input[type=checkbox]:first-child,.wpseotab input[type=checkbox]:first-child+label,.wpseotab label:first-child{margin-top:10px}.wpseotab input[type=radio]{margin-top:0}.wpseotab input[type=radio]+label{margin:0 0 0 1em}.wpseotab p.error-message,.yoast-metabox__description{margin:.5em 0}.wpseotab #yoast_wpseo_focuskw_text_input,.wpseotab select[multiple]{margin-top:0}.wpseotab .wpseo_image_upload_button{margin-right:3px}.good,.warn,.wrong{font-weight:600}.good{color:green}.warn{color:maroon}.wrong{color:#dc3232}#current_seo_title span{padding:2px 5px;background-color:#ffffe0}#focuskwresults ul{margin:0}#focuskwresults li,#focuskwresults p{font-size:13px}#focuskwresults li{margin:0 20px 0 0;list-style-type:disc}.wpseo_hidden{display:none}.wpseo_msg{margin:5px 0 10px;padding:0 5px;border:1px solid #e6db55;background-color:#ffffe0}ul.wpseo-metabox-tabs li.wpseo-tab-add-keyword{border:1px dashed #dfdfdf;border-bottom:none}.wpseo-tab-add-keyword .wpseo-add-keyword.button{height:auto;padding:5px 10px 5px 12px;background:0 0;box-shadow:none;font-size:inherit;font-weight:700;line-height:inherit;vertical-align:top;text-decoration:none}.wpseo-tab-add-keyword .wpseo-add-keyword.button:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.wpseo-tab-add-keyword