PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.6.6
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.6.6
1.6.6 1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 All 49 releases
← All changes | app/Hooks/actions.php +24 -5 1.3.27 → 1.6.6 View file →
@@ -25,18 +25,21 @@
25 25 (new \FluentCart\App\Hooks\Handlers\RetentionSnapshotHandler)->register();
26 26 (new \FluentCart\App\Hooks\Handlers\ReminderHandler)->register();
27 27
28 28 (new \FluentCart\App\Hooks\Handlers\ShortCodes\ShopAppHandler)->register();
29 -(new \FluentCart\App\Hooks\Handlers\ExportHandler)->register();
30 29
31 30 (new FluentCart\App\Hooks\Handlers\CustomCheckout\CustomCheckout())->register();
32 31
33 32 // Tax Module Init
34 -(new \FluentCart\App\Modules\Tax\TaxModule())->register();
33 +add_action('init', function () {
34 + (new \FluentCart\App\Modules\Tax\TaxModule())->register();
35 +}, 1);
35 36
36 37 // Turnstile Module Init
37 38 (new \FluentCart\App\Modules\Turnstile\TurnstileInit())->register(\FluentCart\App\App::getInstance());
38 39
40 +(new \FluentCart\App\Modules\FluentPlayer\FluentPlayerAdminAssets())->register();
41 +
39 42 // Register Pro Gateways Promo
40 43 (new \FluentCart\App\Hooks\Handlers\PromoGatewaysHandler())->register();
41 44
42 45 // Register Addon Gateways
@@ -73,8 +76,9 @@
73 76 \FluentCart\App\Hooks\Handlers\BlockEditors\Buttons\BuyNowButtonBlockEditor::register();
74 77 \FluentCart\App\Hooks\Handlers\BlockEditors\Buttons\AddToCartButtonBlockEditor::register();
75 78
76 79 \FluentCart\App\Hooks\Handlers\BlockEditors\MiniCartBlockEditor::register();
80 +\FluentCart\App\Hooks\Handlers\BlockEditors\Cart\CartBlockEditor::register();
77 81 \FluentCart\App\Hooks\Handlers\BlockEditors\ProductCategoriesListBlockEditor::register();
78 82 \FluentCart\App\Hooks\Handlers\BlockEditors\RelatedProduct\RelatedProductBlockEditor::register();
79 83 \FluentCart\App\Hooks\Handlers\ShortCodes\Buttons\DirectCheckoutShortcode::register();
80 84 \FluentCart\App\Hooks\Handlers\ShortCodes\Buttons\AddToCartShortcode::register();
@@ -81,8 +85,9 @@
81 85 \FluentCart\App\Hooks\Handlers\ShortCodes\MiniCartShortcode::register();
82 86 \FluentCart\App\Hooks\Handlers\ShortCodes\ProductCategoriesListShortcode::register();
83 87 \FluentCart\App\Hooks\Handlers\ShortCodes\ProductTitleShortCode::register();
84 88 \FluentCart\App\Hooks\Handlers\ShortCodes\ProductImageShortCode::register();
89 +\FluentCart\App\Hooks\Handlers\ShortCodes\SingleProductShortCode::register();
85 90
86 91
87 92 \FluentCart\App\Hooks\Handlers\BlockEditors\ProductSkuBlockEditor::register();
88 93 \FluentCart\App\Hooks\Handlers\BlockEditors\ProductPackageDescriptionBlockEditor::register();
@@ -130,13 +135,21 @@
130 135 return;
131 136 }
132 137
133 138 $order = \FluentCart\App\Models\Order::find($orderId);
134 - if (!$order || $order->payment_status !== 'paid' || !$order->getMeta('action_scheduler_id')) {
139 + if (!$order || $order->payment_status !== 'paid') {
135 140 return;
136 141 }
137 142
138 - $order->deleteMeta('action_scheduler_id');
143 + // Claim the run by deleting the meta and branching on the affected-row count.
144 + // The Action Scheduler worker and the receipt-page AJAX nudge
145 + // (IntegrationEventListener::runOrderActionsAjax) can arrive together, so a
146 + // read-then-delete would let both pass the guard and fire order_paid_done
147 + // twice. A single DELETE is atomic: MySQL hands the row to exactly one
148 + // caller, and the loser sees 0 rows and returns.
149 + if (!$order->deleteMeta('action_scheduler_id')) {
150 + return;
151 + }
139 152
140 153 $transaction = \FluentCart\App\Models\OrderTransaction::query()
141 154 ->where('order_id', $order->id)
142 155 ->where('status', \FluentCart\App\Helpers\Status::TRANSACTION_SUCCEEDED)
@@ -159,9 +172,8 @@
159 172 do_action('fluent_cart/order_paid_done', $eventData);
160 173
161 174 };
162 175 add_action('fluent_cart/order_paid_async_private_handle', $orderPaidAsyncHandler, 1, 1);
163 -add_action('fluent_cart/order_paid_ansyc_private_handle', $orderPaidAsyncHandler, 1, 1);
164 176
165 177
166 178 //
167 179 //$app->addAction('fluent_cart/orders_filter_customer', function ($query, $filters) {
@@ -175,8 +187,15 @@
175 187 }
176 188
177 189 \FluentCart\App\Modules\Subscriptions\SubscriptionModule::register();
178 190 \FluentCart\App\Modules\Shipping\ShippingModule::register();
191 +\FluentCart\App\Modules\StoreManagedRenewal\RenewalModule::register();
192 +(new \FluentCart\App\Hooks\Handlers\AttributesHandler())->register();
193 +(new \FluentCart\App\Hooks\Handlers\AdvancedVariationHandler())->register();
194 +
195 +// MCP (Model Context Protocol) — operator AI tools. Ships OFF; enabled in
196 +// Settings → Features & addon → MCP. See MCPInit::boot() for the bootstrap.
197 +\FluentCart\App\Modules\MCP\MCPInit::boot();
179 198
180 199 $app->ready(function () use ($app) {
181 200 \FluentCart\App\Models\Connection\ConnectionManager::connect($this->app);
182 201 });