PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.19.4
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.19.4
4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.0 4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 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.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 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 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / Cart / CartService.php
surecart / app / src / Cart Last commit date
CartService.php 2 years ago CartServiceProvider.php 3 years ago
CartService.php
308 lines
1 <?php
2
3 namespace SureCart\Cart;
4
5 use SureCart\Models\Form;
6
7 /**
8 * The cart service.
9 */
10 class CartService {
11 /**
12 * Bootstrap the cart.
13 *
14 * @return void
15 */
16 public function bootstrap() {
17 add_filter( 'wp_nav_menu_items', [ $this, 'addCartMenu' ], 10, 2 );
18
19 // only load scripts if cart is enabled.
20 if ( $this->isCartEnabled() ) {
21 add_action(
22 'wp_enqueue_scripts',
23 function () {
24 \SureCart::assets()->enqueueComponents();
25 }
26 );
27
28 $form = $this->getForm();
29 if ( empty( $form->ID ) ) {
30 return;
31 }
32 $state = sc_initial_state();
33
34 if ( empty( $state['checkout']['formId'] ) ) {
35 sc_initial_state(
36 array_filter(
37 [
38 'checkout' => [
39 'formId' => $form->ID,
40 'mode' => Form::getMode( $form->ID ),
41 'persist' => 'browser',
42 ],
43 ]
44 )
45 );
46 }
47 add_action( 'wp_footer', [ $this, 'renderCartComponent' ] );
48 }
49 }
50
51 /**
52 * Get the icon name saved in the settings
53 *
54 * @return string
55 */
56 public function getIconNameFromSettings() {
57 return get_option( 'surecart_cart_icon', 'shopping-bag' );
58 }
59
60 /**
61 * Get the icon.
62 *
63 * @param 'menu'|'floating' $type Menu type.
64 *
65 * @return string
66 */
67 public function getIcon( $type ) {
68 $icon = '<sc-icon name="' . $this->getIconNameFromSettings() . '"></sc-icon>';
69
70 /**
71 * Allow filtering of the cart menu icon.
72 *
73 * @param string $icon The icon.
74 * @param string $mode The icon position.
75 */
76 return apply_filters( 'sc_cart_menu_icon', $icon, $type );
77 }
78
79
80 /**
81 * Get selected ids.
82 *
83 * @return array|false
84 */
85 public function getSelectedIds() {
86 return get_option( 'surecart_cart_menu_selected_ids', false );
87 }
88
89 /**
90 * Get icon type.
91 *
92 * @return array|false
93 */
94 public function getIconType() {
95 return get_option( 'surecart_cart_icon_type', 'floating_icon' );
96 }
97
98 /**
99 * Check if cart menu is always shown.
100 *
101 * @return boolean
102 */
103 public function isAlwaysShown() {
104 return (bool) get_option( 'surecart_cart_menu_always_shown', true );
105 }
106
107 /**
108 * Is the cart enabled?
109 */
110 public function isCartEnabled() {
111 return ! (bool) get_option( 'sc_slide_out_cart_disabled', false );
112 }
113
114 /**
115 * Get cart menu alignment.
116 *
117 * @return 'left'|'right
118 */
119 public function getAlignment() {
120 return (string) get_option( 'surecart_cart_menu_alignment', 'right' );
121 }
122
123 /**
124 * Get mode.
125 *
126 * @return string
127 */
128 public function getMode() {
129 $form = $this->getForm();
130 return Form::getMode( $form->ID );
131 }
132
133 /**
134 * Add cart to menu.
135 *
136 * @param array $items Menu items.
137 * @param object $args Menu args.
138 *
139 * @return array
140 */
141 public function addCartMenu( $items, $args ) {
142 $id = is_int( $args->menu ) ? $args->menu : ( $args->menu->term_id ?? false );
143
144 // if there is no id, or the menu icon is not enabled, or the cart is disabled, return.
145 if ( ! $id || ! $this->isMenuIconEnabled( $id ) || ! $this->isCartEnabled() ) {
146 return $items;
147 }
148
149 $cart_menu_alignment = $this->getAlignment();
150
151 $menu = $this->menuItemTemplate();
152
153 // left or right.
154 $items = 'right' === $cart_menu_alignment ? $items . $menu : $menu . $items;
155
156 return $items;
157 }
158
159 public function menuItemTemplate() {
160 $form = $this->getForm();
161 $mode = $this->getMode();
162
163 ob_start(); ?>
164 <li class='menu-item'>
165 <a href="<?php echo esc_attr( \SureCart::pages()->url( 'checkout' ) ); ?>" class="menu-link" tabindex="-1">
166 <sc-cart-button
167 cart-menu-always-shown='<?php echo esc_attr( $this->isAlwaysShown() ? 'true' : 'false' ); ?>'
168 form-id='<?php echo esc_attr( $form->ID ); ?>'
169 mode='<?php echo esc_attr( $mode ); ?>'>
170 <?php echo wp_kses_post( $this->getIcon( 'menu' ) ); ?>
171 </sc-cart-button>
172 </a>
173 </li>
174 <?php
175 return ob_get_clean();
176 }
177
178 /**
179 * Get the cart template.
180 *
181 * @return string
182 */
183 public function cartTemplate() {
184 $form = $this->getForm();
185 if ( empty( $form->ID ) ) {
186 return '';
187 }
188
189 // get cart block.
190 $template = get_block_template( 'surecart/surecart//cart', 'wp_template_part' );
191 if ( empty( $template->content ) ) {
192 return;
193 }
194
195 // get first block attributes.
196 $template_blocks = parse_blocks( $template->content );
197 $post_content_block = wp_get_first_block( $template_blocks, 'surecart/cart' );
198 $attributes = isset( $post_content_block['attrs'] ) ? $post_content_block['attrs'] : [];
199
200 ob_start();
201 ?>
202
203 <sc-cart
204 id="sc-cart"
205 header="<?php esc_attr_e( 'Cart', 'surecart' ); ?>"
206 checkout-link="<?php echo esc_attr( \SureCart::pages()->url( 'checkout' ) ); ?>"
207 style="font-size: 16px; --sc-z-index-drawer: 999999; --sc-drawer-size: <?php echo esc_attr( $attributes['width'] ?? '500px' ); ?>"
208 >
209 <?php
210 echo wp_kses_post( do_blocks( $template->content ) );
211 ?>
212 </sc-cart>
213
214 <?php if ( $this->isFloatingIconEnabled() ) : ?>
215 <sc-cart-icon style="font-size: 16px">
216 <?php echo wp_kses_post( $this->getIcon( 'floating' ) ); ?>
217 </sc-cart-icon>
218 <?php endif; ?>
219
220 <?php
221 return trim( preg_replace( '/\s+/', ' ', ob_get_clean() ) );
222 }
223
224 /**
225 * Render the cart components.
226 *
227 * @return void
228 */
229 public function renderCartComponent() {
230 $form = $this->getForm();
231 if ( empty( $form->ID ) ) {
232 return;
233 }
234 $template = $this->cartTemplate();
235 $state = sc_initial_state();
236
237 if ( empty( $state['checkout']['formId'] ) ) {
238 sc_initial_state(
239 array_filter(
240 [
241 'checkout' => [
242 'formId' => $form->ID,
243 ],
244 ]
245 )
246 );
247 }
248 ?>
249
250 <sc-cart-loader
251 template='<?php echo esc_attr( $template ); ?>'>
252 </sc-cart-loader>
253 <?php
254 }
255
256 /**
257 * Get the form
258 *
259 * @return \WP_Post The default form post.
260 */
261 public function getForm() {
262 return \SureCart::forms()->getDefault();
263 }
264
265 /**
266 * Check if floating cart icon is enabled
267 *
268 * @return string
269 */
270 public function isFloatingIconEnabled() {
271 $cart_icon_type = (string) get_option( 'surecart_cart_icon_type', 'floating_icon' );
272 return in_array( $cart_icon_type, [ 'floating_icon', 'both' ] );
273 }
274
275 /**
276 * Check if menu cart icon is enabled
277 *
278 * @param integer $term_id Term ID.
279 * @return bool
280 */
281 public function isMenuIconEnabled( $term_id ) {
282 $cart_menu_ids = (array) $this->getSelectedIds();
283 $cart_icon_type = (string) $this->getIconType();
284 if ( ! in_array( $cart_icon_type, [ 'menu_icon', 'both' ] ) ) {
285 return;
286 }
287 return in_array( $term_id, $cart_menu_ids );
288 }
289
290 /**
291 * Remove deprecated cart content.
292 *
293 * @param string $content Cart content.
294 *
295 * @return string
296 */
297 public static function removeDeprecatedCartContent( $content ) {
298 $review_cart_present = strpos( $content, 'wp:surecart/cart-header {"text":"Review Your Cart"' );
299 $my_cart_present = strpos( $content, '<sc-cart-header><span>My Cart</span></sc-cart-header>' );
300
301 if ( false !== $review_cart_present && false !== $my_cart_present ) {
302 $content = str_replace( '<sc-cart-header><span>My Cart</span></sc-cart-header>', '<sc-cart-header><span>Review Your Cart</span></sc-cart-header>', $content );
303 }
304
305 return $content;
306 }
307 }
308