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
|
<?php /** * REST API Marketing Controller * * Handles requests to /marketing. */
namespace Automattic\WooCommerce\Admin\API;
use Automattic\WooCommerce\Admin\PluginsHelper; use Automattic\WooCommerce\Internal\Admin\Marketing\MarketingSpecs; use Automattic\WooCommerce\Admin\Features\MarketingRecommendations\Init as MarketingRecommendationsInit;
defined( 'ABSPATH' ) || exit;
/** * Marketing Controller. * * @internal * @extends WC_REST_Data_Controller */ class Marketing extends \WC_REST_Data_Controller {
/** * Endpoint namespace. * * @var string */ protected $namespace = 'wc-admin';
/** * Route base. * * @var string */ protected $rest_base = 'marketing';
/** * Register routes. */ public function register_routes() { register_rest_route( $this->namespace, '/' . $this->rest_base . '/recommended', array( array( 'methods' => \WP_REST_Server::READABLE, 'callback' => array( $this, 'get_recommended_plugins' ), 'permission_callback' => array( $this, 'get_recommended_plugins_permissions_check' ), 'args' => array( 'per_page' => $this->get_collection_params()['per_page'], 'category' => array( 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', 'sanitize_callback' => 'sanitize_title_with_dashes', ), ), ), 'schema' => array( $this, 'get_public_item_schema' ), ) );
register_rest_route( $this->namespace, '/' . $this->rest_base . '/knowledge-base', array( array( 'methods' => \WP_REST_Server::READABLE, 'callback' => array( $this, 'get_knowledge_base_posts' ), 'permission_callback' => array( $this, 'get_items_permissions_check' ), 'args' => array( 'category' => array( 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', 'sanitize_callback' => 'sanitize_title_with_dashes', ), ), ), 'schema' => array( $this, 'get_public_item_schema' ), ) );
register_rest_route( $this->namespace, '/' . $this->rest_base . '/misc-recommendations', array( array( 'methods' => \WP_REST_Server::READABLE, 'callback' => array( $this, 'get_misc_recommendations' ), 'permission_callback' => array( $this, 'get_recommended_plugins_permissions_check' ), ), 'schema' => array( $this, 'get_public_item_schema' ), ) ); }
/** * Check whether a given request has permission to install plugins. * * @param WP_REST_Request $request Full details about the request. * @return WP_Error|boolean */ public function get_recommended_plugins_permissions_check( $request ) { if ( ! current_user_can( 'install_plugins' ) ) { return new \WP_Error( 'woocommerce_rest_cannot_update', __( 'Sorry, you cannot manage plugins.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); }
return true; }
/** * Return installed marketing extensions data. * * @param \WP_REST_Request $request Request data. * * @return \WP_Error|\WP_REST_Response */ public function get_recommended_plugins( $request ) { // Default to marketing category (if no category set). $category = ( ! empty( $request->get_param( 'category' ) ) ) ? $request->get_param( 'category' ) : 'marketing'; $all_plugins = MarketingRecommendationsInit::get_recommended_plugins(); $valid_plugins = []; $per_page = $request->get_param( 'per_page' );
foreach ( $all_plugins as $plugin ) {
// default to marketing if 'categories' is empty on the plugin object (support for legacy api while testing). $plugin_categories = ( ! empty( $plugin['categories'] ) ) ? $plugin['categories'] : [ 'marketing' ];
if ( ! PluginsHelper::is_plugin_installed( $plugin['plugin'] ) && in_array( $category, $plugin_categories, true ) ) { $valid_plugins[] = $plugin; } }
return rest_ensure_response( array_slice( $valid_plugins, 0, $per_page ) ); }
/** * Return installed marketing extensions data. * * @param \WP_REST_Request $request Request data. * * @return \WP_Error|\WP_REST_Response */ public function get_knowledge_base_posts( $request ) { /** * MarketingSpecs class. * * @var MarketingSpecs $marketing_specs */ $marketing_specs = wc_get_container()->get( MarketingSpecs::class );
$category = $request->get_param( 'category' ); return rest_ensure_response( $marketing_specs->get_knowledge_base_posts( $category ) ); }
/** * Return misc recommendations. * * @param \WP_REST_Request $request Request data. * * @since 9.5.0 * * @return \WP_Error|\WP_REST_Response */ public function get_misc_recommendations( $request ) { $misc_recommendations = MarketingRecommendationsInit::get_misc_recommendations();
return rest_ensure_response( $misc_recommendations ); } }
|