PluginProbe
YayMail – WooCommerce Email Customizer / trunk
YayMail – WooCommerce Email Customizer vtrunk
4.4.4 4.4.3 4.4.2 4.4.1 trunk 1.9.6 2.1.4 2.1.5 3.2.2 3.2.6 3.2.7.1 3.2.8.1 3.2.9 3.3 3.3.1 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9 3.4 3.4.1 3.4.2 3.4.3 All 55 releases
yaymail / src / Controllers / AddonController.php

AddonController.php in YayMail – WooCommerce Email Customizer trunk, at src/Controllers/AddonController.php

235 lines 7.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace YayMail\Controllers;
4
5 use YayMail\Abstracts\BaseController;
6 use YayMail\Models\AddonModel;
7 use YayMail\Models\SettingModel;
8 use YayMail\Utils\Helpers;
9 use YayMail\Utils\SingletonTrait;
10
11 /**
12 * Settings Controller
13 * * @method static AddonController get_instance()
14 */
15 class AddonController extends BaseController {
16 use SingletonTrait;
17
18 private $model = null;
19
20 protected function __construct() {
21 $this->model = SettingModel::get_instance();
22 $this->init_hooks();
23 }
24
25 protected function permission_callback_admin_only() {
26 return current_user_can( 'activate_plugins' );
27 }
28
29 protected function init_hooks() {
30 register_rest_route(
31 YAYMAIL_REST_NAMESPACE,
32 '/addons',
33 [
34 [
35 'methods' => \WP_REST_Server::READABLE,
36 'callback' => [ $this, 'exec_get_addons' ],
37 'permission_callback' => [ $this, 'permission_callback' ],
38 ],
39 ]
40 );
41 register_rest_route(
42 YAYMAIL_REST_NAMESPACE,
43 '/addons/activate',
44 [
45 [
46 'methods' => \WP_REST_Server::EDITABLE,
47 'callback' => [ $this, 'exec_activate_addon' ],
48 'permission_callback' => [ $this, 'permission_callback_admin_only' ],
49 ],
50 ]
51 );
52 register_rest_route(
53 YAYMAIL_REST_NAMESPACE,
54 '/addons/deactivate',
55 [
56 [
57 'methods' => \WP_REST_Server::EDITABLE,
58 'callback' => [ $this, 'exec_deactivate_addon' ],
59 'permission_callback' => [ $this, 'permission_callback_admin_only' ],
60 ],
61 ]
62 );
63 }
64
65 public function exec_get_addons( \WP_REST_Request $request ) {
66 return $this->exec( [ $this, 'get_addons' ], $request );
67 }
68
69 public function exec_activate_addon( \WP_REST_Request $request ) {
70 return $this->exec( [ $this, 'activate_addon' ], $request );
71 }
72
73 public function exec_deactivate_addon( \WP_REST_Request $request ) {
74 return $this->exec( [ $this, 'deactivate_addon' ], $request );
75 }
76
77 public function get_addons( \WP_REST_Request $request ) {
78 $data = AddonModel::get_all();
79 $platform = $request->get_param( 'platform' );
80 $data = $this->filter_addons_by_platform( $data, $platform );
81 $data = $this->reorder_addons_for_catalog( $data );
82
83 return array_values( $data );
84 }
85
86 /**
87 * Keep Addons REST list aligned with active YayMail Woo vs Yay WP Pro (same idea as addons_platform in localize).
88 *
89 * @param array<string, array<string, mixed>> $data Addon rows keyed by namespace.
90 * @return array<string, array<string, mixed>>
91 */
92 private function filter_addons_by_platform( array $data, string $platform ): array {
93 // Unknown/absent platform falls through to the WordPress catalog, matching
94 // the prior exact-match behavior ( $platform === 'yaymail' ).
95 $platform_obj = '' !== $platform ? \YayMail\Platform\PlatformRegistry::get( $platform ) : null;
96 $is_yaymail = $platform_obj ? $platform_obj->is_woo_product() : false;
97
98 return array_filter(
99 $data,
100 function ( $addon ) use ( $is_yaymail ) {
101 $categories = isset( $addon['categories'] ) && is_array( $addon['categories'] ) ? $addon['categories'] : [];
102 if ( $is_yaymail ) {
103 return ! in_array( 'wordpress', $categories, true ); //phpcs:ignore
104 } else {
105 return in_array( 'wordpress', $categories, true ); //phpcs:ignore
106 }
107 }
108 );
109 }
110
111 /**
112 * Pin core Woo addons first; append all others in original order (WordPress-catalog addons follow).
113 *
114 * @param array<string, array<string, mixed>> $data Addon rows keyed by namespace.
115 * @return array<string, array<string, mixed>>
116 */
117 private function reorder_addons_for_catalog( array $data ): array {
118 $pinned_keys = [
119 'YayMailAddonConditionalLogic',
120 'YayMailAddonWcSubscription',
121 'YayMailAddonYITHWishlist',
122 ];
123
124 $pinned_set = array_flip( $pinned_keys );
125
126 $head = [];
127 $wordpress = [];
128 $others = [];
129
130 foreach ( $pinned_keys as $key ) {
131 if ( isset( $data[ $key ] ) ) {
132 $head[ $key ] = $data[ $key ];
133 }
134 }
135
136 foreach ( $data as $key => $addon ) {
137 if ( isset( $pinned_set[ $key ] ) ) {
138 continue;
139 }
140
141 $categories = isset( $addon['categories'] ) && is_array( $addon['categories'] ) ? $addon['categories'] : [];
142 $is_wordpress = in_array( 'WordPress', $categories, true );
143
144 if ( $is_wordpress ) {
145 $wordpress[ $key ] = $addon;
146 } else {
147 $others[ $key ] = $addon;
148 }
149 }
150
151 return $head + $wordpress + $others;
152 }
153
154 public function activate_addon( \WP_REST_Request $request ) {
155 $addon = $request->get_param( 'addon' );
156
157 if ( ! $addon ) {
158 return [
159 'success' => false,
160 'message' => 'Addon not found',
161 ];
162 }
163
164 require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
165 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
166 require_once ABSPATH . 'wp-admin/includes/class-wp-ajax-upgrader-skin.php';
167 require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
168
169 $plugin_status = \install_plugin_install_status(
170 [
171 'slug' => $addon,
172 'version' => '',
173 ]
174 );
175
176 if ( $plugin_status['status'] === false || empty( $plugin_status['file'] ) ) {
177 return [
178 'success' => false,
179 'message' => 'Addon not installed',
180 ];
181 }
182
183 $result = activate_plugin( $plugin_status['file'] );
184
185 if ( is_wp_error( $result ) ) {
186 return [
187 'success' => false,
188 'message' => $result->get_error_message(),
189 'addon' => $addon,
190 ];
191 }
192 return [
193 'success' => true,
194 'message' => 'Addon activated',
195 ];
196 }
197
198 public function deactivate_addon( \WP_REST_Request $request ) {
199 $addon = $request->get_param( 'addon' );
200
201 if ( ! $addon ) {
202 return [
203 'success' => false,
204 'message' => 'Addon not found',
205 ];
206 }
207
208 require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
209 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
210 require_once ABSPATH . 'wp-admin/includes/class-wp-ajax-upgrader-skin.php';
211 require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
212
213 $plugin_status = \install_plugin_install_status(
214 [
215 'slug' => $addon,
216 'version' => '',
217 ]
218 );
219
220 if ( $plugin_status['status'] === false || empty( $plugin_status['file'] ) ) {
221 return [
222 'success' => false,
223 'message' => 'Addon not installed',
224 ];
225 }
226
227 deactivate_plugins( $plugin_status['file'] );
228
229 return [
230 'success' => true,
231 'message' => 'Addon deactivated',
232 ];
233 }
234 }
235