PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 3.0.3
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v3.0.3
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 / BlockLibrary / ProductListService.php
surecart / app / src / BlockLibrary Last commit date
BlockAnchorSupportService.php 1 year ago BlockPatternsService.php 1 year ago BlockService.php 1 year ago BlockServiceProvider.php 1 year ago BlockStylesService.php 1 year ago BlockValidationService.php 2 years ago CartMenuIconMigrationService.php 1 year ago CartMigrationService.php 1 year ago FormModeSwitcherService.php 1 year ago ProductCollectionBadgesMigrationService.php 1 year ago ProductListMigrationService.php 1 year ago ProductListService.php 1 year ago ProductPageBlocksMigrationService.php 1 year ago ProductPriceChoicesMigrationService.php 1 year ago ProductSelectedPriceMigrationService.php 1 year ago ProductVariantsMigrationService.php 1 year ago URLParamService.php 1 year ago
ProductListService.php
186 lines
1 <?php
2
3 declare(strict_types=1);
4
5 namespace SureCart\BlockLibrary;
6
7 /**
8 * The product list service.
9 */
10 class ProductListService {
11 /**
12 * The block.
13 *
14 * @var \WP_Block
15 */
16 protected $block;
17
18 /**
19 * The block id.
20 *
21 * @var int
22 */
23 protected $block_id = null;
24
25 /**
26 * The URL.
27 *
28 * @var object
29 */
30 protected $url;
31
32 /**
33 * The query vars.
34 *
35 * @var array
36 */
37 protected $query_vars = [];
38
39 /**
40 * The query.
41 *
42 * @var \WP_Query
43 */
44 protected $query;
45
46 /**
47 * Constructor.
48 *
49 * @param \WP_Block $block The block.
50 */
51 public function __construct( $block ) {
52 $this->block = $block;
53 $this->block_id = $block->context['surecart/product-list/blockId'] ?? '';
54 $this->url = \SureCart::block()->urlParams( 'products' );
55 }
56
57 /**
58 * Build the query
59 *
60 * @return $this
61 */
62 public function parse_query() {
63 // build up the query.
64 $this->query_vars = [
65 'post_type' => 'sc_product',
66 'status' => 'publish',
67 'ignore_sticky_posts' => 1,
68 'posts_per_page' => $this->block->attributes['limit'] ?? 15,
69 'paged' => $this->url->getCurrentPage(),
70 'order' => $this->url->getArg( 'order' ) ?? 'desc',
71 'orderby' => $this->url->getArg( 'orderby' ) ?? 'date',
72 's' => $this->url->getArg( 'search' ),
73 ];
74
75 // put together price query.
76 if ( 'price' === $this->url->getArg( 'orderby' ) ) {
77 $this->query_vars['meta_key'] = 'max_price_amount';
78 $this->query_vars['orderby'] = 'meta_value_num';
79 }
80
81 // handle collections query.
82 if ( ! empty( $this->url->getArg( 'sc_collection' ) ) ) {
83 $this->query_vars['tax_query'] = [
84 [
85 'taxonomy' => 'sc_collection',
86 'field' => 'term_id',
87 'terms' => $this->url->getArg( 'sc_collection' ),
88 ],
89 ];
90 }
91
92 // handle featured.
93 if ( 'featured' === ( $this->block->attributes['type'] ?? 'all' ) ) {
94 $this->query_vars['meta_query'] = [
95 [
96 'key' => 'featured',
97 'value' => '1',
98 'compare' => '=',
99 ],
100 ];
101 }
102
103 if ( 'custom' === ( $this->block->attributes['type'] ?? 'all' ) ) {
104 // fallback for older strings - get the ids of legacy products.
105 $legacy_ids = [];
106 $ids_that_are_strings = array_filter( $attributes['ids'] ?? [], 'is_string' );
107 if ( ! empty( $ids_that_are_strings ) ) {
108 $legacy_ids = get_posts(
109 [
110 'post_type' => 'sc_product',
111 'status' => 'publish',
112 'fields' => 'ids',
113 'posts_per_page' => -1,
114 'meta_query' => [
115 [
116 'key' => 'sc_id',
117 'value' => $ids_that_are_strings,
118 'compare' => 'IN',
119 ],
120 ],
121 ]
122 );
123 }
124
125 $ids_that_are_integers = array_filter( $attributes['ids'] ?? [], 'is_int' );
126 $this->query_vars['post__in'] = array_merge( $legacy_ids, $ids_that_are_integers );
127 }
128
129 return $this;
130 }
131
132 /**
133 * Run the query
134 *
135 * @return $this|\WP_Error
136 */
137 public function query() {
138 $this->parse_query();
139 $this->query = new \WP_Query( $this->query_vars );
140 if ( is_wp_error( $this->query ) ) {
141 return $this->query;
142 }
143 return $this;
144 }
145
146 /**
147 * Get the query attribute.
148 *
149 * @return \WP_Query
150 */
151 public function __get( $key ) {
152 // handle pagination.
153 if ( 'next_page_link' === $key ) {
154 return $this->query->max_num_pages && $this->query->max_num_pages !== $this->query->paged ? $this->url->addPageArg( $this->query->paged + 1 )->url() : '';
155 }
156
157 if ( 'previous_page_link' === $key ) {
158 return $this->query->paged > 1 ? $this->url->addPageArg( $this->query->paged - 1 )->url() : '';
159 }
160
161 if ( 'pagination_links' === $key ) {
162 return array_map(
163 function ( $i ) {
164 return [
165 'href' => $this->url->addPageArg( $i )->url(),
166 'name' => $i,
167 'current' => (int) $i === (int) $this->query->paged,
168 ];
169 },
170 range( 1, $this->query->max_num_pages )
171 );
172 }
173
174 if ( 'products' === $key ) {
175 return array_map(
176 function ( $post ) {
177 return sc_get_product( $post );
178 },
179 $this->query->posts
180 );
181 }
182
183 return $this->query->$key;
184 }
185 }
186