PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.8.3
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.8.3
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 / Controllers / Web / BuyPageController.php
surecart / app / src / Controllers / Web Last commit date
.gitkeep 4 years ago BasePageController.php 2 years ago BuyPageController.php 2 years ago CollectionPageController.php 2 years ago DashboardController.php 3 years ago ProductPageController.php 2 years ago PurchaseController.php 4 years ago SubscriptionsController.php 4 years ago WebhookController.php 2 years ago
BuyPageController.php
233 lines
1 <?php
2 namespace SureCart\Controllers\Web;
3
4 /**
5 * Handles webhooks
6 */
7 class BuyPageController extends BasePageController {
8 /**
9 * Handle filters.
10 *
11 * @return void
12 */
13 public function filters(): void {
14 parent::filters();
15 // Add edit product link to admin bar.
16 add_action( 'admin_bar_menu', [ $this, 'addEditProductLink' ], 99 );
17 // do not persist the cart for this page.
18 add_filter( 'surecart-components/scData', [ $this, 'doNotPersistCart' ], 10, 2 );
19 // add styles.
20 add_action( 'wp_enqueue_scripts', [ $this, 'styles' ] );
21 // add scripts.
22 add_action( 'wp_enqueue_scripts', [ $this, 'scripts' ] );
23 }
24
25 /**
26 * Preload the image above the fold.
27 *
28 * @return void
29 */
30 public function preloadImage(): void {
31 if ( empty( $this->model->product_medias->data ) || is_wp_error( $this->model->product_medias->data ) ) {
32 return;
33 }
34 $product_media = $this->model->product_medias->data[0];
35 ?>
36 <link rel="preload" fetchpriority="high" as="image" href="<?php echo esc_url( $product_media->getUrl( 450 ) ); ?>">
37 <?php
38 }
39
40 /**
41 * Add edit links
42 *
43 * @param \WP_Admin_bar $wp_admin_bar The admin bar.
44 *
45 * @return void
46 */
47 public function addEditProductLink( $wp_admin_bar ) {
48 if ( empty( $this->model->id ) ) {
49 return;
50 }
51 $wp_admin_bar->add_node(
52 [
53 'id' => 'edit',
54 'title' => __( 'Edit Product', 'surecart' ),
55 'href' => esc_url( \SureCart::getUrl()->edit( 'product', $this->model->id ) ),
56 ]
57 );
58 }
59
60 /**
61 * Show the product page
62 *
63 * @param \SureCartCore\Requests\RequestInterface $request Request.
64 * @param \SureCartCore\View $view View.
65 * @param string $id The id of the product.
66 * @return function
67 */
68 public function show( $request, $view, $id ) {
69 $id = get_query_var( 'sc_checkout_product_id' );
70
71 // fetch the product by id/slug.
72 $this->model = \SureCart\Models\Product::with( [ 'image', 'prices', 'product_medias', 'product_media.media', 'variants', 'variant_options' ] )->find( $id );
73
74 if ( is_wp_error( $this->model ) ) {
75 return $this->handleError( $this->model );
76 }
77
78 // if this buy page is not enabled, check read permissions.
79 if ( ! $this->model->buyLink()->isEnabled() && ! current_user_can( 'read_sc_products' ) ) {
80 return $this->notFound();
81 }
82
83 // slug changed or we are using the id, redirect.
84 if ( $this->model->slug !== $id ) {
85 return \SureCart::redirect()->to( esc_url_raw( \SureCart::routeUrl( 'product', [ 'id' => $this->model->slug ] ) ) );
86 }
87
88 // get active prices.
89 $active_prices = $this->model->activePrices();
90
91 // must have at least one active price.
92 if ( empty( $active_prices[0] ) ) {
93 return $this->notFound();
94 }
95
96 // prevent 404 redirects by 3rd party plugins.
97 $_SERVER['REQUEST_URI'] = $request->getUrl();
98
99 // add the filters.
100 $this->filters();
101
102 // prepare data.
103 $this->model = $this->model->withActiveAndSortedPrices();
104 $first_variant_with_stock = $this->model->getFirstVariantWithStock();
105
106 if ( ! empty( $this->model->prices->data[0]->id ) ) {
107 $line_item = array_merge(
108 [
109 'price_id' => $this->model->prices->data[0]->id,
110 'quantity' => 1,
111 ],
112 ! empty( $first_variant_with_stock->id ) ? [ 'variant_id' => $first_variant_with_stock->id ] : []
113 );
114 sc_initial_state(
115 [
116 'checkout' => [
117 'initialLineItems' => array_merge(
118 $this->getExistingLineItems(),
119 [ $line_item ]
120 ),
121 ],
122 ]
123 );
124 }
125
126 // render the view.
127 return \SureCart::view( 'web/buy' )->with(
128 [
129 'product' => $this->model,
130 'terms_text' => $this->termsText(),
131 'mode' => $this->model->buyLink()->getMode(),
132 'store_name' => \SureCart::account()->name ?? get_bloginfo(),
133 'logo_url' => \SureCart::account()->brand->logo_url,
134 'logo_width' => \SureCart::settings()->get( 'buy_link_logo_width', '180px' ),
135 'user' => wp_get_current_user(),
136 'logout_link' => wp_logout_url( $request->getUrl() ),
137 'dashboard_link' => \SureCart::pages()->url( 'dashboard' ),
138 'enabled' => $this->model->buyLink()->isEnabled(),
139 'show_logo' => $this->model->buyLink()->templatePartEnabled( 'logo' ),
140 'show_terms' => $this->model->buyLink()->templatePartEnabled( 'terms' ),
141 'show_image' => $this->model->buyLink()->templatePartEnabled( 'image' ),
142 'show_description' => $this->model->buyLink()->templatePartEnabled( 'description' ),
143 'show_coupon' => $this->model->buyLink()->templatePartEnabled( 'coupon' ),
144 ]
145 );
146 }
147
148 /**
149 * Get any existing line items.
150 *
151 * @return array
152 */
153 public function getExistingLineItems() {
154 $initial = \SureCart::state()->getData();
155 return ! empty( $initial['checkout']['initialLineItems'] ) ? $initial['checkout']['initialLineItems'] : [];
156 }
157
158 /**
159 * Enqueue styles.
160 *
161 * @return void
162 */
163 public function styles() {
164 wp_enqueue_style(
165 'surecart/instant-checkout',
166 trailingslashit( \SureCart::core()->assets()->getUrl() ) . 'dist/templates/instant-checkout.css',
167 [],
168 filemtime( trailingslashit( plugin_dir_path( SURECART_PLUGIN_FILE ) ) . 'dist/templates/instant-checkout.css' ),
169 );
170
171 // add recaptcha if enabled.
172 if ( \SureCart::settings()->recaptcha()->isEnabled() ) {
173 wp_enqueue_script( 'surecart-google-recaptcha' );
174 }
175 }
176
177 /**
178 * Generate the terms html.
179 *
180 * @return string
181 */
182 public function termsText() {
183 $terms_url = \SureCart::account()->portal_protocol->terms_url;
184 $privacy_url = \SureCart::account()->portal_protocol->privacy_url;
185
186 if ( ! empty( $terms_url ) && ! empty( $privacy_url ) ) {
187 return sprintf(
188 // translators: %1$1s is the store name, %2$2s is the opening anchor tag, %3$3s is the closing anchor tag, %4$4s is the opening anchor tag, %5$5s is the closing anchor tag.
189 __( "I agree to %1$1s's %2$2sTerms%3$3s and %4$4sPrivacy Policy%5$5s", 'surecart' ),
190 esc_html( \SureCart::account()->name ),
191 '<a href="' . esc_url( $terms_url ) . '" target="_blank">',
192 '</a>',
193 '<a href="' . esc_url( $privacy_url ) . '" target="_blank">',
194 '</a>'
195 );
196 }
197
198 if ( $terms_url ) {
199 return sprintf(
200 // translators: %1$1s is the store name, %2$2s is the opening anchor tag, %3$3s is the closing anchor tag.
201 __( "I agree to %1$1s's %2$2sTerms%3$3s", 'surecart' ),
202 esc_html( \SureCart::account()->name ),
203 '<a href="' . esc_url( $terms_url ) . '" target="_blank">',
204 '</a>'
205 );
206 }
207
208 if ( $privacy_url ) {
209 return sprintf(
210 // translators: %1$1s is the store name, %2$2s is the opening anchor tag, %3$3s is the closing anchor tag.
211 __( "I agree to %1$1s's %2$2sPrivacy Policy%3$3s", 'surecart' ),
212 esc_html( \SureCart::account()->name ),
213 '<a href="' . esc_url( $privacy_url ) . '" target="_blank">',
214 '</a>'
215 );
216 }
217
218 return '';
219 }
220
221 /**
222 * Do not persist the cart on the buy page.
223 *
224 * @param array $data ScData array.
225 *
226 * @return array
227 */
228 public function doNotPersistCart( $data ) {
229 $data['do_not_persist_cart'] = true;
230 return $data;
231 }
232 }
233