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 ) {
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;
@ -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 ) );
}
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(
$location,
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
*/
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.md](locations.md)
# The below sections are being moved to their own doc files as the API gets fleshed out.
## 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": ""
}
]
}
## Groups
[groups.md](groups.md)
# The below sections are being moved to their own doc files (and may change) as the API gets fleshed out.
## /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:
* _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'.
* _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.
Any other fields passed will be stripped out before the JSON response is sent back to the client.