PluginProbe
Sky Addons for Elementor / trunk
Sky Addons for Elementor vtrunk
3.8.5 3.8.4 3.8.3 3.8.2 3.8.0 3.8.1 3.3.3 3.3.2 trunk 1.0.0 1.0.10 1.0.2 1.0.6 1.0.7 1.0.8 1.0.9 1.5.0 2.0.0 2.0.8 2.5.10 2.5.11 2.5.12 2.5.13 2.5.15 2.5.16 All 52 releases
sky-elementor-addons / includes / custom-scripts / class-custom-scripts-data.php

class-custom-scripts-data.php in Sky Addons for Elementor trunk, at includes/custom-scripts/class-custom-scripts-data.php

341 lines 11.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Custom Scripts Data Class
4 * Registers custom post type and meta fields for custom scripts/styles
5 *
6 * @package Sky_Addons\CustomScripts
7 * @since 3.3.0
8 */
9
10 namespace Sky_Addons\CustomScripts;
11
12 defined( 'ABSPATH' ) || exit;
13
14 class Custom_Scripts_Data {
15 private static $instance = null;
16
17 /**
18 * All meta keys carried by a custom script post — used by clone_script().
19 */
20 const SCRIPT_META_KEYS = [
21 'sky_script_type',
22 'sky_script_content',
23 'sky_script_position',
24 'sky_script_status',
25 'sky_script_start_date',
26 'sky_script_end_date',
27 'sky_script_display_on',
28 'sky_script_not_display_on',
29 'sky_script_display_special_pages',
30 'sky_script_not_display_special_pages',
31 'sky_script_display_custom_pages',
32 'sky_script_not_display_custom_pages',
33 'sky_script_display_roles',
34 ];
35
36 private function __construct() {
37 add_action( 'init', [ $this, 'register_post_type' ] );
38 add_action( 'rest_api_init', [ $this, 'register_rest_routes' ] );
39 add_filter( 'rest_pre_insert_sky-custom-scripts', [ $this, 'rest_pre_insert' ], 10, 2 );
40 add_filter( 'rest_prepare_sky-custom-scripts', [ $this, 'rest_prepare' ], 10, 3 );
41 }
42
43 public static function instance() {
44 if ( is_null( self::$instance ) ) {
45 self::$instance = new self();
46 }
47 return self::$instance;
48 }
49
50 public function __clone() {}
51
52 public function __wakeup() {}
53
54 /**
55 * Filter data before inserting via REST API
56 */
57 public function rest_pre_insert( $prepared_post, $request ) {
58 if ( ! current_user_can( 'manage_options' ) ) {
59 return new \WP_Error(
60 'rest_forbidden',
61 __( 'You do not have permission to manage custom scripts.', 'sky-elementor-addons' ),
62 [ 'status' => 403 ]
63 );
64 }
65
66 // Get the meta data from request
67 $params = $request->get_params();
68
69 if ( isset( $params['meta'] ) && is_array( $params['meta'] ) ) {
70 // If we have a post ID (update), save meta immediately
71 if ( isset( $params['id'] ) ) {
72 $post_id = $params['id'];
73 foreach ( $params['meta'] as $meta_key => $meta_value ) {
74 update_post_meta( $post_id, $meta_key, $meta_value );
75 }
76 } else {
77 // For new posts, we'll handle this in rest_insert action
78 add_action( 'rest_insert_sky-custom-scripts', function ( $post, $request ) use ( $params ) {
79 foreach ( $params['meta'] as $meta_key => $meta_value ) {
80 update_post_meta( $post->ID, $meta_key, $meta_value );
81 }
82 }, 10, 2 );
83 }
84 }
85
86 return $prepared_post;
87 }
88
89 /**
90 * Prepare response to include meta fields
91 */
92 public function rest_prepare( $response, $post, $request ) {
93 $data = $response->get_data();
94
95 // Add meta fields to response
96 $data['meta'] = [
97 'sky_script_type' => get_post_meta( $post->ID, 'sky_script_type', true ) ?: 'js',
98 'sky_script_content' => get_post_meta( $post->ID, 'sky_script_content', true ) ?: '',
99 'sky_script_position' => get_post_meta( $post->ID, 'sky_script_position', true ) ?: 'footer',
100 'sky_script_status' => get_post_meta( $post->ID, 'sky_script_status', true ) ?: 'enabled',
101 'sky_script_start_date' => get_post_meta( $post->ID, 'sky_script_start_date', true ) ?: '',
102 'sky_script_end_date' => get_post_meta( $post->ID, 'sky_script_end_date', true ) ?: '',
103 'sky_script_display_on' => get_post_meta( $post->ID, 'sky_script_display_on', true ) ?: [],
104 'sky_script_not_display_on' => get_post_meta( $post->ID, 'sky_script_not_display_on', true ) ?: [],
105 'sky_script_display_special_pages' => get_post_meta( $post->ID, 'sky_script_display_special_pages', true ) ?: [],
106 'sky_script_not_display_special_pages' => get_post_meta( $post->ID, 'sky_script_not_display_special_pages', true ) ?: [],
107 'sky_script_display_custom_pages' => get_post_meta( $post->ID, 'sky_script_display_custom_pages', true ) ?: [],
108 'sky_script_not_display_custom_pages' => get_post_meta( $post->ID, 'sky_script_not_display_custom_pages', true ) ?: [],
109 'sky_script_display_roles' => get_post_meta( $post->ID, 'sky_script_display_roles', true ) ?: [ 'all_users' ],
110 ];
111
112 $response->set_data( $data );
113 return $response;
114 }
115
116 /**
117 * Register custom post type for scripts/styles
118 */
119 public function register_post_type() {
120 $labels = [
121 'name' => __( 'Custom Scripts', 'sky-elementor-addons' ),
122 'singular_name' => __( 'Custom Script', 'sky-elementor-addons' ),
123 'menu_name' => __( 'Custom Scripts', 'sky-elementor-addons' ),
124 'name_admin_bar' => __( 'Custom Scripts', 'sky-elementor-addons' ),
125 'add_new' => __( 'Add New', 'sky-elementor-addons' ),
126 'add_new_item' => __( 'Add New Script', 'sky-elementor-addons' ),
127 'new_item' => __( 'New Script', 'sky-elementor-addons' ),
128 'edit_item' => __( 'Edit Script', 'sky-elementor-addons' ),
129 'view_item' => __( 'View Script', 'sky-elementor-addons' ),
130 'all_items' => __( 'All Scripts', 'sky-elementor-addons' ),
131 'search_items' => __( 'Search Scripts', 'sky-elementor-addons' ),
132 'parent_item_colon' => __( 'Parent Script:', 'sky-elementor-addons' ),
133 'not_found' => __( 'No Scripts found.', 'sky-elementor-addons' ),
134 'not_found_in_trash' => __( 'No Scripts found in Trash.', 'sky-elementor-addons' ),
135 ];
136
137 $args = [
138 'labels' => $labels,
139 'description' => __( 'Custom Scripts and Styles Manager', 'sky-elementor-addons' ),
140 'taxonomies' => [],
141 'hierarchical' => false,
142 'public' => false,
143 'show_in_menu' => false,
144 'show_ui' => true,
145 'show_in_admin_bar' => false,
146 'menu_position' => null,
147 'menu_icon' => null,
148 'publicly_queryable' => false,
149 'supports' => [ 'title' ],
150 'exclude_from_search' => true,
151 'has_archive' => false,
152 'query_var' => false,
153 'can_export' => true,
154 'rewrite' => false,
155 'show_in_nav_menus' => false,
156 'capability_type' => 'post',
157 'map_meta_cap' => true,
158 'capabilities' => [
159 'create_posts' => 'manage_options',
160 'edit_posts' => 'manage_options',
161 'edit_others_posts' => 'manage_options',
162 'publish_posts' => 'manage_options',
163 'read_private_posts' => 'manage_options',
164 'delete_posts' => 'manage_options',
165 'delete_private_posts' => 'manage_options',
166 'delete_published_posts' => 'manage_options',
167 'delete_others_posts' => 'manage_options',
168 'edit_private_posts' => 'manage_options',
169 'edit_published_posts' => 'manage_options',
170 ],
171 'show_in_rest' => true,
172 ];
173
174 register_post_type( 'sky-custom-scripts', $args );
175
176 // Register meta fields
177 $this->register_meta_fields();
178 }
179
180 /**
181 * Register all meta fields for custom scripts
182 */
183 private function register_meta_fields() {
184 $admin_only = function () {
185 return current_user_can( 'manage_options' );
186 };
187
188 // Script type (css or js)
189 register_post_meta( 'sky-custom-scripts', 'sky_script_type', [
190 'show_in_rest' => true,
191 'single' => true,
192 'type' => 'string',
193 'default' => 'js',
194 'auth_callback' => $admin_only,
195 ]);
196
197 // Script content
198 register_post_meta( 'sky-custom-scripts', 'sky_script_content', [
199 'show_in_rest' => true,
200 'single' => true,
201 'type' => 'string',
202 'default' => '',
203 'auth_callback' => $admin_only,
204 ]);
205
206 // Script position (header or footer)
207 register_post_meta( 'sky-custom-scripts', 'sky_script_position', [
208 'show_in_rest' => true,
209 'single' => true,
210 'type' => 'string',
211 'default' => 'footer',
212 'auth_callback' => $admin_only,
213 ]);
214
215 // Script status (enabled or disabled)
216 register_post_meta( 'sky-custom-scripts', 'sky_script_status', [
217 'show_in_rest' => true,
218 'single' => true,
219 'type' => 'string',
220 'default' => 'enabled',
221 'auth_callback' => $admin_only,
222 ]);
223
224 // Start date for scheduling
225 register_post_meta( 'sky-custom-scripts', 'sky_script_start_date', [
226 'show_in_rest' => true,
227 'single' => true,
228 'type' => 'string',
229 'default' => '',
230 'auth_callback' => $admin_only,
231 ]);
232
233 // End date for scheduling
234 register_post_meta( 'sky-custom-scripts', 'sky_script_end_date', [
235 'show_in_rest' => true,
236 'single' => true,
237 'type' => 'string',
238 'default' => '',
239 'auth_callback' => $admin_only,
240 ]);
241
242 // Array meta fields for conditional loading
243 $array_meta_fields = [
244 'sky_script_display_on',
245 'sky_script_not_display_on',
246 'sky_script_display_special_pages',
247 'sky_script_not_display_special_pages',
248 'sky_script_display_custom_pages',
249 'sky_script_not_display_custom_pages',
250 'sky_script_display_roles',
251 ];
252
253 foreach ( $array_meta_fields as $meta_field ) {
254 register_post_meta( 'sky-custom-scripts', $meta_field, [
255 'show_in_rest' => [
256 'schema' => [
257 'type' => 'array',
258 'items' => [
259 'type' => 'string',
260 ],
261 ],
262 ],
263 'single' => true,
264 'type' => 'array',
265 'default' => [],
266 'auth_callback' => $admin_only,
267 ]);
268 }
269 }
270
271 /**
272 * Register custom REST routes.
273 */
274 public function register_rest_routes() {
275 register_rest_route( 'skyaddons/v1', '/clone-script', [
276 'methods' => \WP_REST_Server::CREATABLE,
277 'callback' => [ $this, 'clone_script' ],
278 'permission_callback' => function () {
279 return current_user_can( 'manage_options' );
280 },
281 'args' => [
282 'id' => [
283 'required' => true,
284 'sanitize_callback' => 'absint',
285 'validate_callback' => function ( $value ) {
286 return is_numeric( $value );
287 },
288 ],
289 ],
290 ] );
291 }
292
293 /**
294 * Duplicate a custom script post with all its meta.
295 *
296 * @param \WP_REST_Request $request
297 * @return \WP_REST_Response|\WP_Error
298 */
299 public function clone_script( $request ) {
300 $source_id = absint( $request->get_param( 'id' ) );
301 $source = get_post( $source_id );
302
303 if ( ! $source || 'sky-custom-scripts' !== $source->post_type ) {
304 return new \WP_Error(
305 'rest_not_found',
306 __( 'Script not found.', 'sky-elementor-addons' ),
307 [ 'status' => 404 ]
308 );
309 }
310
311 $new_id = wp_insert_post( [
312 'post_type' => 'sky-custom-scripts',
313 'post_status' => 'publish',
314 'post_title' => $source->post_title . ' ' . __( '(Copy)', 'sky-elementor-addons' ),
315 ], true );
316
317 if ( is_wp_error( $new_id ) ) {
318 return new \WP_Error(
319 'rest_clone_failed',
320 __( 'Could not duplicate the script.', 'sky-elementor-addons' ),
321 [ 'status' => 500 ]
322 );
323 }
324
325 foreach ( self::SCRIPT_META_KEYS as $key ) {
326 $value = get_post_meta( $source_id, $key, true );
327 if ( '' !== $value && [] !== $value ) {
328 update_post_meta( $new_id, $key, $value );
329 }
330 }
331
332 $controller = new \WP_REST_Posts_Controller( 'sky-custom-scripts' );
333 $req = new \WP_REST_Request( 'GET' );
334 $req->set_param( 'context', 'edit' );
335
336 return $controller->prepare_item_for_response( get_post( $new_id ), $req );
337 }
338 }
339
340 Custom_Scripts_Data::instance();
341