387 lines
10 KiB
PHP
387 lines
10 KiB
PHP
<?php
|
|
/**
|
|
* REST API functionality for overlays.
|
|
*
|
|
* @package GenerateBlocks Pro
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // No direct access, please.
|
|
}
|
|
|
|
/**
|
|
* Class GenerateBlocks_Pro_Overlay_Rest
|
|
*/
|
|
class GenerateBlocks_Pro_Overlay_Rest extends GenerateBlocks_Pro_Singleton {
|
|
/**
|
|
* Initialize class.
|
|
*/
|
|
public function init() {
|
|
// Don't initialize if overlays are disabled.
|
|
if ( ! generateblocks_pro_overlays_enabled() ) {
|
|
return;
|
|
}
|
|
|
|
add_action( 'rest_api_init', [ $this, 'register_routes' ] );
|
|
add_filter( 'rest_prepare_gblocks_overlay', [ $this, 'add_category_to_response' ], 10, 3 );
|
|
add_action( 'rest_insert_gblocks_overlay', [ $this, 'handle_category_on_save' ], 10, 3 );
|
|
}
|
|
|
|
/**
|
|
* Register REST routes.
|
|
*/
|
|
public function register_routes() {
|
|
register_rest_route(
|
|
'generateblocks-pro/overlays/v1',
|
|
'/get_modal_categories/',
|
|
[
|
|
[
|
|
'methods' => 'GET',
|
|
'callback' => [ $this, 'get_overlay_categories' ],
|
|
'permission_callback' => [ $this, 'permissions_check' ],
|
|
],
|
|
]
|
|
);
|
|
|
|
register_rest_route(
|
|
'generateblocks-pro/overlays/v1',
|
|
'/manage_category/',
|
|
[
|
|
[
|
|
'methods' => 'POST',
|
|
'callback' => [ $this, 'create_category' ],
|
|
'permission_callback' => [ $this, 'permissions_check' ],
|
|
'args' => [
|
|
'name' => [
|
|
'required' => true,
|
|
'type' => 'string',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
],
|
|
],
|
|
],
|
|
]
|
|
);
|
|
|
|
register_rest_route(
|
|
'generateblocks-pro/overlays/v1',
|
|
'/overlays/',
|
|
[
|
|
[
|
|
'methods' => 'GET',
|
|
'callback' => [ $this, 'get_overlays' ],
|
|
'permission_callback' => [ $this, 'permissions_check' ],
|
|
],
|
|
]
|
|
);
|
|
|
|
register_rest_route(
|
|
'generateblocks-pro/overlays/v1',
|
|
'/manage_category/(?P<id>\d+)',
|
|
[
|
|
[
|
|
'methods' => 'POST',
|
|
'callback' => [ $this, 'update_category' ],
|
|
'permission_callback' => [ $this, 'permissions_check' ],
|
|
'args' => [
|
|
'id' => [
|
|
'required' => true,
|
|
'type' => 'integer',
|
|
'sanitize_callback' => 'absint',
|
|
],
|
|
'name' => [
|
|
'required' => true,
|
|
'type' => 'string',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
],
|
|
],
|
|
],
|
|
[
|
|
'methods' => 'DELETE',
|
|
'callback' => [ $this, 'delete_category' ],
|
|
'permission_callback' => [ $this, 'permissions_check' ],
|
|
'args' => [
|
|
'id' => [
|
|
'required' => true,
|
|
'type' => 'integer',
|
|
'sanitize_callback' => 'absint',
|
|
],
|
|
],
|
|
],
|
|
]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Check if a given request has access to manage categories.
|
|
*
|
|
* @param WP_REST_Request $request Full data about the request.
|
|
* @return bool
|
|
*/
|
|
public function permissions_check( $request ) {
|
|
// For modifying operations, check manage permission.
|
|
$request_method = $_SERVER['REQUEST_METHOD'] ?? '';
|
|
|
|
if ( in_array( $request_method, [ 'POST', 'PUT', 'PATCH', 'DELETE' ], true ) ) {
|
|
// Creating, updating, or deleting requires manage permission.
|
|
return GenerateBlocks_Pro_Overlays::current_user_can_use_overlays( 'manage' );
|
|
}
|
|
|
|
// Reading/listing only requires use permission.
|
|
return GenerateBlocks_Pro_Overlays::current_user_can_use_overlays( 'use' );
|
|
}
|
|
|
|
/**
|
|
* Get all overlays.
|
|
*
|
|
* @param WP_REST_Request $request Full data about the request.
|
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
|
*/
|
|
public function get_overlays( $request ) {
|
|
$can_manage = GenerateBlocks_Pro_Overlays::current_user_can_use_overlays( 'manage' );
|
|
|
|
$args = [
|
|
'post_type' => 'gblocks_overlay',
|
|
'posts_per_page' => 100,
|
|
'post_status' => $can_manage ? 'any' : 'publish',
|
|
'orderby' => 'title',
|
|
'order' => 'ASC',
|
|
];
|
|
|
|
$posts = get_posts( $args );
|
|
$overlays = [];
|
|
|
|
foreach ( $posts as $post ) {
|
|
if ( ! current_user_can( 'read_post', $post->ID ) ) {
|
|
continue;
|
|
}
|
|
|
|
$category_terms = wp_get_post_terms( $post->ID, 'gblocks_overlay_cat', [ 'fields' => 'ids' ] );
|
|
$overlay_type = get_post_meta( $post->ID, '_gb_overlay_type', true );
|
|
$display_condition = get_post_meta( $post->ID, '_gb_overlay_display_condition', true );
|
|
$display_condition_invert = get_post_meta( $post->ID, '_gb_overlay_display_condition_invert', true );
|
|
|
|
$overlays[] = [
|
|
'id' => $post->ID,
|
|
'title' => [ 'rendered' => $post->post_title ],
|
|
'status' => $post->post_status,
|
|
'gblocks_overlay_cat' => ! empty( $category_terms ) ? $category_terms : [],
|
|
'overlay_type' => ! empty( $overlay_type ) ? $overlay_type : 'standard',
|
|
'display_condition' => ! empty( $display_condition ) ? $display_condition : '',
|
|
'display_condition_invert' => ! empty( $display_condition_invert ) ? $display_condition_invert : false,
|
|
];
|
|
}
|
|
|
|
return new WP_REST_Response(
|
|
[
|
|
'success' => true,
|
|
'response' => [
|
|
'modals' => $overlays,
|
|
],
|
|
],
|
|
200
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get all overlay categories.
|
|
*
|
|
* @param WP_REST_Request $request Full data about the request.
|
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
|
*/
|
|
public function get_overlay_categories( $request ) {
|
|
$terms = get_terms(
|
|
[
|
|
'taxonomy' => 'gblocks_overlay_cat',
|
|
'hide_empty' => false,
|
|
]
|
|
);
|
|
|
|
if ( is_wp_error( $terms ) ) {
|
|
return $terms;
|
|
}
|
|
|
|
// Add count for each category.
|
|
$categories = [];
|
|
foreach ( $terms as $term ) {
|
|
$categories[] = [
|
|
'id' => $term->term_id,
|
|
'name' => $term->name,
|
|
'slug' => $term->slug,
|
|
'count' => $term->count,
|
|
];
|
|
}
|
|
|
|
return new WP_REST_Response(
|
|
[
|
|
'success' => true,
|
|
'categories' => $categories,
|
|
],
|
|
200
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Create a new category.
|
|
*
|
|
* @param WP_REST_Request $request Full data about the request.
|
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
|
*/
|
|
public function create_category( $request ) {
|
|
$name = $request->get_param( 'name' );
|
|
|
|
$term = wp_insert_term( $name, 'gblocks_overlay_cat' );
|
|
|
|
if ( is_wp_error( $term ) ) {
|
|
return new WP_Error(
|
|
'create_failed',
|
|
__( 'Failed to create category.', 'generateblocks-pro' ),
|
|
[ 'status' => 400 ]
|
|
);
|
|
}
|
|
|
|
$created_term = get_term( $term['term_id'], 'gblocks_overlay_cat' );
|
|
|
|
return new WP_REST_Response(
|
|
[
|
|
'success' => true,
|
|
'category' => [
|
|
'id' => $created_term->term_id,
|
|
'name' => $created_term->name,
|
|
'slug' => $created_term->slug,
|
|
'count' => 0,
|
|
],
|
|
],
|
|
201
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Update a category.
|
|
*
|
|
* @param WP_REST_Request $request Full data about the request.
|
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
|
*/
|
|
public function update_category( $request ) {
|
|
$id = $request->get_param( 'id' );
|
|
$name = $request->get_param( 'name' );
|
|
|
|
$term = wp_update_term(
|
|
$id,
|
|
'gblocks_overlay_cat',
|
|
[
|
|
'name' => $name,
|
|
]
|
|
);
|
|
|
|
if ( is_wp_error( $term ) ) {
|
|
return new WP_Error(
|
|
'update_failed',
|
|
__( 'Failed to update category.', 'generateblocks-pro' ),
|
|
[ 'status' => 400 ]
|
|
);
|
|
}
|
|
|
|
$updated_term = get_term( $id, 'gblocks_overlay_cat' );
|
|
|
|
return new WP_REST_Response(
|
|
[
|
|
'success' => true,
|
|
'category' => [
|
|
'id' => $updated_term->term_id,
|
|
'name' => $updated_term->name,
|
|
'slug' => $updated_term->slug,
|
|
'count' => $updated_term->count,
|
|
],
|
|
],
|
|
200
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Delete a category.
|
|
*
|
|
* @param WP_REST_Request $request Full data about the request.
|
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
|
*/
|
|
public function delete_category( $request ) {
|
|
$id = $request->get_param( 'id' );
|
|
|
|
// Check if category is in use.
|
|
$term = get_term( $id, 'gblocks_overlay_cat' );
|
|
if ( is_wp_error( $term ) ) {
|
|
return new WP_Error(
|
|
'term_not_found',
|
|
__( 'Category not found.', 'generateblocks-pro' ),
|
|
[ 'status' => 404 ]
|
|
);
|
|
}
|
|
|
|
$result = wp_delete_term( $id, 'gblocks_overlay_cat' );
|
|
|
|
if ( is_wp_error( $result ) ) {
|
|
return new WP_Error(
|
|
'delete_failed',
|
|
__( 'Failed to delete category.', 'generateblocks-pro' ),
|
|
[ 'status' => 400 ]
|
|
);
|
|
}
|
|
|
|
return new WP_REST_Response(
|
|
[
|
|
'success' => true,
|
|
'message' => __( 'Category deleted successfully.', 'generateblocks-pro' ),
|
|
],
|
|
200
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Add category to REST response.
|
|
*
|
|
* @param WP_REST_Response $response The response object.
|
|
* @param WP_Post $post Post object.
|
|
* @param WP_REST_Request $request Request object.
|
|
* @return WP_REST_Response
|
|
*/
|
|
public function add_category_to_response( $response, $post, $request ) {
|
|
$category_terms = wp_get_post_terms( $post->ID, 'gblocks_overlay_cat', [ 'fields' => 'ids' ] );
|
|
$response->data['gblocks_overlay_cat'] = ! empty( $category_terms ) ? $category_terms : [];
|
|
|
|
// Add overlay type to response.
|
|
$overlay_type = get_post_meta( $post->ID, '_gb_overlay_type', true );
|
|
$response->data['overlay_type'] = ! empty( $overlay_type ) ? $overlay_type : 'standard';
|
|
|
|
// Add display condition to response.
|
|
$display_condition = get_post_meta( $post->ID, '_gb_overlay_display_condition', true );
|
|
$response->data['display_condition'] = ! empty( $display_condition ) ? $display_condition : '';
|
|
|
|
// Add display condition invert to response.
|
|
$display_condition_invert = get_post_meta( $post->ID, '_gb_overlay_display_condition_invert', true );
|
|
$response->data['display_condition_invert'] = ! empty( $display_condition_invert ) ? $display_condition_invert : false;
|
|
|
|
return $response;
|
|
}
|
|
|
|
/**
|
|
* Handle category assignment when saving overlay.
|
|
*
|
|
* @param WP_Post $post Inserted or updated post object.
|
|
* @param WP_REST_Request $request Request object.
|
|
* @param bool $creating True when creating a post, false when updating.
|
|
*/
|
|
public function handle_category_on_save( $post, $request, $creating ) {
|
|
if ( isset( $request['gblocks_overlay_cat'] ) ) {
|
|
$categories = $request['gblocks_overlay_cat'];
|
|
if ( ! is_array( $categories ) ) {
|
|
$categories = [ $categories ];
|
|
}
|
|
|
|
// Convert to integers and filter out empty values.
|
|
$categories = array_filter( array_map( 'intval', $categories ) );
|
|
wp_set_post_terms( $post->ID, $categories, 'gblocks_overlay_cat' );
|
|
}
|
|
}
|
|
}
|
|
|
|
GenerateBlocks_Pro_Overlay_Rest::get_instance()->init();
|