BlockTemplatesService.php
1 year ago
CollectionTemplateService.php
1 year ago
TemplatesService.php
1 year ago
TemplatesServiceProvider.php
1 year ago
UpsellTemplatesService.php
1 year ago
UpsellTemplatesService.php
206 lines
| 1 | <?php |
| 2 | |
| 3 | declare(strict_types=1); |
| 4 | |
| 5 | namespace SureCart\WordPress\Templates; |
| 6 | |
| 7 | use SureCartVendors\Pimple\Container; |
| 8 | |
| 9 | /** |
| 10 | * The Upsell template service. |
| 11 | */ |
| 12 | class UpsellTemplatesService { |
| 13 | /** |
| 14 | * The service container. |
| 15 | * |
| 16 | * @var Container $container |
| 17 | */ |
| 18 | private Container $container; |
| 19 | |
| 20 | /** |
| 21 | * The template file/name associations. |
| 22 | * |
| 23 | * @var array |
| 24 | */ |
| 25 | private array $templates = []; |
| 26 | |
| 27 | /** |
| 28 | * The post type for the templates. |
| 29 | * |
| 30 | * @var string |
| 31 | */ |
| 32 | private string $post_type = 'sc_upsell'; |
| 33 | |
| 34 | /** |
| 35 | * SureCart plugin slug. |
| 36 | * |
| 37 | * This is used to save templates to the DB which are stored against this value in the wp_terms table. |
| 38 | * |
| 39 | * @var string |
| 40 | */ |
| 41 | const PLUGIN_SLUG = 'surecart/surecart'; |
| 42 | |
| 43 | /** |
| 44 | * Get things going. |
| 45 | * |
| 46 | * @param array $container The service container. |
| 47 | * @param array $templates The template file/name associations. |
| 48 | */ |
| 49 | public function __construct( $container, $templates ) { |
| 50 | $this->container = $container; |
| 51 | $this->templates = $templates; |
| 52 | } |
| 53 | |
| 54 | /** |
| 55 | * Bootstrap actions and filters. |
| 56 | * |
| 57 | * @return void |
| 58 | */ |
| 59 | public function bootstrap() { |
| 60 | add_filter( 'theme_' . $this->post_type . '_templates', [ $this, 'addTemplates' ] ); |
| 61 | add_filter( 'template_include', [ $this, 'includeTemplate' ], 9 ); |
| 62 | |
| 63 | // Upsell page query overrides. |
| 64 | add_filter( 'posts_pre_query', [ $this, 'overrideUpsellPostQuery' ], 10, 2 ); |
| 65 | add_filter( 'query_vars', [ $this, 'addCurrentUpsellQueryVar' ] ); |
| 66 | } |
| 67 | |
| 68 | /** |
| 69 | * Add surecart_current_upsell to list of query vars. |
| 70 | * |
| 71 | * @param array $vars The query vars. |
| 72 | * @return array |
| 73 | */ |
| 74 | public function addCurrentUpsellQueryVar( array $vars ): array { |
| 75 | $vars[] = 'surecart_current_upsell'; |
| 76 | return $vars; |
| 77 | } |
| 78 | |
| 79 | /** |
| 80 | * Filters the posts array before the query takes place to return a product post. |
| 81 | * Return a non-null value to bypass WordPress' default post queries. |
| 82 | * |
| 83 | * Filtering functions that require pagination information are encouraged to set |
| 84 | * the `found_posts` and `max_num_pages` properties of the WP_Query object, |
| 85 | * passed to the filter by reference. If WP_Query does not perform a database |
| 86 | * query, it will not have enough information to generate these values itself. |
| 87 | * |
| 88 | * @param WP_Post[]|int[]|null $posts Return an array of post data to short-circuit WP's query, |
| 89 | * or null to allow WP to run its normal queries. |
| 90 | * @param \WP_Query $wp_query The WP_Query instance (passed by reference). |
| 91 | * |
| 92 | * @return WP_Post[]|null Array of post data, or null to allow WP to run its normal queries. |
| 93 | */ |
| 94 | public function overrideUpsellPostQuery( $posts, \WP_Query $wp_query ) { |
| 95 | $upsell_id = isset( $wp_query->query['sc_upsell_id'] ) ? $wp_query->query['sc_upsell_id'] : null; |
| 96 | if ( ! $upsell_id ) { |
| 97 | return $posts; |
| 98 | } |
| 99 | |
| 100 | $upsell = \SureCart\Models\Upsell::with( [ 'price' ] )->find( $upsell_id ); |
| 101 | if ( is_wp_error( $upsell ) ) { |
| 102 | $wp_query->is_404 = true; |
| 103 | return $posts; |
| 104 | } |
| 105 | |
| 106 | set_query_var( 'surecart_current_upsell', $upsell ); |
| 107 | |
| 108 | $product = \SureCart\Models\Product::with( [ 'prices', 'image', 'variants', 'variant_options' ] )->find( $upsell->price->product ?? '' ); |
| 109 | set_query_var( 'surecart_current_product', $product ); |
| 110 | $content = wp_is_block_theme() ? $upsell->template->content : $upsell->template_part->content; |
| 111 | |
| 112 | // create a fake post for the upsell. |
| 113 | $post = new \stdClass(); |
| 114 | $post->post_title = $product->name; |
| 115 | $post->post_name = $upsell->id; |
| 116 | $post->post_content = '<div>' . ( $content ?? '' ) . '</div>'; |
| 117 | $post->post_status = 'publish'; |
| 118 | $post->post_type = $this->post_type; |
| 119 | $post->sc_id = $upsell->id; |
| 120 | $post->upsell = $upsell; |
| 121 | $post->product = $product; |
| 122 | $post->post_author = 1; |
| 123 | $post->post_parent = 0; |
| 124 | $post->comment_count = 0; |
| 125 | $post->comment_status = 'closed'; |
| 126 | $post->ping_status = 'closed'; |
| 127 | $post->post_password = ''; |
| 128 | $post->post_excerpt = ''; |
| 129 | $post->post_date = ( new \DateTime( "@$upsell->created_at" ) )->setTimezone( new \DateTimeZone( wp_timezone_string() ) )->format( 'Y-m-d H:i:s' ); |
| 130 | $post->post_date_gmt = date_i18n( 'Y-m-d H:i:s', $upsell->created_at, true ); |
| 131 | $post->post_modified = ( new \DateTime( "@$upsell->updated_at" ) )->setTimezone( new \DateTimeZone( wp_timezone_string() ) )->format( 'Y-m-d H:i:s' ); |
| 132 | $post->post_modified_gmt = date_i18n( 'Y-m-d H:i:s', $upsell->updated_at, true ); |
| 133 | $post->ID = 999999999; |
| 134 | $posts = array( $post ); |
| 135 | |
| 136 | $wp_query->found_posts = 1; |
| 137 | $wp_query->max_num_pages = 1; |
| 138 | $wp_query->is_singular = true; |
| 139 | $wp_query->is_single = true; |
| 140 | $wp_query->is_archive = false; |
| 141 | $wp_query->is_tax = false; |
| 142 | $wp_query->is_home = false; |
| 143 | $wp_query->is_search = false; |
| 144 | $wp_query->is_404 = false; |
| 145 | $wp_query->queried_object = $post; |
| 146 | $wp_query->queried_object_id = $post->ID; |
| 147 | |
| 148 | return $posts; |
| 149 | } |
| 150 | |
| 151 | /** |
| 152 | * Add the templates. to the existing templates. |
| 153 | * |
| 154 | * @param array $posts_templates Existing templates. |
| 155 | * |
| 156 | * @return array |
| 157 | */ |
| 158 | public function addTemplates( array $posts_templates ): array { |
| 159 | return array_merge( $posts_templates, $this->templates ); |
| 160 | } |
| 161 | |
| 162 | /** |
| 163 | * Include the template if it is set. |
| 164 | * |
| 165 | * @param string $template Template url. |
| 166 | * |
| 167 | * @return string |
| 168 | */ |
| 169 | public function includeTemplate( string $template ): string { |
| 170 | global $post; |
| 171 | $id = $post->ID ?? null; |
| 172 | |
| 173 | // if block theme, short circuit and return template-canvas probably. |
| 174 | if ( wp_is_block_theme() ) { |
| 175 | return $template; |
| 176 | } |
| 177 | |
| 178 | // check for upsell and use the template id. |
| 179 | $upsell = get_query_var( 'surecart_current_upsell' ); |
| 180 | |
| 181 | if ( empty( $upsell ) ) { |
| 182 | return $template; |
| 183 | } |
| 184 | |
| 185 | if ( ! empty( $upsell->metadata->wp_template_id ) ) { |
| 186 | $page_template = $upsell->metadata->wp_template_id; |
| 187 | } else { |
| 188 | $page_template = get_post_meta( $id, '_wp_page_template', true ); |
| 189 | } |
| 190 | |
| 191 | // if the set template does not match one of these templates. |
| 192 | if ( empty( $page_template ) || false === strpos( $page_template, '.php' ) ) { |
| 193 | return $template; |
| 194 | } |
| 195 | |
| 196 | $file = trailingslashit( $this->container[ SURECART_CONFIG_KEY ]['app_core']['path'] ) . '/templates/' . $page_template; |
| 197 | |
| 198 | // Return file if it exists. |
| 199 | if ( file_exists( $file ) ) { |
| 200 | return $file; |
| 201 | } |
| 202 | |
| 203 | return $template; |
| 204 | } |
| 205 | } |
| 206 |