PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.13.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.13.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 3 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 3 years ago SubscriptionsController.php 3 years ago WebhookController.php 2 years ago
BuyPageController.php
220 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' => sc_initial_line_items( [ $line_item ] ),
118 ],
119 ]
120 );
121 }
122
123 // render the view.
124 return \SureCart::view( 'web/buy' )->with(
125 [
126 'product' => $this->model,
127 'terms_text' => $this->termsText(),
128 'mode' => $this->model->buyLink()->getMode(),
129 'store_name' => \SureCart::account()->name ?? get_bloginfo(),
130 'logo_url' => \SureCart::account()->brand->logo_url,
131 'logo_width' => \SureCart::settings()->get( 'buy_link_logo_width', '180px' ),
132 'user' => wp_get_current_user(),
133 'logout_link' => wp_logout_url( $request->getUrl() ),
134 'dashboard_link' => \SureCart::pages()->url( 'dashboard' ),
135 'enabled' => $this->model->buyLink()->isEnabled(),
136 'show_logo' => $this->model->buyLink()->templatePartEnabled( 'logo' ),
137 'show_terms' => $this->model->buyLink()->templatePartEnabled( 'terms' ),
138 'show_image' => $this->model->buyLink()->templatePartEnabled( 'image' ),
139 'show_description' => $this->model->buyLink()->templatePartEnabled( 'description' ),
140 'show_coupon' => $this->model->buyLink()->templatePartEnabled( 'coupon' ),
141 ]
142 );
143 }
144
145 /**
146 * Enqueue styles.
147 *
148 * @return void
149 */
150 public function styles() {
151 wp_enqueue_style(
152 'surecart/instant-checkout',
153 trailingslashit( \SureCart::core()->assets()->getUrl() ) . 'dist/templates/instant-checkout.css',
154 [],
155 filemtime( trailingslashit( plugin_dir_path( SURECART_PLUGIN_FILE ) ) . 'dist/templates/instant-checkout.css' ),
156 );
157
158 // add recaptcha if enabled.
159 if ( \SureCart::settings()->recaptcha()->isEnabled() ) {
160 wp_enqueue_script( 'surecart-google-recaptcha' );
161 }
162 }
163
164 /**
165 * Generate the terms html.
166 *
167 * @return string
168 */
169 public function termsText() {
170 $terms_url = \SureCart::account()->portal_protocol->terms_url;
171 $privacy_url = \SureCart::account()->portal_protocol->privacy_url;
172
173 if ( ! empty( $terms_url ) && ! empty( $privacy_url ) ) {
174 return sprintf(
175 // 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.
176 __( "I agree to %1$1s's %2$2sTerms%3$3s and %4$4sPrivacy Policy%5$5s", 'surecart' ),
177 esc_html( \SureCart::account()->name ),
178 '<a href="' . esc_url( $terms_url ) . '" target="_blank">',
179 '</a>',
180 '<a href="' . esc_url( $privacy_url ) . '" target="_blank">',
181 '</a>'
182 );
183 }
184
185 if ( $terms_url ) {
186 return sprintf(
187 // translators: %1$1s is the store name, %2$2s is the opening anchor tag, %3$3s is the closing anchor tag.
188 __( "I agree to %1$1s's %2$2sTerms%3$3s", 'surecart' ),
189 esc_html( \SureCart::account()->name ),
190 '<a href="' . esc_url( $terms_url ) . '" target="_blank">',
191 '</a>'
192 );
193 }
194
195 if ( $privacy_url ) {
196 return sprintf(
197 // translators: %1$1s is the store name, %2$2s is the opening anchor tag, %3$3s is the closing anchor tag.
198 __( "I agree to %1$1s's %2$2sPrivacy Policy%3$3s", 'surecart' ),
199 esc_html( \SureCart::account()->name ),
200 '<a href="' . esc_url( $privacy_url ) . '" target="_blank">',
201 '</a>'
202 );
203 }
204
205 return '';
206 }
207
208 /**
209 * Do not persist the cart on the buy page.
210 *
211 * @param array $data ScData array.
212 *
213 * @return array
214 */
215 public function doNotPersistCart( $data ) {
216 $data['do_not_persist_cart'] = true;
217 return $data;
218 }
219 }
220