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 / Models / Review.php
surecart / app / src / Models Last commit date
Blocks 2 months ago Concerns 6 months ago Traits 2 weeks ago Wordpress 1 year ago AbandonedCheckout.php 1 year ago AbandonedCheckoutProtocol.php 3 years ago Account.php 10 months ago AccountPortalSession.php 3 years ago Activation.php 1 year ago Affiliation.php 1 year ago AffiliationProduct.php 1 year ago AffiliationProtocol.php 2 years ago AffiliationRequest.php 1 year ago ApiToken.php 6 months ago AutoFee.php 5 months ago AutoFeeProtocol.php 5 months ago BalanceTransaction.php 1 year ago Batch.php 3 days ago Brand.php 4 months ago BulkAction.php 2 years ago Bump.php 1 year ago BuyLink.php 2 years ago CancellationAct.php 1 year ago CancellationReason.php 3 years ago Charge.php 9 months ago Checkout.php 2 months ago Click.php 1 year ago Collection.php 3 months ago CommissionStructure.php 2 years ago Component.php 4 months ago Coupon.php 2 months ago Customer.php 2 weeks ago CustomerLink.php 3 years ago CustomerNotificationProtocol.php 3 years ago CustomerPortalProtocol.php 1 year ago DatabaseModel.php 2 months ago Discount.php 1 year ago DisplayCurrency.php 1 year ago Dispute.php 9 months ago Download.php 3 years ago Event.php 3 years ago Export.php 2 years ago ExternalApiModel.php 3 months ago Fee.php 1 year ago Form.php 3 years ago Fulfillment.php 1 year ago FulfillmentItem.php 1 year ago GalleryItem.php 9 months ago GalleryItemAttachment.php 5 months ago GalleryItemImageAttachment.php 3 months ago GalleryItemMedia.php 1 year ago GalleryItemProductMedia.php 1 month ago GalleryItemVideoAttachment.php 3 months ago Import.php 6 months ago ImportRow.php 2 months ago IncomingWebhook.php 1 year ago Integration.php 2 years ago IntegrationCatalog.php 3 days ago Invoice.php 1 year ago License.php 1 year ago LineItem.php 9 months ago ManualPaymentMethod.php 1 year ago Media.php 1 month ago Model.php 3 days ago ModelInterface.php 3 years ago Order.php 2 weeks ago OrderProtocol.php 3 years ago ParcelTemplate.php 3 months ago PaymentFailure.php 1 year ago PaymentInstrument.php 2 months ago PaymentIntent.php 1 year ago PaymentMethod.php 1 year ago Payout.php 1 year ago PayoutGroup.php 2 years ago Period.php 1 year ago PlatformFee.php 1 year ago PortalSession.php 3 years ago Price.php 6 months ago Processor.php 1 year ago Product.php 3 days ago ProductCollection.php 1 year ago ProductCollectionImport.php 6 months ago ProductGroup.php 1 year ago ProductImport.php 6 months ago ProductMedia.php 4 months ago Promotion.php 1 year ago ProvisionalAccount.php 2 months ago Purchase.php 2 years ago Referral.php 1 year ago ReferralItem.php 2 years ago Refund.php 1 year ago RefundItem.php 1 year ago RegisteredWebhook.php 2 months ago ReturnItem.php 2 years ago ReturnReason.php 2 years ago ReturnRequest.php 1 year ago Review.php 4 months ago ReviewProtocol.php 4 months ago RuleSchema.php 5 months ago ServiceFee.php 1 year ago ShippingChoice.php 1 year 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 weeks ago SubscriptionProtocol.php 3 years ago Swap.php 1 year ago TaxOverride.php 2 years ago TaxProtocol.php 3 years ago TaxRegistration.php 1 year ago TaxZone.php 3 years ago Upload.php 3 years ago Upsell.php 1 year ago UpsellFunnel.php 1 year ago User.php 1 month ago Variant.php 3 days ago VariantOption.php 2 years ago VariantOptionValue.php 1 year ago VariantValue.php 2 years ago VerificationCode.php 3 years ago Webhook.php 1 year ago WebhookRegistration.php 2 years ago
Review.php
223 lines
1 <?php
2
3 namespace SureCart\Models;
4
5 use SureCart\Models\Traits\HasCustomer;
6 use SureCart\Models\Traits\HasProduct;
7 use SureCart\Models\Traits\HasPurchase;
8 use SureCart\Models\Traits\HasDates;
9
10 /**
11 * Review model
12 */
13 class Review extends Model {
14 use HasCustomer;
15 use HasProduct;
16 use HasPurchase;
17 use HasDates;
18
19 /**
20 * Rest API endpoint
21 *
22 * @var string
23 */
24 protected $endpoint = 'reviews';
25
26 /**
27 * Object name
28 *
29 * @var string
30 */
31 protected $object_name = 'review';
32
33 /**
34 * Is this cachable?
35 *
36 * @var boolean
37 */
38 protected $cachable = true;
39
40 /**
41 * Clear cache when reviews are updated.
42 *
43 * @var string
44 */
45 protected $cache_key = 'reviews';
46
47 /**
48 * Publish the review.
49 *
50 * @param string $id Review ID.
51 *
52 * @return $this|\WP_Error
53 */
54 protected function publish( $id = null ) {
55 if ( $id ) {
56 $this->setAttribute( 'id', $id );
57 }
58
59 if ( $this->fireModelEvent( 'publishing' ) === false ) {
60 return $this;
61 }
62
63 if ( empty( $this->attributes['id'] ) ) {
64 return new \WP_Error( 'not_saved', 'No review provided.' );
65 }
66
67 $published = \SureCart::request(
68 $this->endpoint . '/' . $this->attributes['id'] . '/publish',
69 [
70 'method' => 'PATCH',
71 'query' => $this->query,
72 ]
73 );
74
75 if ( is_wp_error( $published ) ) {
76 return $published;
77 }
78
79 $this->resetAttributes();
80 $this->fill( $published );
81 $this->fireModelEvent( 'published' );
82
83 \SureCart::account()->clearCache();
84
85 // Sync the associated product to update cached review statistics.
86 $this->syncProduct();
87
88 return $this;
89 }
90
91 /**
92 * Unpublish the review.
93 *
94 * @param string $id Review ID.
95 *
96 * @return $this|\WP_Error
97 */
98 protected function unpublish( $id = null ) {
99 if ( $id ) {
100 $this->setAttribute( 'id', $id );
101 }
102
103 if ( $this->fireModelEvent( 'unpublishing' ) === false ) {
104 return $this;
105 }
106
107 if ( empty( $this->attributes['id'] ) ) {
108 return new \WP_Error( 'not_saved', 'No review provided.' );
109 }
110
111 $unpublished = \SureCart::request(
112 $this->endpoint . '/' . $this->attributes['id'] . '/unpublish',
113 [
114 'method' => 'PATCH',
115 'query' => $this->query,
116 ]
117 );
118
119 if ( is_wp_error( $unpublished ) ) {
120 return $unpublished;
121 }
122
123 $this->resetAttributes();
124 $this->fill( $unpublished );
125 $this->fireModelEvent( 'unpublished' );
126
127 \SureCart::account()->clearCache();
128
129 // Sync the associated product to update cached review statistics.
130 $this->syncProduct();
131
132 return $this;
133 }
134
135 /**
136 * Delete the review.
137 *
138 * @param string $id The id of the review to delete.
139 *
140 * @return $this|false
141 */
142 protected function delete( $id = '' ) {
143 // Store the product_id before deletion since we need it after the model is deleted.
144 $product_id = $this->product_id;
145
146 // Call parent delete.
147 $result = parent::delete( $id );
148
149 // Clear cache after deletion.
150 \SureCart::account()->clearCache();
151
152 // If deletion was successful, sync the product.
153 if ( ! is_wp_error( $result ) && $product_id ) {
154 $this->syncProduct( $product_id );
155 }
156
157 return $result;
158 }
159
160 /**
161 * Sync a product to refresh cached review statistics.
162 *
163 * @param string|null $product_id The product ID. If null, uses $this->product_id.
164 *
165 * @return void
166 */
167 protected function syncProduct( $product_id = null ) {
168 $product_id = $product_id ?? $this->product_id;
169 if ( empty( $product_id ) ) {
170 return;
171 }
172
173 // Queue a background sync to update the WordPress post meta with fresh product data.
174 // This avoids blocking the current request with an API call.
175 \SureCart::queue()->async(
176 'surecart/sync/product',
177 [
178 'id' => $product_id,
179 'show_notice' => false,
180 ]
181 );
182
183 // Trigger the queue to process immediately.
184 \SureCart::queue()->run();
185 }
186
187 /**
188 * Get all review statuses.
189 *
190 * @return array
191 */
192 public function getStatuses(): array {
193 return [
194 'in_review' => esc_html__( 'In Review', 'surecart' ),
195 'published' => esc_html__( 'Approved', 'surecart' ),
196 'unpublished' => esc_html__( 'Rejected', 'surecart' ),
197 ];
198 }
199
200 /**
201 * Get the status type for tag styling.
202 *
203 * @return string
204 */
205 public function getStatusTypeAttribute(): string {
206 $types = [
207 'in_review' => 'warning',
208 'published' => 'success',
209 'unpublished' => 'danger',
210 ];
211 return $types[ $this->status ] ?? 'default';
212 }
213
214 /**
215 * Get the status display label.
216 *
217 * @return string
218 */
219 public function getStatusDisplayAttribute(): string {
220 return $this->getStatuses()[ $this->status ] ?? $this->status ?? '';
221 }
222 }
223