PluginProbe
Templately – Elementor & Gutenberg Template Library: 6500+ Free & Pro Ready Templates And Cloud! / 3.1.8
Templately – Elementor & Gutenberg Template Library: 6500+ Free & Pro Ready Templates And Cloud! v3.1.8
3.7.5 3.7.4 3.7.3 3.7.2 1-final 3.7.1 3.7.0 3.6.8 3.6.7 3.6.6 3.6.5 3.6.4 3.6.3 3.6.2 3.6.1 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.10 All 111 releases
← All changes | includes/Builder/TemplateLoader.php +4 -100 3.6.83.1.8 View file →
@@ -24,10 +24,8 @@
24 24 add_action( 'get_footer', [ $this, 'get_footer' ], 0 );
25 25 add_action( 'elementor/document/wrapper_attributes', [ $this, 'wrapper_attributes' ], 10, 2 );
26 26 add_action( 'template_redirect', array( $this, 'set_global_product' ) );
27 27
28 - add_action( 'templately_builder_header_after', [ self::class, 'print_style_tags' ], 0 );
29 - add_action( 'templately_builder_footer_before', [ self::class, 'print_style_tags' ], 0 );
30 28 /**
31 29 * Only for Development Mode.
32 30 */
33 31 if ( defined( 'TEMPLATELY_DEV_VIEWS' ) && TEMPLATELY_DEV_VIEWS ) {
@@ -132,107 +130,13 @@
132 130
133 131 public function set_global_product(){
134 132 global $product;
135 133
136 - if ( ! function_exists( 'wc_setup_product_data' ) ) {
137 - return;
138 - }
139 -
140 - // A real product is already in context (e.g. a live single-product page) — never override it.
141 - if ( $product instanceof \WC_Product ) {
142 - return;
143 - }
144 -
145 - $document_id = get_the_ID();
146 - if ( ! $document_id ) {
147 - return;
148 - }
149 -
150 - // The current post is itself a product — set it up (prior behaviour, kept explicit).
151 - if ( get_post_type( $document_id ) === 'product' ) {
152 - wc_setup_product_data( $document_id );
153 - return;
154 - }
155 -
156 - // Otherwise only fabricate a preview product for a WooCommerce single-product
157 - // Theme Builder template being rendered in the editor / preview. This mirrors what
158 - // Elementor Pro's Single Product document does: point the global $product at a real
159 - // product so any WooCommerce widget — ours and third-party (e.g. EA Woo Product Tabs) —
160 - // renders real data in the editor instead of appearing empty. The live front end is
161 - // unaffected (there a real product is always in context, handled above).
162 - if ( ! $this->is_woo_single_preview( $document_id ) ) {
163 - return;
164 - }
165 -
166 - $preview_product_id = $this->get_preview_product_id();
167 - if ( $preview_product_id ) {
168 - wc_setup_product_data( $preview_product_id );
169 - }
170 - }
171 -
172 - /**
173 - * Whether the current request is the editor/preview render of a WooCommerce
174 - * single-product ( `product_single` ) Theme Builder template.
175 - *
176 - * @param int $document_id The templately_library post being rendered.
177 - * @return bool
178 - */
179 - private function is_woo_single_preview( $document_id ) {
180 - if ( get_post_meta( $document_id, Source::TYPE_META_KEY, true ) !== 'product_single' ) {
181 - return false;
182 - }
183 -
184 - if ( ! post_type_exists( 'product' ) ) {
185 - return false;
186 - }
187 -
188 - return Plugin::$instance->editor->is_edit_mode()
189 - || Plugin::$instance->preview->is_preview_mode( $document_id )
190 - || ( isset( $_GET['templately_library'], $_GET['preview_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
191 - }
192 -
193 - /**
194 - * Resolve the newest published product to use as the editor preview product.
195 - * Matches the "latest product" approach used by the dynamic Theme Builder
196 - * widgets ( Post_Content / Post_Title / Featured_Image ) and Elementor Pro.
197 - *
198 - * @return int Product ID, or 0 when the store has no published products.
199 - */
200 - private function get_preview_product_id() {
201 - $products = get_posts( [
202 - 'post_type' => 'product',
203 - 'post_status' => 'publish',
204 - 'numberposts' => 1,
205 - 'orderby' => 'date',
206 - 'order' => 'DESC',
207 - 'fields' => 'ids',
208 - 'no_found_rows' => true,
209 - 'suppress_filters' => false,
210 - ] );
211 -
212 - return ! empty( $products ) ? (int) $products[0] : 0;
213 - }
214 -
215 - /**
216 - * Print remaining enqueued styles with error handling.
217 - */
218 - public static function print_style_tags() {
219 - try {
220 - $wp_styles = wp_styles();
221 - // handles dependencies
222 - $wp_styles->do_items();
223 - if ( is_object( $wp_styles ) && is_array( $wp_styles->queue ?? null ) ) {
224 - foreach ( $wp_styles->queue as $style ) {
225 - if ( is_string( $style ) && ! $wp_styles->query( $style, 'done' ) ) {
226 - $wp_styles->do_item( $style );
227 - $wp_styles->done[] = $style;
228 - }
229 - }
230 - }
231 - } catch ( \Throwable $e ) {
232 - if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
233 - error_log( 'Templately: Error printing styles - ' . $e->getMessage() );
134 + if ( class_exists('\WC_Product') && ! $product instanceof \WC_Product ) {
135 + $product_id = get_the_ID();
136 + if ( $product_id ) {
137 + wc_setup_product_data( $product_id );
234 138 }
235 139 }
236 140 }
237 141
238 142 }