<?php namespace CarouselSlider\Admin; use CarouselSlider\Helper; use CarouselSlider\Interfaces\SliderViewInterface; use WP_Post; /** * Admin live preview */ class PreviewMetaBox { /** * The instance of the class * * @var self */ protected static $instance; /** * Ensures only one instance of the class is loaded or can be loaded. * * @return self */ public static function init() { if ( is_null( self::$instance ) ) { self::$instance = new self(); add_action( 'add_meta_boxes', array( self::$instance, 'add_meta_boxes' ) ); add_action( 'wp_ajax_carousel_slider_preview_meta_box', array( self::$instance, 'preview_meta_box' ) ); } return self::$instance; } /** * Add carousel slider meta box * * @param string $post_type The post type. */ public function add_meta_boxes( $post_type ) { if ( CAROUSEL_SLIDER_POST_TYPE !== $post_type ) { return; } add_meta_box( 'carousel-slider-live-preview', __( 'Live Preview', 'carousel-slider' ), [ $this, 'carousel_slider_live_preview' ], CAROUSEL_SLIDER_POST_TYPE, 'normal', 'high' ); } /** * Carousel slider live preview * * @return void */ public function carousel_slider_live_preview() { ?> <div id="carousel_slider_preview_iframe_container" class="carousel_slider_preview_iframe_container"></div> <div id="carousel_slider_preview_meta_box"></div> <?php } /** * Send preview meta box * * @return void */ public function preview_meta_box() { $nonce = isset( $_REQUEST['cs_nonce'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['cs_nonce'] ) ) : ''; // phpcs:ignore if ( ! wp_verify_nonce( $nonce, 'carousel_slider_ajax_nonce' ) ) { wp_send_json_error( __( 'Sorry, you are not allowed to access this resource.', 'carousel-slider' ), 403 ); } $post_id = isset( $_REQUEST['post_ID'] ) ? absint( $_REQUEST['post_ID'] ) : 0; $post = get_post( $post_id ); if ( ! $post instanceof WP_Post ) { wp_send_json_error( __( 'Sorry, no item found for your request.', 'carousel-slider' ), 404 ); } if ( ! current_user_can( 'edit_post', $post_id ) ) { wp_send_json_error( __( 'Sorry, you are not allowed to access this resource.', 'carousel-slider' ), 403 ); } if ( CAROUSEL_SLIDER_POST_TYPE !== $post->post_type ) { wp_send_json_error( __( 'Sorry, you are not allowed to access this resource.', 'carousel-slider' ), 401 ); } $slider_type = get_post_meta( $post_id, '_slide_type', true ); $view = Helper::get_slider_view( $slider_type ); if ( ! $view instanceof SliderViewInterface ) { wp_send_json_error( __( 'Sorry, no item found for your request.', 'carousel-slider' ), 422 ); } $view->set_slider_id( $post_id ); $view->set_slider_type( $slider_type ); // Modify setting. $setting = $view->get_slider_setting(); $common_settings = $_POST['carousel_slider'] ?? []; $setting->read_http_post_variables( $common_settings ); if ( 'image-carousel' === $slider_type ) { $image_carousel = $_POST['image_carousel'] ?? []; $setting->read_extra_http_post_variables( $image_carousel ); } $view->set_slider_setting( $setting ); // @TODO remove save option with temp MetaBox::init()->save_meta_box( $post_id ); $response = [ 'slider_type' => $slider_type, 'html' => $view->render(), ]; wp_send_json_success( $response, 200 ); } }