.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 |