importing-route.php
4.05 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
<?php
namespace Yoast\WP\SEO\Routes;
use WP_Error;
use WP_REST_Response;
use Yoast\WP\SEO\Actions\Importing\Importing_Action_Interface;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Exceptions\Importing\Aioseo_Validation_Exception;
use Yoast\WP\SEO\Main;
use Yoast\WP\SEO\Services\Importing\Importable_Detector_Service;
/**
* Importing_Route class.
*
* Importing route for importing from other SEO plugins.
*/
class Importing_Route extends Abstract_Action_Route {
use No_Conditionals;
/**
* The import route constant.
*
* @var string
*/
const ROUTE = '/import/(?P<plugin>[\w-]+)/(?P<type>[\w-]+)';
/**
* List of available importers.
*
* @var Importing_Action_Interface[]
*/
protected $importers = [];
/**
* The importable detector service.
*
* @var Importable_Detector_Service
*/
protected $importable_detector;
/**
* Importing_Route constructor.
*
* @param Importable_Detector_Service $importable_detector The importable detector service.
* @param Importing_Action_Interface ...$importers All available importers.
*/
public function __construct(
Importable_Detector_Service $importable_detector,
Importing_Action_Interface ...$importers
) {
$this->importable_detector = $importable_detector;
$this->importers = $importers;
}
/**
* Registers routes with WordPress.
*
* @return void
*/
public function register_routes() {
\register_rest_route(
Main::API_V1_NAMESPACE,
self::ROUTE,
[
'callback' => [ $this, 'execute' ],
'permission_callback' => [ $this, 'is_user_permitted_to_import' ],
'methods' => [ 'POST' ],
]
);
}
/**
* Executes the rest request, but only if the respective action is enabled.
*
* @param mixed $data The request parameters.
*
* @return WP_REST_Response|false Response or false on non-existent route.
*/
public function execute( $data ) {
$plugin = (string) $data['plugin'];
$type = (string) $data['type'];
$next_url = $this->get_endpoint( $plugin, $type );
try {
$importer = $this->get_importer( $plugin, $type );
if ( $importer === false || ! $importer->is_enabled() ) {
return new WP_Error(
'rest_no_route',
'Requested importer not found',
[
'status' => 404,
]
);
}
$result = $importer->index();
if ( $result === false || \count( $result ) === 0 ) {
$next_url = false;
}
return $this->respond_with(
$result,
$next_url
);
} catch ( \Exception $exception ) {
if ( $exception instanceof Aioseo_Validation_Exception ) {
return new WP_Error(
'wpseo_error_validation',
$exception->getMessage(),
[ 'stackTrace' => $exception->getTraceAsString() ]
);
}
return new WP_Error(
'wpseo_error_indexing',
$exception->getMessage(),
[ 'stackTrace' => $exception->getTraceAsString() ]
);
}
}
/**
* Gets the right importer for the given arguments.
*
* @param string $plugin The plugin to import from.
* @param string $type The type of entity to import.
*
* @return Importing_Action_Interface|false The importer, or false if no importer was found.
*/
protected function get_importer( $plugin, $type ) {
$importers = $this->importable_detector->filter_actions( $this->importers, $plugin, $type );
if ( \count( $importers ) !== 1 ) {
return false;
}
return \current( $importers );
}
/**
* Gets the right endpoint for the given arguments.
*
* @param string $plugin The plugin to import from.
* @param string $type The type of entity to import.
*
* @return string|false The endpoint for the given action or false on failure of finding the one.
*/
public function get_endpoint( $plugin, $type ) {
if ( empty( $plugin ) || empty( $type ) ) {
return false;
}
return Main::API_V1_NAMESPACE . "/import/{$plugin}/{$type}";
}
/**
* Whether or not the current user is allowed to import.
*
* @return bool Whether or not the current user is allowed to import.
*/
public function is_user_permitted_to_import() {
return \current_user_can( 'activate_plugins' );
}
}