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