WC_REST_Product_Custom_Fields_Controller::get_item_names()publicWC 1.0

Get a collection of custom field names.

Method of the class: WC_REST_Product_Custom_Fields_Controller{}

No Hooks.

Return

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() code WC 9.5.1

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 ) . '%'
	);

	// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $base_query has been prepared already and $order is a static value.
	$query = $wpdb->prepare(
		"$base_query ORDER BY post_metas.meta_key $order LIMIT %d, %d",
		$offset,
		$limit
	);

	// 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;
}