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

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