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