.gitkeep
3 years ago
BuyPageController.php
2 years ago
DashboardController.php
3 years ago
ProductPageController.php
3 years ago
ProductTypePageController.php
3 years ago
PurchaseController.php
3 years ago
SubscriptionsController.php
3 years ago
WebhookController.php
2 years ago
BuyPageController.php
200 lines
| 1 | <?php |
| 2 | namespace SureCart\Controllers\Web; |
| 3 | |
| 4 | use SureCart\Support\Currency; |
| 5 | |
| 6 | /** |
| 7 | * Handles webhooks |
| 8 | */ |
| 9 | class BuyPageController extends ProductTypePageController { |
| 10 | /** |
| 11 | * Handle filters. |
| 12 | * |
| 13 | * @return void |
| 14 | */ |
| 15 | public function filters() { |
| 16 | parent::filters(); |
| 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() { |
| 31 | if ( empty( $this->product->product_medias->data ) || is_wp_error( $this->product->product_medias->data ) ) { |
| 32 | return; |
| 33 | } |
| 34 | $product_media = $this->product->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->product->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->product->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->product = \SureCart\Models\Product::with( [ 'image', 'prices', 'product_medias', 'product_media.media' ] )->find( $id ); |
| 73 | if ( is_wp_error( $this->product ) ) { |
| 74 | return $this->handleError( $this->product ); |
| 75 | } |
| 76 | |
| 77 | // if this buy page is not enabled, check read permissions. |
| 78 | if ( ! $this->product->buyLink()->isEnabled() && ! current_user_can( 'read_sc_products' ) ) { |
| 79 | return $this->notFound(); |
| 80 | } |
| 81 | |
| 82 | // slug changed or we are using the id, redirect. |
| 83 | if ( $this->product->slug !== $id ) { |
| 84 | return \SureCart::redirect()->to( esc_url_raw( \SureCart::routeUrl( 'product', [ 'id' => $this->product->slug ] ) ) ); |
| 85 | } |
| 86 | |
| 87 | // get active prices. |
| 88 | $active_prices = $this->product->activePrices(); |
| 89 | |
| 90 | // must have at least one active price. |
| 91 | if ( empty( $active_prices[0] ) ) { |
| 92 | return $this->notFound(); |
| 93 | } |
| 94 | |
| 95 | // prevent 404 redirects by 3rd party plugins. |
| 96 | $_SERVER['REQUEST_URI'] = $request->getUrl(); |
| 97 | |
| 98 | // add the filters. |
| 99 | $this->filters(); |
| 100 | |
| 101 | // render the view. |
| 102 | return \SureCart::view( 'web/buy' )->with( |
| 103 | [ |
| 104 | 'product' => $this->product, |
| 105 | 'prices' => $active_prices, |
| 106 | 'selected_price' => $active_prices[0] ?? null, |
| 107 | 'terms_text' => $this->termsText(), |
| 108 | 'mode' => $this->product->buyLink()->getMode(), |
| 109 | 'store_name' => \SureCart::account()->name ?? get_bloginfo(), |
| 110 | 'logo_url' => \SureCart::account()->brand->logo_url, |
| 111 | 'logo_width' => \SureCart::settings()->get( 'buy_link_logo_width', '180px' ), |
| 112 | 'user' => wp_get_current_user(), |
| 113 | 'logout_link' => wp_logout_url( $request->getUrl() ), |
| 114 | 'dashboard_link' => \SureCart::pages()->url( 'dashboard' ), |
| 115 | 'enabled' => $this->product->buyLink()->isEnabled(), |
| 116 | 'show_logo' => $this->product->buyLink()->templatePartEnabled( 'logo' ), |
| 117 | 'show_terms' => $this->product->buyLink()->templatePartEnabled( 'terms' ), |
| 118 | 'show_image' => $this->product->buyLink()->templatePartEnabled( 'image' ), |
| 119 | 'show_description' => $this->product->buyLink()->templatePartEnabled( 'description' ), |
| 120 | 'show_coupon' => $this->product->buyLink()->templatePartEnabled( 'coupon' ), |
| 121 | ] |
| 122 | ); |
| 123 | } |
| 124 | |
| 125 | /** |
| 126 | * Enqueue styles. |
| 127 | * |
| 128 | * @return void |
| 129 | */ |
| 130 | public function styles() { |
| 131 | wp_enqueue_style( |
| 132 | 'surecart/instant-checkout', |
| 133 | trailingslashit( \SureCart::core()->assets()->getUrl() ) . 'dist/templates/instant-checkout.css', |
| 134 | [], |
| 135 | filemtime( trailingslashit( plugin_dir_path( SURECART_PLUGIN_FILE ) ) . 'dist/templates/instant-checkout.css' ), |
| 136 | ); |
| 137 | |
| 138 | // add recaptcha if enabled. |
| 139 | if ( \SureCart::settings()->recaptcha()->isEnabled() ) { |
| 140 | wp_enqueue_script( 'surecart-google-recaptcha' ); |
| 141 | } |
| 142 | } |
| 143 | |
| 144 | /** |
| 145 | * Generate the terms html. |
| 146 | * |
| 147 | * @return string |
| 148 | */ |
| 149 | public function termsText() { |
| 150 | $terms_url = \SureCart::account()->portal_protocol->terms_url; |
| 151 | $privacy_url = \SureCart::account()->portal_protocol->privacy_url; |
| 152 | |
| 153 | if ( ! empty( $terms_url ) && ! empty( $privacy_url ) ) { |
| 154 | return sprintf( |
| 155 | // 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. |
| 156 | __( "I agree to %1$1s's %2$2sTerms%3$3s and %4$4sPrivacy Policy%5$5s", 'surecart' ), |
| 157 | esc_html( \SureCart::account()->name ), |
| 158 | '<a href="' . esc_url( $terms_url ) . '" target="_blank">', |
| 159 | '</a>', |
| 160 | '<a href="' . esc_url( $privacy_url ) . '" target="_blank">', |
| 161 | '</a>' |
| 162 | ); |
| 163 | } |
| 164 | |
| 165 | if ( $terms_url ) { |
| 166 | return sprintf( |
| 167 | // translators: %1$1s is the store name, %2$2s is the opening anchor tag, %3$3s is the closing anchor tag. |
| 168 | __( "I agree to %1$1s's %2$2sTerms%3$3s", 'surecart' ), |
| 169 | esc_html( \SureCart::account()->name ), |
| 170 | '<a href="' . esc_url( $terms_url ) . '" target="_blank">', |
| 171 | '</a>' |
| 172 | ); |
| 173 | } |
| 174 | |
| 175 | if ( $privacy_url ) { |
| 176 | return sprintf( |
| 177 | // translators: %1$1s is the store name, %2$2s is the opening anchor tag, %3$3s is the closing anchor tag. |
| 178 | __( "I agree to %1$1s's %2$2sPrivacy Policy%3$3s", 'surecart' ), |
| 179 | esc_html( \SureCart::account()->name ), |
| 180 | '<a href="' . esc_url( $privacy_url ) . '" target="_blank">', |
| 181 | '</a>' |
| 182 | ); |
| 183 | } |
| 184 | |
| 185 | return ''; |
| 186 | } |
| 187 | |
| 188 | /** |
| 189 | * Do not persist the cart on the buy page. |
| 190 | * |
| 191 | * @param array $data ScData array. |
| 192 | * |
| 193 | * @return array |
| 194 | */ |
| 195 | public function doNotPersistCart( $data ) { |
| 196 | $data['do_not_persist_cart'] = true; |
| 197 | return $data; |
| 198 | } |
| 199 | } |
| 200 |