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.5.1 4.5.0 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 / WordPress / Templates / UpsellTemplatesService.php
surecart / app / src / WordPress / Templates Last commit date
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