PluginProbe ʕ •ᴥ•ʔ
OttoKit: All-in-One Automation Platform / 1.1.35
OttoKit: All-in-One Automation Platform v1.1.35
1.1.37 1.1.36 1.1.35 1.1.34 1.1.33 1.1.32 1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.9 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 1.0.25 1.0.26 1.0.27 1.0.28 1.0.29 1.0.30 1.0.31 1.0.32 1.0.33 1.0.34 1.0.35 1.0.36 1.0.37 1.0.38 1.0.39 1.0.40 1.0.41 1.0.42 1.0.43 1.0.44 1.0.45 1.0.46 1.0.47 1.0.48 1.0.49 1.0.50 1.0.51 1.0.52 1.0.53 1.0.54 1.0.55 1.0.56 1.0.57 1.0.58 1.0.59 1.0.60 1.0.61 1.0.62 1.0.63 1.0.64 1.0.65 1.0.66 1.0.67 1.0.68 1.0.69 1.0.7 1.0.70 1.0.71 1.0.72 1.0.73 1.0.74 1.0.75 1.0.76 1.0.77 1.0.78 1.0.79 1.0.8 1.0.80 1.0.81 1.0.82 1.0.83 1.0.84 1.0.85 1.0.86 1.0.87 1.0.88 1.0.89 1.0.9 1.0.90 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.20 1.1.21 1.1.22 1.1.23 1.1.24 1.1.25 1.1.26 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8
suretriggers / src / Integrations / woocommerce / actions / add-product-to-cart.php
suretriggers / src / Integrations / woocommerce / actions Last commit date
add-attribute-terms.php 9 months ago add-customer.php 10 months ago add-emails-to-coupon.php 9 months ago add-order-note.php 11 months ago add-product-attributes.php 9 months ago add-product-to-cart.php 9 months ago add-update-order-custom-fields.php 11 months ago apply-coupon.php 9 months ago check-cart-status.php 9 months ago check-if-order-is-renewal.php 5 months ago create-attribute.php 9 months ago create-bundle-product-order.php 7 months ago create-coupon-code.php 11 months ago create-multi-product-order.php 8 months ago create-new-order.php 11 months ago create-product-variation.php 1 year ago create-product.php 1 year ago create-variable-product.php 9 months ago delete-coupon.php 1 year ago delete-customer.php 9 months ago fetch-coupon-details.php 11 months ago find-orders-by-user-id.php 11 months ago get-all-customers.php 9 months ago get-all-products.php 9 months ago get-customer-by-email.php 9 months ago get-customer-by-id.php 9 months ago get-order-details-by-order-id.php 11 months ago get-order-type-by-order-id.php 5 months ago get-orders-by-email.php 9 months ago get-product-by-id.php 1 year ago list-all-order-notes.php 9 months ago list-all-orders.php 9 months ago remove-product-from-cart.php 9 months ago retrieve-coupons-totals.php 11 months ago retrieve-customers-totals.php 11 months ago retrieve-orders-totals.php 11 months ago retrieve-products-totals.php 11 months ago retrieve-refunds-list.php 11 months ago retrieve-reviews-totals.php 11 months ago retrieve-sales-report.php 11 months ago retrieve-top-sellers-report.php 11 months ago update-product-price.php 9 months ago update-product-stock-quantity.php 9 months ago update-status-of-order.php 11 months ago
add-product-to-cart.php
260 lines
1 <?php
2 /**
3 * AddProductToCart.
4 * php version 5.6
5 *
6 * @category AddProductToCart
7 * @package SureTriggers
8 * @author BSF <username@example.com>
9 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
10 * @link https://www.brainstormforce.com/
11 * @since 1.0.0
12 */
13
14 namespace SureTriggers\Integrations\Woocommerce\Actions;
15
16 use SureTriggers\Integrations\AutomateAction;
17 use SureTriggers\Traits\SingletonLoader;
18 use WC_Product;
19 use Exception;
20
21 /**
22 * AddProductToCart
23 *
24 * @category AddProductToCart
25 * @package SureTriggers
26 * @author BSF <username@example.com>
27 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
28 * @link https://www.brainstormforce.com/
29 * @since 1.0.0
30 */
31 class AddProductToCart extends AutomateAction {
32
33 /**
34 * Integration type.
35 *
36 * @var string
37 */
38 public $integration = 'WooCommerce';
39
40 /**
41 * Action name.
42 *
43 * @var string
44 */
45 public $action = 'wc_add_product_to_cart';
46
47 use SingletonLoader;
48
49 /**
50 * Register a action.
51 *
52 * @param array $actions actions.
53 * @return array
54 */
55 public function register( $actions ) {
56 $actions[ $this->integration ][ $this->action ] = [
57 'label' => __( 'Add Product to Cart', 'suretriggers' ),
58 'action' => 'wc_add_product_to_cart',
59 'function' => [ $this, 'action_listener' ],
60 ];
61 return $actions;
62 }
63
64 /**
65 * Action listener.
66 *
67 * @param int $user_id user_id.
68 * @param int $automation_id automation_id.
69 * @param array $fields fields.
70 * @param array $selected_options selectedOptions.
71 *
72 * @return void|array|bool
73 */
74 public function _action_listener( $user_id, $automation_id, $fields, $selected_options ) {
75 // Handle user identification from selected options.
76 if ( ! empty( $selected_options['user_id'] ) ) {
77 $user_id = intval( $selected_options['user_id'] );
78 } elseif ( ! empty( $selected_options['customer_email'] ) ) {
79 $user = get_user_by( 'email', sanitize_email( $selected_options['customer_email'] ) );
80 if ( $user ) {
81 $user_id = $user->ID;
82 }
83 }
84
85 // Check if WooCommerce is active.
86 if ( ! function_exists( 'WC' ) ) {
87 return [
88 'status' => 'error',
89 'message' => __( 'WooCommerce not available', 'suretriggers' ),
90 ];
91 }
92
93 // Set the current user context for cart operations.
94 wp_set_current_user( $user_id );
95
96 // Initialize WooCommerce components properly.
97 if ( ! WC()->session ) {
98 WC()->session = new \WC_Session_Handler();
99 WC()->session->init();
100 }
101
102 // Initialize customer.
103 if ( ! WC()->customer ) {
104 WC()->customer = new \WC_Customer( $user_id, true );
105 }
106
107 // Initialize cart for the user.
108 if ( ! WC()->cart ) {
109 WC()->cart = new \WC_Cart();
110 }
111
112 // Ensure cart is properly initialized.
113 WC()->cart->get_cart();
114
115 // Validate required fields.
116 foreach ( $fields as $field ) {
117 if ( array_key_exists( 'validationProps', $field ) && empty( $selected_options[ $field['name'] ] ) ) {
118 return [
119 'status' => 'error',
120 'message' => __( 'Required field is missing: ', 'suretriggers' ) . $field['name'],
121 ];
122 }
123 }
124
125 $product_id = intval( $selected_options['product_id'] );
126 $quantity = ! empty( $selected_options['quantity'] ) ? intval( $selected_options['quantity'] ) : 1;
127 $variation_id = ! empty( $selected_options['variation_id'] ) ? intval( $selected_options['variation_id'] ) : 0;
128 $variations = ! empty( $selected_options['variations'] ) ? $selected_options['variations'] : [];
129
130 if ( empty( $product_id ) ) {
131 return [
132 'status' => 'error',
133 'message' => __( 'Product ID is required', 'suretriggers' ),
134 ];
135 }
136
137 // Get the product.
138 $product = wc_get_product( $product_id );
139 if ( ! $product || ! $product instanceof WC_Product ) {
140 return [
141 'status' => 'error',
142 'message' => __( 'Product not found', 'suretriggers' ),
143 ];
144 }
145
146 // Check if product is purchasable.
147 if ( ! $product->is_purchasable() ) {
148 return [
149 'status' => 'error',
150 'message' => __( 'Product is not purchasable', 'suretriggers' ),
151 ];
152 }
153
154 // Handle variations for variable products.
155 $variation_data = [];
156 if ( $product->is_type( 'variable' ) ) {
157 if ( empty( $variation_id ) ) {
158 return [
159 'status' => 'error',
160 'message' => __( 'Variation ID is required for variable products', 'suretriggers' ),
161 ];
162 }
163
164 // Get variation product.
165 $variation = wc_get_product( $variation_id );
166 if ( ! $variation || ! $variation->exists() ) {
167 return [
168 'status' => 'error',
169 'message' => __( 'Product variation not found', 'suretriggers' ),
170 ];
171 }
172
173 // Process variation attributes.
174 if ( is_array( $variations ) ) {
175 foreach ( $variations as $key => $value ) {
176 $variation_data[ $key ] = sanitize_text_field( $value );
177 }
178 }
179 }
180
181 // Check stock availability.
182 if ( ! $product->has_enough_stock( $quantity ) ) {
183 return [
184 'status' => 'error',
185 'message' => __( 'Insufficient stock for the requested quantity', 'suretriggers' ),
186 ];
187 }
188
189 // Add product to cart with error handling.
190 try {
191 $cart_item_key = WC()->cart->add_to_cart(
192 $product_id,
193 $quantity,
194 $variation_id,
195 $variation_data
196 );
197
198 if ( $cart_item_key && is_string( $cart_item_key ) ) {
199 // Get cart item details.
200 $cart_item = WC()->cart->get_cart_item( $cart_item_key );
201
202 if ( ! $cart_item ) {
203 return [
204 'status' => 'error',
205 'message' => __( 'Failed to retrieve cart item details', 'suretriggers' ),
206 ];
207 }
208
209 // Calculate cart totals.
210 WC()->cart->calculate_totals();
211
212 // Get product details.
213 $product_name = $product->get_name();
214 $product_price = $product->get_price();
215
216 // Safely get cart totals.
217 $cart_total = method_exists( WC()->cart, 'get_total' ) ? WC()->cart->get_total() : '0';
218 $cart_subtotal = method_exists( WC()->cart, 'get_subtotal' ) ? WC()->cart->get_subtotal() : '0';
219 $cart_items_count = method_exists( WC()->cart, 'get_cart_contents_count' ) ? WC()->cart->get_cart_contents_count() : 0;
220
221 return [
222 'status' => 'success',
223 'message' => __( 'Product added to cart successfully', 'suretriggers' ),
224 'cart_item_key' => $cart_item_key,
225 'product_id' => $product_id,
226 'product_name' => $product_name,
227 'product_price' => $product_price,
228 'variation_id' => $variation_id,
229 'quantity' => $quantity,
230 'line_total' => isset( $cart_item['line_total'] ) ? $cart_item['line_total'] : '0',
231 'cart_total' => $cart_total,
232 'cart_subtotal' => $cart_subtotal,
233 'cart_items_count' => $cart_items_count,
234 'user_id' => $user_id,
235 ];
236 }
237 } catch ( Exception $e ) {
238 return [
239 'status' => 'error',
240 'message' => __( 'Error adding product to cart: ', 'suretriggers' ) . $e->getMessage(),
241 ];
242 }
243
244 // If we reach here, the cart_item_key was false/empty.
245 // Get WooCommerce notices for error details.
246 $notices = wc_get_notices( 'error' );
247 $error_message = ! empty( $notices ) ? $notices[0]['notice'] : __( 'Failed to add product to cart', 'suretriggers' );
248
249 // Clear notices to prevent them showing elsewhere.
250 wc_clear_notices();
251
252 return [
253 'status' => 'error',
254 'message' => $error_message,
255 ];
256 }
257 }
258
259 AddProductToCart::get_instance();
260