403 ] ); } if ( ! current_user_can( 'manage_options' ) ) { wp_die( 'You do not have permission to preview placements.', 'Permission Denied', [ 'response' => 403 ] ); } $placement_id = absint( $_GET['advajra_preview'] ); $placement = Placement::get( $placement_id ); if ( ! $placement ) { wp_die( 'Placement not found.', 'Not Found', [ 'response' => 404 ] ); } $is_content_type = in_array( $placement->type, [ 'before_content', 'after_content', 'after_paragraph' ], true ); if ( $is_content_type && ! is_single() && ! isset( $_GET['advajra_rp'] ) ) { $latest = get_posts( [ 'numberposts' => 1, 'post_type' => 'post', ] ); if ( ! empty( $latest ) ) { $url = get_permalink( $latest[0]->ID ); $url = add_query_arg( [ 'advajra_preview' => $placement_id, 'advajra_preview_nonce' => wp_create_nonce( 'advajra_preview' ), 'advajra_rp' => 1, ], $url ); wp_safe_redirect( $url ); exit; } } add_filter( 'advajra_active_placements', function ( $placements ) use ( $placement, $is_content_type ) { $injector_type = $is_content_type ? 'content' : $placement->type; $preview_placement = [ 'id' => (int) $placement->id, 'name' => $placement->name, 'type' => $injector_type, 'item_type' => $placement->item_type, 'item_id' => (int) $placement->item_id, 'args' => [ 'point' => ( 'before_content' === $placement->type ) ? 'before' : 'after', 'paragraph' => $placement->paragraph_num ?? 0, ], ]; return [ $preview_placement ]; }, 99 ); add_action( 'wp_enqueue_scripts', [ __CLASS__, 'enqueue_preview_assets' ] ); add_action( 'wp_footer', function () use ( $placement, $placement_id ) { self::render_preview_ui( $placement, $placement_id ); }, 999 ); } /** * Enqueue live preview overlay assets. */ public static function enqueue_preview_assets() { wp_enqueue_style( 'advajra-preview', ADVAJRA_URL . 'assets/css/preview.css', [], ADVAJRA_VERSION ); } /** * Render the live preview frontend UI overlay. */ private static function render_preview_ui( $placement, $placement_id ) { $position_info = self::get_position_info( $placement ); ?>
👁️ Live Preview Mode name ); ?>
Exit Preview
'Before Content', 'after_content' => 'After Content', 'after_paragraph' => 'After Paragraph ' . ( $placement->paragraph_num ?? '?' ), 'header' => 'Header', 'footer' => 'Footer', 'shortcode' => 'Shortcode', ]; return $map[ $placement->type ] ?? 'Unknown'; } }