PluginProbe
StoreEngine — Complete eCommerce Solution with Memberships, Licensing, Affiliates & More / 2.2.0
StoreEngine — Complete eCommerce Solution with Memberships, Licensing, Affiliates & More v2.2.0
2.3.0 2.2.0 2.1.1 2.1.0 2.0.0 1.10.0 1.9.1 1.9.0 1.2.1 1.2.2 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 All 59 releases
storeengine / addons / webhooks / webhooks.php

webhooks.php in StoreEngine — Complete eCommerce Solution with Memberships, Licensing, Affiliates & More 2.2.0, at addons/webhooks/webhooks.php

264 lines 8.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace StoreEngine\Addons\Webhooks;
4
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit;
7 }
8
9 use StoreEngine\Classes\AbstractAddon;
10 use StoreEngine\Traits\Singleton;
11 use StoreEngine\Utils\Helper;
12 use StoreEngine\Addons\Webhooks\Events\Dispatch;
13 use StoreEngine\Addons\Webhooks\Incoming\Incoming;
14 use StoreEngine\Addons\Webhooks\Incoming\Registry;
15
16 final class Webhooks extends AbstractAddon {
17 use Singleton;
18
19 protected string $addon_name = 'webhooks';
20
21 /**
22 * Defines CONSTANTS for Whole Addon.
23 */
24 public function define_constants() {
25 define( 'STOREENGINE_WEBHOOKS_VERSION', '1.0' );
26 define( 'STOREENGINE_WEBHOOKS_DIR_PATH', STOREENGINE_ADDONS_DIR_PATH . 'webhooks/' );
27 }
28
29 public static function get_events() {
30 return apply_filters( 'storeengine/webhooks_events', [
31 'product_created',
32 'product_updated',
33 'product_deleted',
34 'product_restored',
35 'coupon_created',
36 'coupon_updated',
37 'coupon_deleted',
38 'coupon_restored',
39 'order_created',
40 'order_updated',
41 'order_deleted',
42 'order_restored',
43 'customer_created',
44 'customer_updated',
45 'customer_deleted',
46
47 // CMS content — useful for headless storefronts that need to
48 // revalidate Next.js / Nuxt / Astro caches when WP content changes.
49 'page_published',
50 'page_updated',
51 'page_deleted',
52 'post_published',
53 'post_updated',
54 'post_deleted',
55
56 // Block-theme / Site Editor — fired on template + part saves so
57 // headless renderers can refresh layout changes without a redeploy.
58 'template_saved',
59 'template_part_saved',
60 'global_styles_saved',
61
62 // Navigation
63 'nav_menu_updated',
64 ] );
65 }
66 public static function get_event_labels() {
67 return apply_filters( 'storeengine/webhooks_event_labels', [
68 [
69 'label' => __( 'Product Created', 'storeengine' ),
70 'value' => 'product_created',
71 ],
72 [
73 'label' => __( 'Product Updated', 'storeengine' ),
74 'value' => 'product_updated',
75 ],
76 [
77 'label' => __( 'Product Deleted', 'storeengine' ),
78 'value' => 'product_deleted',
79 ],
80 [
81 'label' => __( 'Product Restored', 'storeengine' ),
82 'value' => 'product_restored',
83 ],
84 [
85 'label' => __( 'Coupon Created', 'storeengine' ),
86 'value' => 'coupon_created',
87 ],
88 [
89 'label' => __( 'Coupon Updated', 'storeengine' ),
90 'value' => 'coupon_updated',
91 ],
92 [
93 'label' => __( 'Coupon Deleted', 'storeengine' ),
94 'value' => 'coupon_deleted',
95 ],
96 [
97 'label' => __( 'Coupon Restored', 'storeengine' ),
98 'value' => 'coupon_restored',
99 ],
100 [
101 'label' => __( 'Order Created', 'storeengine' ),
102 'value' => 'order_created',
103 ],
104 [
105 'label' => __( 'Order Updated', 'storeengine' ),
106 'value' => 'order_updated',
107 ],
108 [
109 'label' => __( 'Order Deleted', 'storeengine' ),
110 'value' => 'order_deleted',
111 ],
112 [
113 'label' => __( 'Order Restored', 'storeengine' ),
114 'value' => 'order_restored',
115 ],
116 [
117 'label' => __( 'Customer Created', 'storeengine' ),
118 'value' => 'customer_created',
119 ],
120 [
121 'label' => __( 'Customer Updated', 'storeengine' ),
122 'value' => 'customer_updated',
123 ],
124 [
125 'label' => __( 'Customer Deleted', 'storeengine' ),
126 'value' => 'customer_deleted',
127 ],
128
129 // CMS content
130 [ 'label' => __( 'Page Published', 'storeengine' ), 'value' => 'page_published' ],
131 [ 'label' => __( 'Page Updated', 'storeengine' ), 'value' => 'page_updated' ],
132 [ 'label' => __( 'Page Deleted', 'storeengine' ), 'value' => 'page_deleted' ],
133 [ 'label' => __( 'Post Published', 'storeengine' ), 'value' => 'post_published' ],
134 [ 'label' => __( 'Post Updated', 'storeengine' ), 'value' => 'post_updated' ],
135 [ 'label' => __( 'Post Deleted', 'storeengine' ), 'value' => 'post_deleted' ],
136
137 // Block-theme / Site Editor
138 [ 'label' => __( 'Block Template Saved', 'storeengine' ), 'value' => 'template_saved' ],
139 [ 'label' => __( 'Block Template Part Saved', 'storeengine' ), 'value' => 'template_part_saved' ],
140 [ 'label' => __( 'Global Styles Saved', 'storeengine' ), 'value' => 'global_styles_saved' ],
141
142 // Navigation
143 [ 'label' => __( 'Navigation Menu Updated', 'storeengine' ), 'value' => 'nav_menu_updated' ],
144 ] );
145 }
146
147 /**
148 * Grouped event list for the React event picker (react-select group format).
149 *
150 * react-select renders `{ label, options: [{ label, value }] }` items as
151 * collapsible-style groups, so adding ~10 new events doesn't bury the
152 * existing 15 in a flat list. Each group is filterable so Pro addons can
153 * register their own group label and slot events into it without
154 * disturbing core.
155 *
156 * @return array<int,array{label:string,options:array<int,array{label:string,value:string}>}>
157 */
158 public static function get_event_groups(): array {
159 return apply_filters( 'storeengine/webhooks_event_groups', [
160 [
161 'label' => __( 'Products', 'storeengine' ),
162 'options' => [
163 [ 'label' => __( 'Created', 'storeengine' ), 'value' => 'product_created' ],
164 [ 'label' => __( 'Updated', 'storeengine' ), 'value' => 'product_updated' ],
165 [ 'label' => __( 'Deleted', 'storeengine' ), 'value' => 'product_deleted' ],
166 [ 'label' => __( 'Restored', 'storeengine' ), 'value' => 'product_restored' ],
167 ],
168 ],
169 [
170 'label' => __( 'Orders', 'storeengine' ),
171 'options' => [
172 [ 'label' => __( 'Created', 'storeengine' ), 'value' => 'order_created' ],
173 [ 'label' => __( 'Updated', 'storeengine' ), 'value' => 'order_updated' ],
174 [ 'label' => __( 'Deleted', 'storeengine' ), 'value' => 'order_deleted' ],
175 [ 'label' => __( 'Restored', 'storeengine' ), 'value' => 'order_restored' ],
176 ],
177 ],
178 [
179 'label' => __( 'Coupons', 'storeengine' ),
180 'options' => [
181 [ 'label' => __( 'Created', 'storeengine' ), 'value' => 'coupon_created' ],
182 [ 'label' => __( 'Updated', 'storeengine' ), 'value' => 'coupon_updated' ],
183 [ 'label' => __( 'Deleted', 'storeengine' ), 'value' => 'coupon_deleted' ],
184 [ 'label' => __( 'Restored', 'storeengine' ), 'value' => 'coupon_restored' ],
185 ],
186 ],
187 [
188 'label' => __( 'Customers', 'storeengine' ),
189 'options' => [
190 [ 'label' => __( 'Created', 'storeengine' ), 'value' => 'customer_created' ],
191 [ 'label' => __( 'Updated', 'storeengine' ), 'value' => 'customer_updated' ],
192 [ 'label' => __( 'Deleted', 'storeengine' ), 'value' => 'customer_deleted' ],
193 ],
194 ],
195 [
196 'label' => __( 'Pages', 'storeengine' ),
197 'options' => [
198 [ 'label' => __( 'Published', 'storeengine' ), 'value' => 'page_published' ],
199 [ 'label' => __( 'Updated', 'storeengine' ), 'value' => 'page_updated' ],
200 [ 'label' => __( 'Deleted', 'storeengine' ), 'value' => 'page_deleted' ],
201 ],
202 ],
203 [
204 'label' => __( 'Posts', 'storeengine' ),
205 'options' => [
206 [ 'label' => __( 'Published', 'storeengine' ), 'value' => 'post_published' ],
207 [ 'label' => __( 'Updated', 'storeengine' ), 'value' => 'post_updated' ],
208 [ 'label' => __( 'Deleted', 'storeengine' ), 'value' => 'post_deleted' ],
209 ],
210 ],
211 [
212 'label' => __( 'Block Theme / Site Editor', 'storeengine' ),
213 'options' => [
214 [ 'label' => __( 'Template Saved', 'storeengine' ), 'value' => 'template_saved' ],
215 [ 'label' => __( 'Template Part Saved', 'storeengine' ), 'value' => 'template_part_saved' ],
216 [ 'label' => __( 'Global Styles Saved', 'storeengine' ), 'value' => 'global_styles_saved' ],
217 ],
218 ],
219 [
220 'label' => __( 'Navigation', 'storeengine' ),
221 'options' => [
222 [ 'label' => __( 'Menu Updated', 'storeengine' ), 'value' => 'nav_menu_updated' ],
223 ],
224 ],
225 ] );
226 }
227
228 public function init_addon() {
229 Database::init();
230 Dispatch::init();
231 Incoming::init();
232
233 add_filter( 'storeengine/admin_menu_list', [ $this, 'admin_menu_items' ] );
234 add_filter( 'storeengine/backend_scripts_data', [ $this, 'backend_scripts_data' ] );
235 }
236
237 public function admin_menu_items( array $items ): array {
238 return array_merge( $items, [
239 STOREENGINE_PLUGIN_SLUG . '-webhooks' => [
240 'title' => __( 'WebHooks', 'storeengine' ),
241 'capability' => 'manage_options',
242 'priority' => 91,
243 ],
244 ] );
245 }
246
247 public function backend_scripts_data( array $data ): array {
248 $data['webhooks'] = self::get_event_labels(); // back-compat (flat)
249 $data['webhooks_groups'] = self::get_event_groups(); // react-select group shape
250 $data['incoming_actions'] = Registry::get_actions(); // incoming action picker
251
252 return $data;
253 }
254
255 public function addon_activation_hook() {
256 Database::init();
257 Helper::flush_rewire_rules();
258 }
259
260 public function addon_deactivation_hook() {
261 Helper::flush_rewire_rules();
262 }
263 }
264