PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 3.0.0-beta1
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v3.0.0-beta1
4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.0 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
205 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
111 // create a fake post for the upsell.
112 $post = new \stdClass();
113 $post->post_title = $product->name;
114 $post->post_name = $upsell->id;
115 $post->post_content = '<div>' . ( $upsell->template_part->content ?? '' ) . '</div>';
116 $post->post_status = 'publish';
117 $post->post_type = $this->post_type;
118 $post->sc_id = $upsell->id;
119 $post->upsell = $upsell;
120 $post->product = $product;
121 $post->post_author = 1;
122 $post->post_parent = 0;
123 $post->comment_count = 0;
124 $post->comment_status = 'closed';
125 $post->ping_status = 'closed';
126 $post->post_password = '';
127 $post->post_excerpt = '';
128 $post->post_date = ( new \DateTime( "@$upsell->created_at" ) )->setTimezone( new \DateTimeZone( wp_timezone_string() ) )->format( 'Y-m-d H:i:s' );
129 $post->post_date_gmt = date_i18n( 'Y-m-d H:i:s', $upsell->created_at, true );
130 $post->post_modified = ( new \DateTime( "@$upsell->updated_at" ) )->setTimezone( new \DateTimeZone( wp_timezone_string() ) )->format( 'Y-m-d H:i:s' );
131 $post->post_modified_gmt = date_i18n( 'Y-m-d H:i:s', $upsell->updated_at, true );
132 $post->ID = 999999999;
133 $posts = array( $post );
134
135 $wp_query->found_posts = 1;
136 $wp_query->max_num_pages = 1;
137 $wp_query->is_singular = true;
138 $wp_query->is_single = true;
139 $wp_query->is_archive = false;
140 $wp_query->is_tax = false;
141 $wp_query->is_home = false;
142 $wp_query->is_search = false;
143 $wp_query->is_404 = false;
144 $wp_query->queried_object = $post;
145 $wp_query->queried_object_id = $post->ID;
146
147 return $posts;
148 }
149
150 /**
151 * Add the templates. to the existing templates.
152 *
153 * @param array $posts_templates Existing templates.
154 *
155 * @return array
156 */
157 public function addTemplates( array $posts_templates ): array {
158 return array_merge( $posts_templates, $this->templates );
159 }
160
161 /**
162 * Include the template if it is set.
163 *
164 * @param string $template Template url.
165 *
166 * @return string
167 */
168 public function includeTemplate( string $template ): string {
169 global $post;
170 $id = $post->ID ?? null;
171
172 // if block theme, short circuit and return template-canvas probably.
173 if ( wp_is_block_theme() ) {
174 return $template;
175 }
176
177 // check for upsell and use the template id.
178 $upsell = get_query_var( 'surecart_current_upsell' );
179
180 if ( empty( $upsell ) ) {
181 return $template;
182 }
183
184 if ( ! empty( $upsell->metadata->wp_template_id ) ) {
185 $page_template = $upsell->metadata->wp_template_id;
186 } else {
187 $page_template = get_post_meta( $id, '_wp_page_template', true );
188 }
189
190 // if the set template does not match one of these templates.
191 if ( empty( $page_template ) || false === strpos( $page_template, '.php' ) ) {
192 return $template;
193 }
194
195 $file = trailingslashit( $this->container[ SURECART_CONFIG_KEY ]['app_core']['path'] ) . '/templates/' . $page_template;
196
197 // Return file if it exists.
198 if ( file_exists( $file ) ) {
199 return $file;
200 }
201
202 return $template;
203 }
204 }
205