PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.6.1
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.6.1
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 / TemplatesService.php
surecart / app / src / WordPress / Templates Last commit date
BlockTemplatesService.php 3 years ago TemplatesService.php 2 years ago TemplatesServiceProvider.php 3 years ago
TemplatesService.php
309 lines
1 <?php
2
3
4 namespace SureCart\WordPress\Templates;
5
6 /**
7 * The template service.
8 */
9 class TemplatesService {
10 /**
11 * The service container.
12 *
13 * @var array
14 */
15 private $container;
16
17 /**
18 * The template file/name associations.
19 *
20 * @var array
21 */
22 private $templates = [];
23
24 /**
25 * The post type for the templates.
26 *
27 * @var string
28 */
29 private $post_type = '';
30
31 /**
32 * SureCart plugin slug
33 *
34 * This is used to save templates to the DB which are stored against this value in the wp_terms table.
35 *
36 * @var string
37 */
38 const PLUGIN_SLUG = 'surecart/surecart';
39
40 /**
41 * Get things going.
42 *
43 * @param array $container The service container.
44 * @param array $templates The template file/name associations.
45 * @param string $post_type The post type for the templates.
46 */
47 public function __construct( $container, $templates, $post_type ) {
48 $this->container = $container;
49 $this->templates = $templates;
50 $this->post_type = $post_type;
51 }
52
53 /**
54 * Bootstrap actions and filters.
55 *
56 * @return void
57 */
58 public function bootstrap() {
59 add_filter( 'theme_' . $this->post_type . '_templates', [ $this, 'addTemplates' ] );
60 add_filter( 'template_include', [ $this, 'includeTemplate' ], 9 );
61 add_filter( 'body_class', [ $this, 'bodyClass' ] );
62 add_action( 'init', [ $this, 'registerMeta' ] );
63
64 // product page query overrides.
65 add_filter( 'posts_pre_query', [ $this, 'overrideProductPostQuery' ], 10, 2 );
66 add_filter( 'query_vars', [ $this, 'addCurrentProductQueryVar' ] );
67 add_filter( 'get_post_metadata', [ $this, 'overrideProductPostMeta' ], 10, 4 );
68 }
69
70 /**
71 * Short-circuits the return value of a meta field for our post type.
72 *
73 * @param mixed $value The value to return, either a single metadata value or an array
74 * of values depending on the value of `$single`. Default null.
75 * @param int $object_id ID of the object metadata is for.
76 * @param string $meta_key Metadata key.
77 * @param bool $single Whether to return only the first value of the specified `$meta_key`.
78 *
79 * @return mixed
80 */
81 public function overrideProductPostMeta( $value, $object_id, $meta_key, $single ) {
82 // not our meta query.
83 if ( 'sc_id' !== $meta_key && 'sc_slug' !== $meta_key ) {
84 return $value;
85 }
86
87 $product = get_query_var( 'surecart_current_product' );
88
89 if ( ! $product ) {
90 // get the product in case the product page id query var is the slug.
91 $product_id = get_query_var( 'sc_product_page_id' );
92 $product = \SureCart\Models\Product::with( [ 'prices', 'image' ] )->find( $product_id );
93 }
94
95 // we don't have an id or slug.
96 if ( empty( $product->id ) || empty( $product->slug ) ) {
97 return $value;
98 }
99
100 // return the id.
101 if ( 'sc_id' === $meta_key ) {
102 return $product->id;
103 }
104
105 // return the slug.
106 if ( 'sc_slug' === $meta_key ) {
107 return $product->slug;
108 }
109
110 return $value;
111 }
112
113 /**
114 * Add surecart_current_product to list of query vars.
115 *
116 * @param array $vars The query vars.
117 * @return array
118 */
119 public function addCurrentProductQueryVar( $vars ) {
120 $vars[] = 'surecart_current_product';
121 return $vars;
122 }
123
124 /**
125 * Filters the posts array before the query takes place to return a product post.
126 * Return a non-null value to bypass WordPress' default post queries.
127 *
128 * Filtering functions that require pagination information are encouraged to set
129 * the `found_posts` and `max_num_pages` properties of the WP_Query object,
130 * passed to the filter by reference. If WP_Query does not perform a database
131 * query, it will not have enough information to generate these values itself.
132 *
133 * @since 4.6.0
134 *
135 * @param WP_Post[]|int[]|null $posts Return an array of post data to short-circuit WP's query,
136 * or null to allow WP to run its normal queries.
137 * @param \WP_Query $wp_query The WP_Query instance (passed by reference).
138 *
139 * @return WP_Post[]|null Array of post data, or null to allow WP to run its normal queries.
140 */
141 public function overrideProductPostQuery( $posts, \WP_Query $wp_query ) {
142 $product_id = isset( $wp_query->query['sc_product_page_id'] ) ? $wp_query->query['sc_product_page_id'] : null;
143 if ( ! $product_id ) {
144 return;
145 }
146
147 $product = \SureCart\Models\Product::with( [ 'image', 'prices', 'product_medias', 'product_media.media' ] )->find( $product_id );
148 if ( is_wp_error( $product ) ) {
149 $wp_query->is_404 = true;
150 return;
151 }
152
153 set_query_var( 'surecart_current_product', $product );
154
155 // create a fake post for the product.
156 $post = new \stdClass();
157 $post->post_title = $product->name;
158 $post->post_name = $product->slug;
159 $post->post_content = '<div>' . ( $product->template_part->content ?? '' ) . '</div>';
160 $post->post_status = 'publish';
161 $post->post_type = 'sc_product'; // TODO: change to surecart-product-template post type?
162 $post->sc_id = $product->id;
163 $post->product = $product;
164 $post->post_author = 1;
165 $post->post_parent = 0;
166 $post->comment_count = 0;
167 $post->comment_status = 'closed';
168 $post->ping_status = 'closed';
169 $post->post_password = '';
170 $post->post_excerpt = '';
171 $post->post_date = ( new \DateTime( "@$product->created_at" ) )->setTimezone( new \DateTimeZone( wp_timezone_string() ) )->format( 'Y-m-d H:i:s' );
172 $post->post_date_gmt = date_i18n( 'Y-m-d H:i:s', $product->created_at, true );
173 $post->post_modified = ( new \DateTime( "@$product->updated_at" ) )->setTimezone( new \DateTimeZone( wp_timezone_string() ) )->format( 'Y-m-d H:i:s' );
174 $post->post_modified_gmt = date_i18n( 'Y-m-d H:i:s', $product->updated_at, true );
175 $post->ID = 999999999;
176 $posts = array( $post );
177
178 $wp_query->found_posts = 1;
179 $wp_query->max_num_pages = 1;
180 $wp_query->is_singular = true;
181 $wp_query->is_single = true;
182 $wp_query->is_archive = false;
183 $wp_query->is_tax = false;
184 $wp_query->is_home = false;
185 $wp_query->is_search = false;
186 $wp_query->is_404 = false;
187 $wp_query->queried_object = $post;
188 $wp_query->queried_object_id = $post->ID;
189
190 return $posts;
191 }
192
193 /**
194 * Register any template meta we need.
195 */
196 public function registerMeta() {
197 register_meta(
198 'post',
199 '_surecart_dashboard_logo_width',
200 [
201 'auth_callback' => function( $allowed, $meta_key, $object_id, $user_id, $cap, $caps ) {
202 return current_user_can( 'edit_post', $object_id );
203 },
204 'default' => '180px',
205 'show_in_rest' => true,
206 'single' => true,
207 'type' => 'string',
208 ]
209 );
210
211 foreach ( [
212 'show_logo',
213 'navigation_orders',
214 'navigation_subscriptions',
215 'navigation_downloads',
216 'navigation_billing',
217 'navigation_account',
218 ] as $toggle ) {
219 register_meta(
220 'post',
221 '_surecart_dashboard_' . $toggle,
222 [
223 'auth_callback' => function( $allowed, $meta_key, $object_id, $user_id, $cap, $caps ) {
224 return current_user_can( 'edit_post', $object_id );
225 },
226 'default' => true,
227 'show_in_rest' => true,
228 'single' => true,
229 'type' => 'boolean',
230 ]
231 );
232 }
233 }
234
235 /**
236 * Is one of our templates active?
237 *
238 * @return boolean
239 */
240 public function isTemplateActive() {
241 $template = get_page_template_slug();
242 return false !== $template && array_key_exists( $template, $this->templates );
243 }
244
245 /**
246 * Add the templates. to the existing templates.
247 *
248 * @param array $posts_templates
249 *
250 * @return array
251 */
252 public function addTemplates( $posts_templates ) {
253 return array_merge( $posts_templates, $this->templates );
254 }
255
256 /**
257 * Include the template if it is set.
258 *
259 * @param string $template Template url.
260 *
261 * @return string
262 */
263 public function includeTemplate( $template ) {
264 global $post;
265 $id = $post->ID ?? null;
266
267 // check for product and use the template id.
268 $product = get_query_var( 'surecart_current_product' );
269
270 if ( ! empty( $product->metadata->wp_template_id ) ) {
271 $page_template = $product->metadata->wp_template_id;
272 } else {
273 $page_template = get_post_meta( $id, '_wp_page_template', true );
274 }
275
276 // if the set template does not match one of these templates.
277 if ( empty( $page_template ) || false === strpos( $page_template, '.php' ) ) {
278 return $template;
279 }
280
281 $file = trailingslashit( $this->container[ SURECART_CONFIG_KEY ]['app_core']['path'] ) . '/templates/' . $page_template;
282
283 // Return file if it exists.
284 if ( file_exists( $file ) ) {
285 return $file;
286 }
287
288 return $template;
289 }
290
291 /**
292 * Add to the body class if it's our template.
293 *
294 * @param array $body_class Array of body class names.
295 *
296 * @return array
297 */
298 public function bodyClass( $body_class ) {
299 $template = get_page_template_slug();
300
301 if ( false !== $template && $this->isTemplateActive() ) {
302 $body_class[] = 'surecart-template';
303 $body_class[] = 'surecart-template-' . get_template();
304 }
305
306 return $body_class;
307 }
308 }
309