PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.5.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.5.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
207 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() ? get_block_template( $upsell->template_id )->content : get_block_template( $upsell->template_part_id, 'wp_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 = $product->description ?? '';
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 $translations['pages/template-surecart-collection.php'] = esc_html__( 'SureCart Layout', 'surecart' );
160 return array_merge( $posts_templates, $this->templates );
161 }
162
163 /**
164 * Include the template if it is set.
165 *
166 * @param string $template Template url.
167 *
168 * @return string
169 */
170 public function includeTemplate( string $template ): string {
171 global $post;
172 $id = $post->ID ?? null;
173
174 // if block theme, short circuit and return template-canvas probably.
175 if ( wp_is_block_theme() ) {
176 return $template;
177 }
178
179 // check for upsell and use the template id.
180 $upsell = get_query_var( 'surecart_current_upsell' );
181
182 if ( empty( $upsell ) ) {
183 return $template;
184 }
185
186 if ( ! empty( $upsell->metadata->wp_template_id ) ) {
187 $page_template = $upsell->metadata->wp_template_id;
188 } else {
189 $page_template = get_post_meta( $id, '_wp_page_template', true );
190 }
191
192 // if the set template does not match one of these templates.
193 if ( empty( $page_template ) || false === strpos( $page_template, '.php' ) ) {
194 return $template;
195 }
196
197 $file = trailingslashit( $this->container[ SURECART_CONFIG_KEY ]['app_core']['path'] ) . '/templates/' . $page_template;
198
199 // Return file if it exists.
200 if ( file_exists( $file ) ) {
201 return $file;
202 }
203
204 return $template;
205 }
206 }
207