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.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 3 years ago Activation.php 3 years ago ApiToken.php 3 years ago BalanceTransaction.php 3 years ago Brand.php 3 years ago Bump.php 3 years ago BuyLink.php 3 years ago CancellationAct.php 3 years ago CancellationReason.php 3 years ago Charge.php 3 years ago Checkout.php 3 years ago Collection.php 3 years ago Component.php 3 years ago Coupon.php 3 years ago Customer.php 3 years ago CustomerLink.php 3 years ago CustomerNotificationProtocol.php 3 years ago DatabaseModel.php 2 years ago Download.php 3 years ago Event.php 3 years ago Form.php 3 years ago Fulfillment.php 3 years ago FulfillmentItem.php 3 years ago IncomingWebhook.php 2 years ago Integration.php 3 years ago Invoice.php 3 years ago License.php 3 years ago LineItem.php 3 years ago ManualPaymentMethod.php 3 years ago Media.php 3 years ago Model.php 3 years ago ModelInterface.php 3 years ago Order.php 3 years ago OrderProtocol.php 3 years ago PaymentIntent.php 3 years ago PaymentMethod.php 3 years ago Period.php 3 years ago PortalProtocol.php 3 years ago PortalSession.php 3 years ago Price.php 3 years ago Processor.php 3 years ago Product.php 3 years ago ProductGroup.php 3 years ago ProductMedia.php 3 years ago Promotion.php 3 years ago ProvisionalAccount.php 3 years ago Purchase.php 3 years ago Refund.php 3 years ago RegisteredWebhook.php 2 years ago ShippingMethod.php 3 years ago ShippingProfile.php 3 years ago ShippingProtocol.php 3 years ago ShippingRate.php 3 years ago ShippingZone.php 3 years ago Statistic.php 3 years ago Subscription.php 2 years ago SubscriptionProtocol.php 3 years ago TaxProtocol.php 3 years ago TaxRegistration.php 3 years ago TaxZone.php 3 years ago Upload.php 3 years ago User.php 3 years ago VerificationCode.php 3 years ago Webhook.php 2 years ago WebhookRegistration.php 2 years ago
Product.php
265 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 * Create a new model
43 *
44 * @param array $attributes Attributes to create.
45 *
46 * @return $this|false
47 */
48 protected function create( $attributes = [] ) {
49 if ( ! wp_is_block_theme() ) {
50 $attributes['metadata'] = [
51 ...$attributes['metadata'] ?? [],
52 'wp_template_id' => apply_filters( 'surecart/templates/products/default', 'pages/template-surecart-product.php' ),
53 ];
54 }
55
56 return parent::create( $attributes );
57 }
58
59 /**
60 * Image srcset.
61 *
62 * @return string
63 */
64 public function getImageSrcsetAttribute() {
65 if ( empty( $this->attributes['image_url'] ) ) {
66 return '';
67 }
68 return $this->imageSrcSet( $this->attributes['image_url'] );
69 }
70
71 /**
72 * Get the image url for a specific size.
73 *
74 * @param integer $size The size.
75 *
76 * @return string
77 */
78 public function getImageUrl( $size = 0 ) {
79 if ( empty( $this->attributes['image_url'] ) ) {
80 return '';
81 }
82 return $size ? $this->imageUrl( $this->attributes['image_url'], $size ) : $this->attributes['image_url'];
83 }
84
85 /**
86 * Set the prices attribute.
87 *
88 * @param object $value Array of price objects.
89 * @return void
90 */
91 public function setPricesAttribute( $value ) {
92 $this->setCollection( 'prices', $value, Price::class );
93 }
94
95 /**
96 * Set the product attribute
97 *
98 * @param string $value Product properties.
99 * @return void
100 */
101 public function setPurchaseAttribute( $value ) {
102 $this->setRelation( 'purchase', $value, Purchase::class );
103 }
104
105 /**
106 * Set the product media attribute
107 *
108 * @param string $value ProductMedia properties.
109 * @return void
110 */
111 public function setProductMediasAttribute( $value ) {
112 $this->setCollection( 'product_medias', $value, ProductMedia::class );
113 }
114
115 /**
116 * Buy link model
117 *
118 * @return \SureCart\Models\BuyLink
119 */
120 public function buyLink() {
121 return new BuyLink( $this );
122 }
123
124 /**
125 * Get the product permalink.
126 *
127 * @return string|false
128 */
129 public function getPermalinkAttribute() {
130 if ( empty( $this->attributes['id'] ) ) {
131 return false;
132 }
133 return trailingslashit( get_home_url() ) . trailingslashit( \SureCart::settings()->permalinks()->getBase( 'product_page' ) ) . $this->slug;
134 }
135
136 /**
137 * Get the page title.
138 *
139 * @return string
140 */
141 public function getPageTitleAttribute() {
142 return $this->metadata->page_title ?? $this->name;
143 }
144
145 /**
146 * Get the meta description.
147 *
148 * @return string
149 */
150 public function getMetaDescriptionAttribute() {
151 return $this->metadata->meta_description ?? $this->description;
152 }
153
154 /**
155 * Return attached active prices.
156 *
157 * @return array
158 */
159 public function activePrices() {
160 $active_prices = array_values(
161 array_filter(
162 $this->prices->data ?? [],
163 function( $price ) {
164 return ! $price->archived;
165 }
166 )
167 );
168
169 usort(
170 $active_prices,
171 function( $a, $b ) {
172 if ( $a->position == $b->position ) {
173 return 0;
174 }
175 return ( $a->position < $b->position ) ? -1 : 1;
176 }
177 );
178
179 return $active_prices;
180 }
181
182 /**
183 * Get the JSON Schema Array
184 *
185 * @return array
186 */
187 protected function getJsonSchemaArray() {
188 $active_prices = (array) $this->activePrices();
189
190 $offers = array_map(
191 function( $price ) {
192 return [
193 '@type' => 'Offer',
194 'price' => Currency::maybeConvertAmount( $price->amount, $price->currency ),
195 'priceCurrency' => $price->currency,
196 'availability' => 'https://schema.org/InStock',
197 ];
198 },
199 $active_prices ?? []
200 );
201
202 return apply_filters(
203 'surecart/product/json_schema',
204 [
205 '@context' => 'http://schema.org',
206 '@type' => 'Product',
207 'name' => $this->name,
208 'image' => $this->image_url ?? '',
209 'description' => sanitize_text_field( $this->description ),
210 'offers' => $offers,
211 ],
212 $this
213 );
214 }
215
216 /**
217 * Get the product template id.
218 *
219 * @return string|false
220 */
221 public function getTemplateIdAttribute() {
222 if ( ! empty( $this->attributes['metadata']->wp_template_id ) ) {
223 // we have a php file, switch to default.
224 if ( wp_is_block_theme() && false !== strpos( $this->attributes['metadata']->wp_template_id, '.php' ) ) {
225 return 'surecart/surecart//single-product';
226 }
227
228 // this is acceptable.
229 return $this->attributes['metadata']->wp_template_id;
230 }
231 return 'surecart/surecart//single-product';
232 }
233
234 /**
235 * Get the product template
236 *
237 * @return \WP_Template
238 */
239 public function getTemplateAttribute() {
240 return get_block_template( $this->getTemplateIdAttribute() );
241 }
242
243 /**
244 * Get the product template id.
245 *
246 * @return string|false
247 */
248 public function getTemplatePartIdAttribute() {
249 if ( ! empty( $this->attributes['metadata']->wp_template_part_id ) ) {
250 return $this->attributes['metadata']->wp_template_part_id;
251 }
252 return 'surecart/surecart//product-info';
253 }
254
255 /**
256 * Get the product template part template.
257 *
258 * @return \WP_Template
259 */
260 public function getTemplatePartAttribute() {
261 return get_block_template( $this->getTemplatePartIdAttribute(), 'wp_template_part' );
262 }
263 }
264
265