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 / Integrations / Bricks / Elements / ProductContent.php
surecart / app / src / Integrations / Bricks / Elements Last commit date
BuyButton.php 3 months ago CartMenuIcon.php 5 months ago CollectionTag.php 1 year ago CollectionTags.php 1 year ago Media.php 1 year ago PriceChoiceTemplate.php 1 year ago PriceChooser.php 4 months ago PriceData.php 1 year ago Product.php 4 months ago ProductCard.php 10 months ago ProductContent.php 10 months ago ProductData.php 1 year ago ProductLineItemNote.php 10 months ago ProductQuickAddButton.php 10 months ago ProductReviewAverageRatingStars.php 4 months ago ProductReviewAverageRatingValue.php 4 months ago ProductReviewBreakdown.php 4 months ago ProductReviewContent.php 4 months ago ProductReviewList.php 2 months ago ProductReviewRating.php 4 months ago ProductReviewTotalRating.php 4 months ago ProductReviews.php 4 months ago Quantity.php 10 months ago SaleBadge.php 1 year ago SelectedPriceAdHocAmount.php 1 year ago VariantPill.php 6 months ago VariantPills.php 1 year ago
ProductContent.php
212 lines
1 <?php
2
3 namespace SureCart\Integrations\Bricks\Elements;
4
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit; // Exit if accessed directly.
7 }
8
9 /**
10 * Class ProductContent.
11 */
12 class ProductContent extends \Bricks\Element {
13 /**
14 * The name of the element.
15 *
16 * @var string
17 */
18 public $name = 'product-content';
19
20 /**
21 * Element category.
22 *
23 * @var string
24 */
25 public $category = 'SureCart Elements';
26
27 /**
28 * The icon for the element.
29 *
30 * @var string
31 */
32 public $icon = 'ion-md-list-box';
33
34 /**
35 * Enqueue scripts and styles for the element.
36 *
37 * @return void
38 */
39 public function enqueue_scripts() {
40 wp_enqueue_style( 'wp-block-library' );
41 wp_enqueue_style( 'global-styles' );
42 }
43
44 /**
45 * Get the label for the element.
46 *
47 * @return string
48 */
49 public function get_label() {
50 return esc_html__( 'Product Content', 'surecart' );
51 }
52
53 /**
54 * Set the controls for the element.
55 *
56 * @return void
57 */
58 public function set_controls() {
59 $post_id = get_the_ID();
60
61 $template_preview_post_id = \Bricks\Helpers::get_template_setting( 'templatePreviewPostId', $post_id );
62
63 if ( $template_preview_post_id ) {
64 $post_id = $template_preview_post_id;
65 }
66
67 $edit_link = get_edit_post_link( $post_id );
68
69 $this->controls['info'] = [
70 'tab' => 'content',
71 'type' => 'info',
72 'content' => "<a href=\"$edit_link\" target=\"_blank\">" . esc_html__( 'Edit WordPress content (WP admin).', 'surecart' ) . '</a>',
73 'required' => [ 'dataSource', '!=', 'bricks' ],
74 ];
75
76 if ( BRICKS_DB_TEMPLATE_SLUG === get_post_type() ) {
77 $this->controls['dataSource'] = [
78 'tab' => 'content',
79 'label' => esc_html__( 'Data source', 'surecart' ),
80 'type' => 'select',
81 'options' => [
82 'editor' => __( 'WordPress', 'surecart' ),
83 'bricks' => __( 'Bricks', 'surecart' ),
84 ],
85 'inline' => true,
86 'placeholder' => __( 'WordPress', 'surecart' ),
87 ];
88 }
89 }
90
91 /**
92 * Render the element.
93 *
94 * @return void
95 */
96 public function render() {
97 $settings = $this->settings;
98 $data_source = $settings['dataSource'] ?? '';
99
100 // To apply CSS flex when "Data Source" is set to "bricks".
101 if ( $data_source ) {
102 $this->set_attribute( '_root', 'data-source', $data_source );
103 }
104
105 $output = '';
106
107 // STEP: Render Bricks data.
108 if ( 'bricks' === $data_source ) {
109 // Previewing a template.
110 if ( \Bricks\Helpers::is_bricks_template( $this->post_id ) ) {
111 return $this->render_element_placeholder(
112 [
113 'title' => esc_html__( 'For better preview select content to show.', 'surecart' ),
114 'description' => esc_html__( 'Go to: Settings > Template Settings > Populate Content', 'surecart' ),
115 ]
116 );
117 }
118
119 // Get Bricks data.
120 $bricks_data = get_post_meta( $this->post_id, BRICKS_DB_PAGE_CONTENT, true );
121
122 if ( empty( $bricks_data ) || ! is_array( $bricks_data ) ) {
123 $placeholder_data = [
124 'title' => esc_html__( 'No Bricks data found.', 'surecart' ),
125 ];
126
127 // Add custom class if source is Bricks (for StaticArea.vue to find the placeholder) (@since 1.12.2).
128 if ( 'bricks' === $data_source ) {
129 $placeholder_data['class'] = 'brx-post-content-placeholder';
130 }
131
132 return $this->render_element_placeholder( $placeholder_data );
133 }
134
135 // Avoid infinite loop.
136 static $post_content_loop = 0;
137
138 if ( $post_content_loop < 2 ) {
139 ++$post_content_loop;
140
141 // Store the current main render_data self::$elements.
142 $store_elements = \Bricks\Frontend::$elements;
143
144 $output = \Bricks\Frontend::render_data( $bricks_data );
145
146 // Reset the main render_data self::$elements.
147 \Bricks\Frontend::$elements = $store_elements;
148
149 // Add elements & global classes CSS inline in the builder or frontend (with Query Loop + External Files)
150 // Don't add global classes CSS when rendering static area e.g. show outer post content (@since 1.12.3).
151 if ( ! isset( $_POST['staticArea'] ) && ( bricks_is_builder() || bricks_is_builder_call() || ( \Bricks\Query::is_looping() && \Bricks\Database::get_setting( 'cssLoading' ) === 'file' ) ) ) {
152 \Bricks\Assets::$inline_css['content'] = '';
153
154 // Clear the list of elements already styled.
155 \Bricks\Assets::$css_looping_elements = [];
156
157 \Bricks\Assets::generate_css_from_elements( $bricks_data, 'content' );
158 $inline_css = \Bricks\Assets::$inline_css['content'];
159
160 // Add global classes CSS.
161 $inline_css_global_classes = \Bricks\Assets::generate_global_classes();
162 $inline_css .= \Bricks\Assets::$inline_css['global_classes'];
163
164 $output .= "\n <style>{$inline_css}</style>";
165 }
166
167 --$post_content_loop;
168 }
169 }
170
171 // STEP: Render WordPress content.
172 else {
173 global $wp_query;
174 $product = sc_get_product();
175 $no_content = [
176 'title' => esc_html__( 'No WordPress added content found.', 'surecart' ),
177 ];
178
179 if ( ! $product ) {
180 return $this->render_element_placeholder( $no_content );
181 }
182
183 $post = $product->post ?? null;
184 if ( ! $post ) {
185 return $this->render_element_placeholder( $no_content );
186 }
187
188 // Set global in_the_loop().
189 // Some plugins might rely on the `in_the_loop` check (e.g. BuddyBoss).
190 $wp_query->in_the_loop = true;
191 setup_postdata( $post );
192
193 $output = get_the_content();
194 if ( post_password_required( $post->ID ) ) {
195 $output = get_the_password_form( $post->ID ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
196 }
197
198 if ( bricks_is_builder_call() && ! $output ) {
199 return $this->render_element_placeholder( $no_content );
200 }
201
202 // Reset postdata before any return.
203 wp_reset_postdata();
204 }
205
206 // Only render if not empty.
207 if ( $output ) {
208 echo "<div {$this->render_attributes( '_root' )}>$output</div>"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
209 }
210 }
211 }
212