crawl-settings-integration.php
11.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
<?php
namespace Yoast\WP\SEO\Integrations\Admin;
use WPSEO_Admin_Asset_Manager;
use WPSEO_Option;
use WPSEO_Shortlinker;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Alert_Presenter;
use Yoast_Form;
/**
* Crawl_Settings_Integration class
*/
class Crawl_Settings_Integration implements Integration_Interface {
/**
* The admin asset manager.
*
* @var WPSEO_Admin_Asset_Manager
*/
private $admin_asset_manager;
/**
* Holds the settings + labels for the head clean up piece.
*
* @var array
*/
private $basic_settings;
/**
* Holds the settings + labels for the feeds clean up.
*
* @var array
*/
private $feed_settings;
/**
* Holds the settings + labels for permalink cleanup settings.
*
* @var array
*/
private $permalink_cleanup_settings;
/**
* Holds the settings + labels for search cleanup settings.
*
* @var array
*/
private $search_cleanup_settings;
/**
* Holds the settings + labels for unused resources settings.
*
* @var array
*/
private $unused_resources_settings;
/**
* The shortlinker.
*
* @var WPSEO_Shortlinker
*/
private $shortlinker;
/**
* Returns the conditionals based in which this loadable should be active.
*
* In this case: when on an admin page.
*/
public static function get_conditionals() {
return [ Admin_Conditional::class ];
}
/**
* Crawl_Settings_Integration constructor.
*
* @param WPSEO_Admin_Asset_Manager $admin_asset_manager The admin asset manager.
* @param WPSEO_Shortlinker $shortlinker The shortlinker.
*/
public function __construct( WPSEO_Admin_Asset_Manager $admin_asset_manager, WPSEO_Shortlinker $shortlinker ) {
$this->admin_asset_manager = $admin_asset_manager;
$this->shortlinker = $shortlinker;
}
/**
* Registers an action to add a new tab to the General page.
*/
public function register_hooks() {
$this->register_setting_labels();
\add_action( 'wpseo_settings_tab_crawl_cleanup_network', [ $this, 'add_crawl_settings_tab_content_network' ] );
\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
}
/**
* Enqueue the workouts app.
*/
public function enqueue_assets() {
if ( ! \is_network_admin() ) {
return;
}
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Page is not processed or saved.
if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_dashboard' ) {
return;
}
$this->admin_asset_manager->enqueue_script( 'crawl-settings' );
}
/**
* Connects the settings to their labels.
*
* @return void
*/
private function register_setting_labels() {
$this->feed_settings = [
'remove_feed_global' => \__( 'Global feed', 'wordpress-seo' ),
'remove_feed_global_comments' => \__( 'Global comment feeds', 'wordpress-seo' ),
'remove_feed_post_comments' => \__( 'Post comments feeds', 'wordpress-seo' ),
'remove_feed_authors' => \__( 'Post authors feeds', 'wordpress-seo' ),
'remove_feed_post_types' => \__( 'Post type feeds', 'wordpress-seo' ),
'remove_feed_categories' => \__( 'Category feeds', 'wordpress-seo' ),
'remove_feed_tags' => \__( 'Tag feeds', 'wordpress-seo' ),
'remove_feed_custom_taxonomies' => \__( 'Custom taxonomy feeds', 'wordpress-seo' ),
'remove_feed_search' => \__( 'Search results feeds', 'wordpress-seo' ),
'remove_atom_rdf_feeds' => \__( 'Atom/RDF feeds', 'wordpress-seo' ),
];
$this->basic_settings = [
'remove_shortlinks' => \__( 'Shortlinks', 'wordpress-seo' ),
'remove_rest_api_links' => \__( 'REST API links', 'wordpress-seo' ),
'remove_rsd_wlw_links' => \__( 'RSD / WLW links', 'wordpress-seo' ),
'remove_oembed_links' => \__( 'oEmbed links', 'wordpress-seo' ),
'remove_generator' => \__( 'Generator tag', 'wordpress-seo' ),
'remove_pingback_header' => \__( 'Pingback HTTP header', 'wordpress-seo' ),
'remove_powered_by_header' => \__( 'Powered by HTTP header', 'wordpress-seo' ),
];
$this->permalink_cleanup_settings = [
'clean_campaign_tracking_urls' => \__( 'Campaign tracking URL parameters', 'wordpress-seo' ),
'clean_permalinks' => \__( 'Unregistered URL parameters', 'wordpress-seo' ),
];
$this->search_cleanup_settings = [
'search_cleanup' => \__( 'Filter search terms', 'wordpress-seo' ),
'search_cleanup_emoji' => \__( 'Filter searches with emojis and other special characters', 'wordpress-seo' ),
'search_cleanup_patterns' => \__( 'Filter searches with common spam patterns', 'wordpress-seo' ),
'deny_search_crawling' => \__( 'Prevent search engines from crawling site search URLs', 'wordpress-seo' ),
'redirect_search_pretty_urls' => \__( 'Redirect pretty URLs for search pages to raw format', 'wordpress-seo' ),
];
$this->unused_resources_settings = [
'remove_emoji_scripts' => \__( 'Emoji scripts', 'wordpress-seo' ),
'deny_wp_json_crawling' => \__( 'Prevent search engines from crawling /wp-json/', 'wordpress-seo' ),
'deny_adsbot_crawling' => \__( 'Prevent Google AdsBot from crawling', 'wordpress-seo' ),
];
}
/**
* Adds content to the Crawl Cleanup tab.
*
* @deprecated 20.4
* @codeCoverageIgnore
*
* @param Yoast_Form $yform The yoast form object.
*/
public function add_crawl_settings_tab_content( $yform ) {
\_deprecated_function( __METHOD__, 'Yoast SEO 20.4' );
$this->add_crawl_settings( $yform );
}
/**
* Adds content to the Crawl Cleanup network tab.
*
* @param Yoast_Form $yform The yoast form object.
*/
public function add_crawl_settings_tab_content_network( $yform ) {
$this->add_crawl_settings( $yform );
}
/**
* Print the settings sections.
*
* @param Yoast_Form $yform The Yoast form class.
*
* @return void
*/
private function add_crawl_settings( $yform ) {
$this->print_toggles( $this->basic_settings, $yform, \__( 'Basic crawl settings', 'wordpress-seo' ) );
$this->print_toggles( $this->feed_settings, $yform, \__( 'Feed crawl settings', 'wordpress-seo' ) );
$this->print_toggles( $this->unused_resources_settings, $yform, \__( 'Remove unused resources', 'wordpress-seo' ) );
$first_search_setting = \array_slice( $this->search_cleanup_settings, 0, 1 );
$rest_search_settings = \array_slice( $this->search_cleanup_settings, 1 );
$search_settings_toggles = [
'off' => \__( 'Disabled', 'wordpress-seo' ),
'on' => \__( 'Enabled', 'wordpress-seo' ),
];
$this->print_toggles( $first_search_setting, $yform, \__( 'Search cleanup settings', 'wordpress-seo' ), $search_settings_toggles );
$this->print_toggles( $rest_search_settings, $yform, '', $search_settings_toggles );
$permalink_warning = \sprintf(
/* Translators: %1$s expands to an opening anchor tag for a link leading to the Yoast SEO page of the Permalink Cleanup features, %2$s expands to a closing anchor tag. */
\esc_html__(
'These are expert features, so make sure you know what you\'re doing before removing the parameters. %1$sRead more about how your site can be affected%2$s.',
'wordpress-seo'
),
'<a href="' . \esc_url( $this->shortlinker->build_shortlink( 'https://yoa.st/permalink-cleanup' ) ) . '" target="_blank" rel="noopener noreferrer">',
'</a>'
);
$this->print_toggles( $this->permalink_cleanup_settings, $yform, \__( 'Permalink cleanup settings', 'wordpress-seo' ), [], $permalink_warning );
// Add the original option as hidden, so as not to lose any values if it's disabled and the form is saved.
$yform->hidden( 'clean_permalinks_extra_variables', 'clean_permalinks_extra_variables' );
}
/**
* Prints a list of toggles for an array of settings with labels.
*
* @param array $settings The settings being displayed.
* @param Yoast_Form $yform The Yoast form class.
* @param string $title Optional title for the settings being displayed.
* @param array $toggles Optional naming of the toggle buttons.
* @param string $warning Optional warning to be displayed above the toggles.
*
* @return void
*/
private function print_toggles( array $settings, Yoast_Form $yform, $title = '', $toggles = [], $warning = '' ) {
if ( ! empty( $title ) ) {
echo '<h3 class="yoast-crawl-settings">', \esc_html( $title ), '</h3>';
}
if ( ! empty( $warning ) ) {
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in Alert_Presenter.
echo new Alert_Presenter( $warning, 'warning' );
}
if ( empty( $toggles ) ) {
$toggles = [
'off' => \__( 'Keep', 'wordpress-seo' ),
'on' => \__( 'Remove', 'wordpress-seo' ),
];
}
$setting_prefix = WPSEO_Option::ALLOW_KEY_PREFIX;
$toggles = [
// phpcs:ignore WordPress.WP.I18n.TextDomainMismatch -- Reason: text is originally from Yoast SEO.
'on' => \__( 'Allow Control', 'wordpress-seo' ),
// phpcs:ignore WordPress.WP.I18n.TextDomainMismatch -- Reason: text is originally from Yoast SEO.
'off' => \__( 'Disable', 'wordpress-seo' ),
];
foreach ( $settings as $setting => $label ) {
$attr = [];
$variable = $setting_prefix . $setting;
if ( $this->should_feature_be_disabled_permalink( $setting ) ) {
$attr = [
'disabled' => true,
];
$variable = $setting_prefix . $setting . '_disabled';
// Also add the original option as hidden, so as not to lose any values if it's disabled and the form is saved.
$yform->hidden( $setting_prefix . $setting, $setting_prefix . $setting );
}
elseif ( $this->should_feature_be_disabled_multisite( $setting ) ) {
$attr = [
'disabled' => true,
'preserve_disabled_value' => false,
];
}
$yform->toggle_switch(
$variable,
$toggles,
$label,
'',
$attr
);
if ( $this->should_feature_be_disabled_permalink( $setting ) ) {
echo '<p class="yoast-crawl-settings-help">';
if ( \current_user_can( 'manage_options' ) ) {
echo \sprintf(
/* translators: 1: Link start tag to the Permalinks settings page, 2: Link closing tag. */
\esc_html__( 'This feature is disabled when your site is not using %1$spretty permalinks%2$s.', 'wordpress-seo' ),
'<a href="' . \esc_url( \admin_url( 'options-permalink.php' ) ) . '">',
'</a>'
);
}
else {
echo \esc_html__( 'This feature is disabled when your site is not using pretty permalinks.', 'wordpress-seo' );
}
echo '</p>';
}
}
}
/**
* Checks if the feature should be disabled due to non-pretty permalinks.
*
* @param string $setting The setting to be displayed.
*
* @return bool
*/
protected function should_feature_be_disabled_permalink( $setting ) {
return (
\in_array( $setting, [ 'clean_permalinks', 'clean_campaign_tracking_urls' ], true )
&& empty( \get_option( 'permalink_structure' ) )
);
}
/**
* Checks if the feature should be disabled due to the site being a multisite.
*
* @param string $setting The setting to be displayed.
*
* @return bool
*/
protected function should_feature_be_disabled_multisite( $setting ) {
return (
\in_array( $setting, [ 'deny_search_crawling', 'deny_wp_json_crawling', 'deny_adsbot_crawling' ], true )
&& \is_multisite()
);
}
}