<?php /** * Rest API functions * * @package advanced-backgrounds */ if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Class NK_AWB_Rest */ class NK_AWB_Rest extends WP_REST_Controller { /** * Namespace. * * @var string */ protected $namespace = 'awb/v'; /** * Version. * * @var string */ protected $version = '1'; /** * NK_AWB_Rest constructor. */ public function __construct() { add_action( 'rest_api_init', array( $this, 'register_routes' ) ); } /** * Register rest routes. */ public function register_routes() { $namespace = $this->namespace . $this->version; // Get attachment image <img> tag. register_rest_route( $namespace, '/get_attachment_image/(?P<id>[\d]+)', array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_attachment_image' ), 'permission_callback' => array( $this, 'get_attachment_image_permission' ), ) ); } /** * Get attachment image <img> tag permissions. * * @return bool */ public function get_attachment_image_permission() { if ( current_user_can( 'edit_posts' ) ) { return true; } foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) { if ( current_user_can( $post_type->cap->edit_posts ) ) { return true; } } return $this->error( 'not_allowed', esc_html__( 'Sorry, you are not allowed to get the image for background.', 'advanced-backgrounds' ), true ); } /** * Get attachment image <img> tag. * * @param WP_REST_Request $request request object. * * @return mixed */ public function get_attachment_image( WP_REST_Request $request ) { $id = $request->get_param( 'id' ); $size = $request->get_param( 'size' ); $icon = $request->get_param( 'icon' ); $attr = $request->get_param( 'attr' ); $div_tag = $request->get_param( 'div_tag' ); if ( ! $id ) { return $this->error( 'no_id_found', __( 'Provide image ID.', 'advanced-backgrounds' ) ); } $attr = isset( $attr ) && $attr && is_array( $attr ) ? $attr : array(); if ( $div_tag ) { $image_url = wp_get_attachment_image_url( $id, $size, $icon ); if ( ! isset( $attr['style'] ) ) { $attr['style'] = ''; } $attr['style'] .= 'background-image: url("' . esc_url( $image_url ) . '");'; $attr = array_map( 'esc_attr', $attr ); $image = '<div'; foreach ( $attr as $name => $value ) { $image .= " $name=" . '"' . $value . '"'; } $image .= '></div>'; } else { $image_src = wp_get_attachment_image_src( $id, $size, $icon ); if ( $image_src ) { list( $src, $width, $height ) = $image_src; $alt = trim( wp_strip_all_tags( get_post_meta( $id, '_wp_attachment_image_alt', true ) ) ); if ( $alt ) { $attr['alt'] = $alt; } if ( ! isset( $attr['class'] ) ) { $attr['class'] = 'wp-image-' . $id; } else { $attr['class'] = 'wp-image-' . $id . ' ' . $attr['class']; } $attr['width'] = $width; $attr['height'] = $height; $attrs_str = ''; if ( isset( $attr ) && is_array( $attr ) ) { foreach ( $attr as $name => $val ) { $attrs_str .= ' ' . $name . '="' . esc_attr( $val ) . '"'; } } $image = '<img src="' . esc_url( $src ) . '"' . $attrs_str . ' />'; } } if ( $image ) { return $this->success( $image ); } else { return $this->error( 'no_image_found', __( 'Image not found.', 'advanced-backgrounds' ) ); } } /** * Success rest. * * @param mixed $response response data. * @return mixed */ public function success( $response ) { return new WP_REST_Response( array( 'success' => true, 'response' => $response, ), 200 ); } /** * Error rest. * * @param mixed $code error code. * @param mixed $response response data. * @param boolean $true_error use true error response to stop the code processing. * @return mixed */ public function error( $code, $response, $true_error = false ) { if ( $true_error ) { return new WP_Error( $code, $response, array( 'status' => 401 ) ); } return new WP_REST_Response( array( 'error' => true, 'success' => false, 'error_code' => $code, 'response' => $response, ), 401 ); } }