WC_REST_Product_Custom_Fields_Controller::get_item_names
Get a collection of custom field names.
Method of the class: WC_REST_Product_Custom_Fields_Controller{}
No Hooks.
Returns
WP_Error|WP_REST_Response.
Usage
$WC_REST_Product_Custom_Fields_Controller = new WC_REST_Product_Custom_Fields_Controller(); $WC_REST_Product_Custom_Fields_Controller->get_item_names( $request );
- $request(WP_REST_Request) (required)
- Full details about the request.
WC_REST_Product_Custom_Fields_Controller::get_item_names() WC REST Product Custom Fields Controller::get item names code WC 10.4.3
public function get_item_names( $request ) {
global $wpdb;
$search = trim( $request['search'] );
$order = strtoupper( $request['order'] ) === 'DESC' ? 'DESC' : 'ASC';
$page = (int) $request['page'];
$limit = (int) $request['per_page'];
$offset = ( $page - 1 ) * $limit;
$base_query = $wpdb->prepare(
"SELECT DISTINCT post_metas.meta_key
FROM {$wpdb->postmeta} post_metas LEFT JOIN {$wpdb->posts} posts ON post_metas.post_id = posts.id
WHERE posts.post_type = %s AND post_metas.meta_key NOT LIKE %s AND post_metas.meta_key LIKE %s",
$this->post_type,
$wpdb->esc_like( '_' ) . '%',
'%' . $wpdb->esc_like( $search ) . '%'
);
$query = $base_query;
$query .= $wpdb->prepare( " ORDER BY post_metas.meta_key $order LIMIT %d, %d", $offset, $limit ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $order is safe.
// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $base_query has been prepared already.
$total_query = "SELECT COUNT(1) FROM ($base_query) AS total";
// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- $query has been prepared already.
$query_result = $wpdb->get_results( $query );
// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- $total_query has been prepared already.
$total_items = $wpdb->get_var( $total_query );
$custom_field_names = array();
foreach ( $query_result as $custom_field_name ) {
$custom_field_names[] = $custom_field_name->meta_key;
}
$response = rest_ensure_response( $custom_field_names );
$response->header( 'X-WP-Total', (int) $total_items );
$max_pages = ceil( $total_items / $limit );
$response->header( 'X-WP-TotalPages', (int) $max_pages );
$base = add_query_arg( $request->get_query_params(), rest_url( '/' . $this->namespace . '/' . $this->rest_base . '/names' ) );
if ( $page > 1 ) {
$prev_page = $page - 1;
if ( $prev_page > $max_pages ) {
$prev_page = $max_pages;
}
$prev_link = add_query_arg( 'page', $prev_page, $base );
$response->link_header( 'prev', $prev_link );
}
if ( $max_pages > $page ) {
$next_page = $page + 1;
$next_link = add_query_arg( 'page', $next_page, $base );
$response->link_header( 'next', $next_link );
}
return $response;
}