PluginProbe
YayMail – WooCommerce Email Customizer / 4.4.1
YayMail – WooCommerce Email Customizer v4.4.1
4.4.6 4.4.5 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 All 57 releases
yaymail / src / Controllers / AddonController.php

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

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