Add group info to the single locations endpoint & update our docs

This commit is contained in:
Justin Shreve 2016-03-21 13:38:22 -07:00
parent 06e787a26d
commit 785e43a207
4 changed files with 75 additions and 58 deletions

View File

@ -54,7 +54,7 @@ class WC_Rest_Settings_Controller extends WP_Rest_Controller {
*/ */
public function permissions_check( $request ) { public function permissions_check( $request ) {
if ( ! current_user_can( 'manage_options' ) ) { if ( ! current_user_can( 'manage_options' ) ) {
return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot access settings.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); // return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot access settings.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
} }
return true; return true;
@ -124,6 +124,16 @@ class WC_Rest_Settings_Controller extends WP_Rest_Controller {
return new WP_Error( 'rest_setting_location_invalid_id', __( 'Invalid location id.' ), array( 'status' => 404 ) ); return new WP_Error( 'rest_setting_location_invalid_id', __( 'Invalid location id.' ), array( 'status' => 404 ) );
} }
if ( 'page' === $location['type'] ) {
$location['groups'] = array();
$groups = apply_filters( 'woocommerce_settings_groups_' . $location['id'], array() );
if ( ! empty( $groups ) ) {
foreach ( $groups as $group ) {
$location['groups'][] = array( 'id' => $group['id'], 'label' => $group['label'], 'description' => $group['description'] );
}
}
}
$filtered_location = array_intersect_key( $filtered_location = array_intersect_key(
$location, $location,
array_flip( array_filter( array_keys( $location ), array( $this, 'filter_location_keys' ) ) ) array_flip( array_filter( array_keys( $location ), array( $this, 'filter_location_keys' ) ) )
@ -140,7 +150,7 @@ class WC_Rest_Settings_Controller extends WP_Rest_Controller {
* @return boolean * @return boolean
*/ */
public function filter_location_keys( $key ) { public function filter_location_keys( $key ) {
return in_array( $key, array( 'id', 'type', 'label', 'description' ) ); return in_array( $key, array( 'id', 'type', 'label', 'description', 'groups' ) );
} }
/** /**

View File

@ -9,61 +9,10 @@ All settings are registered with PHP filters. Not through the REST API. The REST
## Locations ## Locations
[locations.md](locations.md) [locations.md](locations.md)
# The below sections are being moved to their own doc files as the API gets fleshed out. ## Groups
[groups.md](groups.md)
## GET /settings/sections/$section/
Lists all settings "groups" on a specific page.
On the 'Products' page this would be 'General', 'Display', 'Inventory', and 'Downloadable Products'.
Metaboxes won't need to use this.
![](https://cldup.com/qXlfpvItr6-3000x3000.png)
Here is how you would register groups:
// products would be replaced with whatever page ID you want to register for. These filters automatically exist after registering a page
add_filter( 'woocommerce_settings_groups_products', function( $groups ) {
$groups[] = array(
'id' => 'general',
'label' => __( 'General', 'woocommerce' ), // human readable label (required)
'description' => '', // human readable description (optional)
);
$groups[] = array(
'id' => 'display',
'label' => __( 'Display', 'woocommerce' ),
'description' => '',
);
$groups[] = array(
'id' => 'inventory',
'label' => __( 'Inventory', 'woocommerce' ),
'description' => '',
);
return $groups;
} );
To retrive the groups for the 'products' page:
GET /settings/sections/products
{
"label": "Products",
"description": "",
"groups": [
{
"id": "general",
"label": "General",
"description": ""
},
{
"id": "display",
"label": "Display",
"description": ""
}
]
}
# The below sections are being moved to their own doc files (and may change) as the API gets fleshed out.
## /settings/$identifer ## /settings/$identifer

View File

@ -0,0 +1,58 @@
# Groups
## Basic Info
Groups are settings thats are grouped together on setting pages _only_ (type=page). That means setting locations like metaboxes don't have groups.
For example, a location would be the 'Products' page.
The products page would ave the following groups: 'General', 'Display', 'Inventory', and 'Downloadable Products'.
![](https://cldup.com/qXlfpvItr6-3000x3000.png)
{
"id": "general",
"label": "General",
"description": ""
}
There are 3 fields that make up a group:
* _id_: A unique identifier that can be used to link settings together. The identifiers for groups only need to be unique on a specific page, so you can have a 'general' group under 'Products' and a 'general' group under Shipping. Alphanumeric string that contains no spaces. Required.
* _label_: A human readable label. This is a translated string that can be used in the UI. Required.
* _description_: A human readable description. This is a translated string that can be used in the UI. Optional.
Any other fields passed will be stripped out before the JSON response is sent back to the client.
## Registering a group
Groups can be registered with the `woocommerce_settings_groups_{$location_id}` filter:
add_filter( 'woocommerce_settings_groups_products', function( $groups ) {
$groups[] = array(
'id' => 'extra-settings',
'label' => __( 'Extras', 'woocommerce-test-extension' ),
'description' => '',
);
return $groups;
} );
## Endpoints
There are no separate endpoints for groups. You can access a list of groups for a specific page/location by calling that location's endpoint.
### GET /settings/locations/$id
{
"id": "test",
"type": "page",
"label": "Test Extension",
"description": "My awesome test settings.",
"groups": [
{
"id": "general",
"label": "General",
"description": ""
}
]
}

View File

@ -22,9 +22,9 @@ The coupon data box is considered location and would be represented like so:
There are 4 fields that make up a location: There are 4 fields that make up a location:
* _id_: A unique identifier that can be used to link settings together. Alphanumeric string that contains no spaces. Required. * _id_: A unique identifier that can be used to link settings together. This shoud be a unique (for the whole system) value. Prefixing with your plugin slug is recommended for non-core changes. Alphanumeric string that contains no spaces. Required.
* _type_: Context for where the settings in this location are going to be displayed. Right now core accepts 'page' for settings pages (pages currently under WooCommerce > Settings), 'metabox' (for metabox grouped settings like Coupon Data - this name is subject to change as this API develops), and 'shipping-zone' for settings associated with shipping zone settings. Alphanumeric string that contains no spaces. Required, defaults to 'page'. * _type_: Context for where the settings in this location are going to be displayed. Right now core accepts 'page' for settings pages (pages currently under WooCommerce > Settings), 'metabox' (for metabox grouped settings like Coupon Data - this name is subject to change as this API develops), and 'shipping-zone' for settings associated with shipping zone settings. Alphanumeric string that contains no spaces. Required, defaults to 'page'.
* _label_: A human readable label. This is a translated string that can be used in the UI. Optional. * _label_: A human readable label. This is a translated string that can be used in the UI. Required.
* _description_: A human readable description. This is a translated string that can be used in the UI. Optional. * _description_: A human readable description. This is a translated string that can be used in the UI. Optional.
Any other fields passed will be stripped out before the JSON response is sent back to the client. Any other fields passed will be stripped out before the JSON response is sent back to the client.