PluginProbe
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.2.2
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.2.2
4.7.2 4.7.1 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 All 281 releases
surecart / app / src / Models / Review.php
Review.php
223 lines 4.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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