import-integration.php
8.61 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
<?php
namespace Yoast\WP\SEO\Integrations\Admin;
use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Import_Tool_Selected_Conditional;
use Yoast\WP\SEO\Conditionals\Yoast_Tools_Page_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Alert_Presenter;
use Yoast\WP\SEO\Routes\Importing_Route;
use Yoast\WP\SEO\Services\Importing\Importable_Detector_Service;
/**
* Loads import script when on the Tool's page.
*/
class Import_Integration implements Integration_Interface {
/**
* Contains the asset manager.
*
* @var WPSEO_Admin_Asset_Manager
*/
protected $asset_manager;
/**
* The Importable Detector service.
*
* @var Importable_Detector_Service
*/
protected $importable_detector;
/**
* The Importing Route class.
*
* @var Importing_Route
*/
protected $importing_route;
/**
* Returns the conditionals based on which this loadable should be active.
*
* @return array
*/
public static function get_conditionals() {
return [
Import_Tool_Selected_Conditional::class,
Yoast_Tools_Page_Conditional::class,
];
}
/**
* Import Integration constructor.
*
* @param WPSEO_Admin_Asset_Manager $asset_manager The asset manager.
* @param Importable_Detector_Service $importable_detector The importable detector.
* @param Importing_Route $importing_route The importing route.
*/
public function __construct(
WPSEO_Admin_Asset_Manager $asset_manager,
Importable_Detector_Service $importable_detector,
Importing_Route $importing_route
) {
$this->asset_manager = $asset_manager;
$this->importable_detector = $importable_detector;
$this->importing_route = $importing_route;
}
/**
* Initializes the integration.
*
* This is the place to register hooks and filters.
*
* @return void
*/
public function register_hooks() {
\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_import_script' ] );
}
/**
* Enqueues the Import script.
*/
public function enqueue_import_script() {
\wp_enqueue_style( 'dashicons' );
$this->asset_manager->enqueue_script( 'import' );
$data = [
'restApi' => [
'root' => \esc_url_raw( \rest_url() ),
'cleanup_endpoints' => $this->get_cleanup_endpoints(),
'importing_endpoints' => $this->get_importing_endpoints(),
'nonce' => \wp_create_nonce( 'wp_rest' ),
],
'assets' => [
'loading_msg_import' => \esc_html__( 'The import can take a long time depending on your site\'s size.', 'wordpress-seo' ),
'loading_msg_cleanup' => \esc_html__( 'The cleanup can take a long time depending on your site\'s size.', 'wordpress-seo' ),
'note' => \esc_html__( 'Note: ', 'wordpress-seo' ),
'cleanup_after_import_msg' => \esc_html__( 'After you\'ve imported data from another SEO plugin, please make sure to clean up all the original data from that plugin. (step 5)', 'wordpress-seo' ),
'select_placeholder' => \esc_html__( 'Select SEO plugin', 'wordpress-seo' ),
'no_data_msg' => \esc_html__( 'No data found from other SEO plugins.', 'wordpress-seo' ),
'validation_failure' => $this->get_validation_failure_alert(),
'import_failure' => $this->get_import_failure_alert( true ),
'cleanup_failure' => $this->get_import_failure_alert( false ),
'spinner' => \admin_url( 'images/loading.gif' ),
'replacing_texts' => [
'cleanup_button' => \esc_html__( 'Clean up', 'wordpress-seo' ),
'import_explanation' => \esc_html__( 'Please select an SEO plugin below to see what data can be imported.', 'wordpress-seo' ),
'cleanup_explanation' => \esc_html__( 'Once you\'re certain that your site is working properly with the imported data from another SEO plugin, you can clean up all the original data from that plugin.', 'wordpress-seo' ),
/* translators: %s: expands to the name of the plugin that is selected to be imported */
'select_header' => \esc_html__( 'The import from %s includes:', 'wordpress-seo' ),
'plugins' => [
'aioseo' => [
[
'data_name' => \esc_html__( 'Post metadata (SEO titles, descriptions, etc.)', 'wordpress-seo' ),
'data_note' => \esc_html__( 'Note: This metadata will only be imported if there is no existing Yoast SEO metadata yet.', 'wordpress-seo' ),
],
[
'data_name' => \esc_html__( 'Default settings', 'wordpress-seo' ),
'data_note' => \esc_html__( 'Note: These settings will overwrite the default settings of Yoast SEO.', 'wordpress-seo' ),
],
],
'other' => [
[
'data_name' => \esc_html__( 'Post metadata (SEO titles, descriptions, etc.)', 'wordpress-seo' ),
'data_note' => \esc_html__( 'Note: This metadata will only be imported if there is no existing Yoast SEO metadata yet.', 'wordpress-seo' ),
],
],
],
],
],
];
/**
* Filter: 'wpseo_importing_data' Filter to adapt the data used in the import process.
*
* @param array $data The import data to adapt.
*/
$data = \apply_filters( 'wpseo_importing_data', $data );
$this->asset_manager->localize_script( 'import', 'yoastImportData', $data );
}
/**
* Retrieves a list of the importing endpoints to use.
*
* @return array The endpoints.
*/
protected function get_importing_endpoints() {
$available_actions = $this->importable_detector->detect_importers();
$importing_endpoints = [];
$available_sorted_actions = $this->sort_actions( $available_actions );
foreach ( $available_sorted_actions as $plugin => $types ) {
foreach ( $types as $type ) {
$importing_endpoints[ $plugin ][] = $this->importing_route->get_endpoint( $plugin, $type );
}
}
return $importing_endpoints;
}
/**
* Sorts the array of importing actions, by moving any validating actions to the start for every plugin.
*
* @param array $available_actions The array of actions that we want to sort.
*
* @return array The sorted array of actions.
*/
protected function sort_actions( $available_actions ) {
$first_action = 'validate_data';
$available_sorted_actions = [];
foreach ( $available_actions as $plugin => $plugin_available_actions ) {
$validate_action_position = \array_search( $first_action, $plugin_available_actions, true );
if ( ! empty( $validate_action_position ) ) {
unset( $plugin_available_actions[ $validate_action_position ] );
\array_unshift( $plugin_available_actions, $first_action );
}
$available_sorted_actions[ $plugin ] = $plugin_available_actions;
}
return $available_sorted_actions;
}
/**
* Retrieves a list of the importing endpoints to use.
*
* @return array The endpoints.
*/
protected function get_cleanup_endpoints() {
$available_actions = $this->importable_detector->detect_cleanups();
$importing_endpoints = [];
foreach ( $available_actions as $plugin => $types ) {
foreach ( $types as $type ) {
$importing_endpoints[ $plugin ][] = $this->importing_route->get_endpoint( $plugin, $type );
}
}
return $importing_endpoints;
}
/**
* Gets the validation failure alert using the Alert_Presenter.
*
* @return string The validation failure alert.
*/
protected function get_validation_failure_alert() {
$content = \esc_html__( 'The AIOSEO import was cancelled because some AIOSEO data is missing. Please try and take the following steps to fix this:', 'wordpress-seo' );
$content .= '<br/>';
$content .= '<ol><li>';
$content .= \esc_html__( 'If you have never saved any AIOSEO \'Search Appearance\' settings, please do that first and run the import again.', 'wordpress-seo' );
$content .= '</li>';
$content .= '<li>';
$content .= \esc_html__( 'If you already have saved AIOSEO \'Search Appearance\' settings and the issue persists, please contact our support team so we can take a closer look.', 'wordpress-seo' );
$content .= '</li></ol>';
$validation_failure_alert = new Alert_Presenter( $content, 'error' );
return $validation_failure_alert->present();
}
/**
* Gets the import failure alert using the Alert_Presenter.
*
* @param bool $is_import Wether it's an import or not.
*
* @return string The import failure alert.
*/
protected function get_import_failure_alert( $is_import ) {
$content = \esc_html__( 'Cleanup failed with the following error:', 'wordpress-seo' );
if ( $is_import ) {
$content = \esc_html__( 'Import failed with the following error:', 'wordpress-seo' );
}
$content .= '<br/><br/>';
$content .= \esc_html( '%s' );
$import_failure_alert = new Alert_Presenter( $content, 'error' );
return $import_failure_alert->present();
}
}