PluginProbe
YayMail – WooCommerce Email Customizer / 4.4.0
YayMail – WooCommerce Email Customizer v4.4.0
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 4.4.0, at src/Controllers/AddonController.php

241 lines 7.4 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() {
78 $data = AddonModel::get_all();
79 $data = $this->filter_addons_by_platform( $data );
80 $data = $this->reorder_addons_for_catalog( $data );
81
82 return array_values( $data );
83 }
84
85 /**
86 * Keep Addons REST list aligned with active YayMail Woo vs Yay WP Pro (same idea as addons_platform in localize).
87 *
88 * @param array<string, array<string, mixed>> $data Addon rows keyed by namespace.
89 * @return array<string, array<string, mixed>>
90 */
91 private function filter_addons_by_platform( array $data ): array {
92 $has_wc = Helpers::is_yaymail_woocommerce_core_active();
93 $has_wp = Helpers::is_yaymail_wp_active();
94
95 if ( ( $has_wc && $has_wp ) || ( ! $has_wc && ! $has_wp ) ) {
96 return $data;
97 }
98
99 return array_filter(
100 $data,
101 function ( $addon ) use ( $has_wc, $has_wp ) {
102 $categories = isset( $addon['categories'] ) && is_array( $addon['categories'] ) ? $addon['categories'] : [];
103 $has_wordpress_category = in_array( 'wordpress', $categories, true );
104
105 if ( $has_wc && ! $has_wp ) {
106 return ! $has_wordpress_category;
107 }
108 if ( $has_wp && ! $has_wc ) {
109 return $has_wordpress_category;
110 }
111
112 return true;
113 }
114 );
115 }
116
117 /**
118 * Pin core Woo addons first; append all others in original order (WordPress-catalog addons follow).
119 *
120 * @param array<string, array<string, mixed>> $data Addon rows keyed by namespace.
121 * @return array<string, array<string, mixed>>
122 */
123 private function reorder_addons_for_catalog( array $data ): array {
124 $pinned_keys = [
125 'YayMailAddonConditionalLogic',
126 'YayMailAddonWcSubscription',
127 'YayMailAddonYITHWishlist',
128 ];
129
130 $pinned_set = array_flip( $pinned_keys );
131
132 $head = [];
133 $wordpress = [];
134 $others = [];
135
136 foreach ( $pinned_keys as $key ) {
137 if ( isset( $data[ $key ] ) ) {
138 $head[ $key ] = $data[ $key ];
139 }
140 }
141
142 foreach ( $data as $key => $addon ) {
143 if ( isset( $pinned_set[ $key ] ) ) {
144 continue;
145 }
146
147 $categories = isset( $addon['categories'] ) && is_array( $addon['categories'] ) ? $addon['categories'] : [];
148 $is_wordpress = in_array( 'wordpress', $categories, true );
149
150 if ( $is_wordpress ) {
151 $wordpress[ $key ] = $addon;
152 } else {
153 $others[ $key ] = $addon;
154 }
155 }
156
157 return $head + $wordpress + $others;
158 }
159
160 public function activate_addon( \WP_REST_Request $request ) {
161 $addon = $request->get_param( 'addon' );
162
163 if ( ! $addon ) {
164 return [
165 'success' => false,
166 'message' => 'Addon not found',
167 ];
168 }
169
170 require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
171 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
172 require_once ABSPATH . 'wp-admin/includes/class-wp-ajax-upgrader-skin.php';
173 require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
174
175 $plugin_status = \install_plugin_install_status(
176 [
177 'slug' => $addon,
178 'version' => '',
179 ]
180 );
181
182 if ( $plugin_status['status'] === false || empty( $plugin_status['file'] ) ) {
183 return [
184 'success' => false,
185 'message' => 'Addon not installed',
186 ];
187 }
188
189 $result = activate_plugin( $plugin_status['file'] );
190
191 if ( is_wp_error( $result ) ) {
192 return [
193 'success' => false,
194 'message' => $result->get_error_message(),
195 'addon' => $addon,
196 ];
197 }
198 return [
199 'success' => true,
200 'message' => 'Addon activated',
201 ];
202 }
203
204 public function deactivate_addon( \WP_REST_Request $request ) {
205 $addon = $request->get_param( 'addon' );
206
207 if ( ! $addon ) {
208 return [
209 'success' => false,
210 'message' => 'Addon not found',
211 ];
212 }
213
214 require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
215 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
216 require_once ABSPATH . 'wp-admin/includes/class-wp-ajax-upgrader-skin.php';
217 require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
218
219 $plugin_status = \install_plugin_install_status(
220 [
221 'slug' => $addon,
222 'version' => '',
223 ]
224 );
225
226 if ( $plugin_status['status'] === false || empty( $plugin_status['file'] ) ) {
227 return [
228 'success' => false,
229 'message' => 'Addon not installed',
230 ];
231 }
232
233 deactivate_plugins( $plugin_status['file'] );
234
235 return [
236 'success' => true,
237 'message' => 'Addon deactivated',
238 ];
239 }
240 }
241