1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
<?php /** * REST API Product Attribute Terms Controller * * Handles requests to /products/attributes/<slug>/terms */
namespace Automattic\WooCommerce\Admin\API;
defined( 'ABSPATH' ) || exit;
/** * Product attribute terms controller. * * @internal * @extends WC_REST_Product_Attribute_Terms_Controller */ class ProductAttributeTerms extends \WC_REST_Product_Attribute_Terms_Controller { use CustomAttributeTraits;
/** * Endpoint namespace. * * @var string */ protected $namespace = 'wc-analytics';
/** * Register the routes for custom product attributes. */ public function register_routes() { parent::register_routes();
register_rest_route( $this->namespace, 'products/attributes/(?P<slug>[a-z0-9_\-]+)/terms', array( 'args' => array( 'slug' => array( 'description' => __( 'Slug identifier for the resource.', 'woocommerce' ), 'type' => 'string', ), ), array( 'methods' => \WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item_by_slug' ), 'permission_callback' => array( $this, 'get_custom_attribute_permissions_check' ), 'args' => $this->get_collection_params(), ), 'schema' => array( $this, 'get_public_item_schema' ), ) ); }
/** * Check if a given request has access to read a custom attribute. * * @param WP_REST_Request $request Full details about the request. * @return WP_Error|boolean */ public function get_custom_attribute_permissions_check( $request ) { if ( ! wc_rest_check_manager_permissions( 'attributes', 'read' ) ) { return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code(), ) ); }
return true; }
/** * Get the Attribute's schema, conforming to JSON Schema. * * @return array */ public function get_item_schema() { $schema = parent::get_item_schema(); // Custom attributes substitute slugs for numeric IDs. $schema['properties']['id']['type'] = array( 'integer', 'string' );
return $schema; }
/** * Query custom attribute values by slug. * * @param string $slug Attribute slug. * @return array Attribute values, formatted for response. */ protected function get_custom_attribute_values( $slug ) { global $wpdb;
if ( empty( $slug ) ) { return array(); }
$attribute_values = array();
// Get the attribute properties. $attribute = $this->get_custom_attribute_by_slug( $slug );
if ( is_wp_error( $attribute ) ) { return $attribute; }
// Find all attribute values assigned to products. $query_results = $wpdb->get_results( $wpdb->prepare( "SELECT meta_value, COUNT(meta_id) AS product_count FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value != '' GROUP BY meta_value", 'attribute_' . esc_sql( $slug ) ), OBJECT_K );
// Ensure all defined properties are in the response. $defined_values = wc_get_text_attributes( $attribute[ $slug ]['value'] );
foreach ( $defined_values as $defined_value ) { if ( array_key_exists( $defined_value, $query_results ) ) { continue; }
$query_results[ $defined_value ] = (object) array( 'meta_value' => $defined_value, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value 'product_count' => 0, ); }
foreach ( $query_results as $term_value => $term ) { // Mimic the structure of a taxonomy-backed attribute values for response. $data = array( 'id' => $term_value, 'name' => $term_value, 'slug' => $term_value, 'description' => '', 'menu_order' => 0, 'count' => (int) $term->product_count, );
$response = rest_ensure_response( $data ); $response->add_links( array( 'collection' => array( 'href' => rest_url( $this->namespace . '/products/attributes/' . $slug . '/terms' ), ), ) ); $response = $this->prepare_response_for_collection( $response );
$attribute_values[ $term_value ] = $response; }
return array_values( $attribute_values ); }
/** * Get a single custom attribute. * * @param WP_REST_Request $request Full details about the request. * @return WP_REST_Request|WP_Error */ public function get_item_by_slug( $request ) { return $this->get_custom_attribute_values( $request['slug'] ); } }
|