PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.0.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.0.0
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 / Models / Product.php
surecart / app / src / Models Last commit date
Traits 3 years ago AbandonedCheckout.php 3 years ago AbandonedCheckoutProtocol.php 3 years ago Account.php 3 years ago AccountPortalSession.php 4 years ago Activation.php 4 years ago ApiToken.php 3 years ago BalanceTransaction.php 4 years ago Brand.php 4 years ago Bump.php 3 years ago BuyLink.php 3 years ago CancellationAct.php 3 years ago CancellationReason.php 3 years ago Charge.php 4 years ago Checkout.php 3 years ago Collection.php 4 years ago Component.php 4 years ago Coupon.php 4 years ago Customer.php 3 years ago CustomerLink.php 4 years ago CustomerNotificationProtocol.php 4 years ago DatabaseModel.php 4 years ago Download.php 4 years ago Event.php 4 years ago Form.php 3 years ago Integration.php 4 years ago Invoice.php 4 years ago License.php 4 years ago LineItem.php 3 years ago ManualPaymentMethod.php 3 years ago Media.php 3 years ago Model.php 3 years ago ModelInterface.php 4 years ago Order.php 4 years ago OrderProtocol.php 4 years ago PaymentIntent.php 4 years ago PaymentMethod.php 4 years ago Period.php 3 years ago PortalProtocol.php 4 years ago PortalSession.php 4 years ago Price.php 3 years ago Processor.php 3 years ago Product.php 3 years ago ProductGroup.php 4 years ago ProductMedia.php 3 years ago Promotion.php 4 years ago Purchase.php 4 years ago Refund.php 4 years ago Statistic.php 4 years ago Subscription.php 3 years ago SubscriptionProtocol.php 4 years ago TaxProtocol.php 4 years ago TaxRegistration.php 4 years ago TaxZone.php 4 years ago Upload.php 4 years ago User.php 3 years ago VerificationCode.php 3 years ago Webhook.php 3 years ago
Product.php
247 lines
1 <?php
2
3 namespace SureCart\Models;
4
5 use SureCart\Support\Currency;
6
7 /**
8 * Price model
9 */
10 class Product extends Model {
11 use Traits\HasImageSizes;
12
13 /**
14 * Rest API endpoint
15 *
16 * @var string
17 */
18 protected $endpoint = 'products';
19
20 /**
21 * Object name
22 *
23 * @var string
24 */
25 protected $object_name = 'product';
26
27 /**
28 * Is this cachable?
29 *
30 * @var boolean
31 */
32 protected $cachable = true;
33
34 /**
35 * Clear cache when products are updated.
36 *
37 * @var string
38 */
39 protected $cache_key = 'products_updated_at';
40
41 /**
42 * Image srcset.
43 *
44 * @return string
45 */
46 public function getImageSrcsetAttribute() {
47 if ( empty( $this->attributes['image_url'] ) ) {
48 return '';
49 }
50 return $this->imageSrcSet( $this->attributes['image_url'] );
51 }
52
53 /**
54 * Get the image url for a specific size.
55 *
56 * @param integer $size The size.
57 *
58 * @return string
59 */
60 public function getImageUrl( $size = 0 ) {
61 if ( empty( $this->attributes['image_url'] ) ) {
62 return '';
63 }
64 return $size ? $this->imageUrl( $this->attributes['image_url'], $size ) : $this->attributes['image_url'];
65 }
66
67 /**
68 * Set the prices attribute.
69 *
70 * @param object $value Array of price objects.
71 * @return void
72 */
73 public function setPricesAttribute( $value ) {
74 $this->setCollection( 'prices', $value, Price::class );
75 }
76
77 /**
78 * Set the product attribute
79 *
80 * @param string $value Product properties.
81 * @return void
82 */
83 public function setPurchaseAttribute( $value ) {
84 $this->setRelation( 'purchase', $value, Purchase::class );
85 }
86
87 /**
88 * Set the product media attribute
89 *
90 * @param string $value ProductMedia properties.
91 * @return void
92 */
93 public function setProductMediasAttribute( $value ) {
94 $this->setCollection( 'product_medias', $value, ProductMedia::class );
95 }
96
97 /**
98 * Buy link model
99 *
100 * @return \SureCart\Models\BuyLink
101 */
102 public function buyLink() {
103 return new BuyLink( $this );
104 }
105
106 /**
107 * Get the product permalink.
108 *
109 * @return string|false
110 */
111 public function getPermalinkAttribute() {
112 if ( empty( $this->attributes['id'] ) ) {
113 return false;
114 }
115 return trailingslashit( get_home_url() ) . trailingslashit( \SureCart::settings()->permalinks()->getBase( 'product_page' ) ) . $this->slug;
116 }
117
118 /**
119 * Get the page title.
120 *
121 * @return string
122 */
123 public function getPageTitleAttribute() {
124 return $this->metadata->page_title ?? $this->name;
125 }
126
127 /**
128 * Get the meta description.
129 *
130 * @return string
131 */
132 public function getMetaDescriptionAttribute() {
133 return $this->metadata->meta_description ?? $this->description;
134 }
135
136 /**
137 * Return attached active prices.
138 *
139 * @return array
140 */
141 public function activePrices() {
142 $active_prices = array_values(
143 array_filter(
144 $this->prices->data ?? [],
145 function( $price ) {
146 return ! $price->archived;
147 }
148 )
149 );
150
151 usort(
152 $active_prices,
153 function( $a, $b ) {
154 if ( $a->position == $b->position ) {
155 return 0;
156 }
157 return ( $a->position < $b->position ) ? -1 : 1;
158 }
159 );
160
161 return $active_prices;
162 }
163
164 /**
165 * Get the JSON Schema Array
166 *
167 * @return array
168 */
169 protected function getJsonSchemaArray() {
170 $active_prices = (array) $this->activePrices();
171
172 $offers = array_map(
173 function( $price ) {
174 return [
175 '@type' => 'Offer',
176 'price' => Currency::maybeConvertAmount( $price->amount, $price->currency ),
177 'priceCurrency' => $price->currency,
178 'availability' => 'https://schema.org/InStock',
179 ];
180 },
181 $active_prices ?? []
182 );
183
184 return apply_filters(
185 'surecart/product/json_schema',
186 [
187 '@context' => 'http://schema.org',
188 '@type' => 'Product',
189 'name' => $this->name,
190 'image' => $this->image_url ?? '',
191 'description' => sanitize_text_field( $this->description ),
192 'offers' => $offers,
193 ],
194 $this
195 );
196 }
197
198 /**
199 * Get the product template id.
200 *
201 * @return string|false
202 */
203 public function getTemplateIdAttribute() {
204 if ( ! empty( $this->attributes['metadata']->wp_template_id ) ) {
205 // we have a php file, switch to default.
206 if ( wp_is_block_theme() && false !== strpos( $this->attributes['metadata']->wp_template_id, '.php' ) ) {
207 return 'surecart/surecart//single-product';
208 }
209
210 // this is acceptable.
211 return $this->attributes['metadata']->wp_template_id;
212 }
213 return 'surecart/surecart//single-product';
214 }
215
216 /**
217 * Get the product template
218 *
219 * @return \WP_Template
220 */
221 public function getTemplateAttribute() {
222 return get_block_template( $this->getTemplateIdAttribute() );
223 }
224
225 /**
226 * Get the product template id.
227 *
228 * @return string|false
229 */
230 public function getTemplatePartIdAttribute() {
231 if ( ! empty( $this->attributes['metadata']->wp_template_part_id ) ) {
232 return $this->attributes['metadata']->wp_template_part_id;
233 }
234 return 'surecart/surecart//product-info';
235 }
236
237 /**
238 * Get the product template part template.
239 *
240 * @return \WP_Template
241 */
242 public function getTemplatePartAttribute() {
243 return get_block_template( $this->getTemplatePartIdAttribute(), 'wp_template_part' );
244 }
245 }
246
247