PluginProbe ʕ •ᴥ•ʔ
Pods – Custom Content Types and Fields / 3.3.2
Pods – Custom Content Types and Fields v3.3.2
trunk 1.14.8 2.7.31.3 2.8.23.3 2.9.19.3 3.0.10.3 3.1.4.1 3.2.0 3.2.1 3.2.1.1 3.2.2 3.2.4 3.2.5 3.2.6 3.2.7 3.2.7.1 3.2.8 3.2.8.1 3.2.8.2 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9
pods / components / Migrate-CPTUI / Migrate-CPTUI.php
pods / components / Migrate-CPTUI Last commit date
ui 1 year ago Migrate-CPTUI.php 3 years ago
Migrate-CPTUI.php
494 lines
1 <?php
2 /**
3 * Name: Migrate: Import from the Custom Post Type UI plugin
4 *
5 * Menu Name: Migrate CPT UI
6 *
7 * Description: Import Custom Post Types and Taxonomies from Custom Post Type UI (<a href="https://wordpress.org/plugins/custom-post-type-ui/">https://wordpress.org/plugins/custom-post-type-ui/</a>)
8 *
9 * Category: Migration
10 *
11 * Version: 1.0
12 *
13 * Plugin: pods-migrate-custom-post-type-ui/pods-migrate-custom-post-type-ui.php
14 *
15 * @package Pods\Components
16 * @subpackage Migrate-Cptui
17 */
18
19 if ( class_exists( 'Pods_Migrate_CPTUI' ) ) {
20 return;
21 }
22
23 /**
24 * Class Pods_Migrate_CPTUI
25 */
26 class Pods_Migrate_CPTUI extends PodsComponent {
27
28 /** @var array
29 *
30 * Support option names for multiple versions, list from newest to oldest
31 */
32 private $post_option_name_list = [
33 'cptui_post_types',
34 'cpt_custom_post_types',
35 ];
36
37 /** @var array
38 *
39 * Support option names for multiple versions, list from newest to oldest
40 */
41 private $taxonomy_option_name_list = [
42 'cptui_taxonomies',
43 'cpt_custom_tax_types',
44 ];
45
46 private $api = null;
47
48 private $post_option_name = null;
49
50 private $taxonomy_option_name = null;
51
52 private $post_types = null;
53
54 private $taxonomies = null;
55
56 /**
57 * {@inheritdoc}
58 */
59 public function init() {
60 // Nothing to do here.
61 }
62
63 /**
64 * Init the data from CPTUI only when needed.
65 */
66 public function init_data() {
67 if ( null !== $this->post_option_name ) {
68 return;
69 }
70
71 $this->post_option_name = $this->get_option_name( $this->post_option_name_list );
72 if ( ! is_null( $this->post_option_name ) ) {
73 $this->post_types = (array) get_option( $this->post_option_name, [] );
74 }
75 $this->taxonomy_option_name = $this->get_option_name( $this->taxonomy_option_name_list );
76 if ( ! is_null( $this->taxonomy_option_name ) ) {
77 $this->taxonomies = (array) get_option( $this->taxonomy_option_name, [] );
78 }
79 }
80
81 /**
82 * Enqueue styles
83 *
84 * @since 2.0.0
85 */
86 public function admin_assets() {
87 wp_enqueue_style( 'pods-wizard' );
88 }
89
90 /**
91 * Show the Admin
92 *
93 * @param $options
94 * @param $component
95 */
96 public function admin( $options, $component ) {
97 $this->init_data();
98
99 $post_types = (array) $this->post_types;
100 $taxonomies = (array) $this->taxonomies;
101
102 $method = 'migrate';
103
104 // ajax_migrate
105 pods_view( PODS_DIR . 'components/Migrate-CPTUI/ui/wizard.php', compact( array_keys( get_defined_vars() ) ) );
106 }
107
108 /**
109 * Handle the Migration AJAX
110 *
111 * @param $params
112 */
113 public function ajax_migrate( $params ) {
114 $this->init_data();
115
116 $post_types = (array) $this->post_types;
117 $taxonomies = (array) $this->taxonomies;
118
119 $migrate_post_types = [];
120
121 if ( isset( $params->post_type ) && ! empty( $params->post_type ) ) {
122 foreach ( $params->post_type as $post_type => $checked ) {
123 if ( true === (boolean) $checked ) {
124 $migrate_post_types[] = $post_type;
125 }
126 }
127 }
128
129 $migrate_taxonomies = [];
130
131 if ( isset( $params->taxonomy ) && ! empty( $params->taxonomy ) ) {
132 foreach ( $params->taxonomy as $taxonomy => $checked ) {
133 if ( true === (boolean) $checked ) {
134 $migrate_taxonomies[] = $taxonomy;
135 }
136 }
137 }
138
139 foreach ( $post_types as $k => $post_type ) {
140 if ( ! in_array( pods_v( 'name', $post_type ), $migrate_post_types, true ) ) {
141 continue;
142 }
143
144 $id = $this->migrate_post_type( $post_type );
145
146 if ( 0 < $id ) {
147 unset( $post_types[ $k ] );
148 }
149 }
150
151 foreach ( $taxonomies as $k => $taxonomy ) {
152 if ( ! in_array( pods_v( 'name', $taxonomy ), $migrate_taxonomies, true ) ) {
153 continue;
154 }
155
156 $id = $this->migrate_taxonomy( $taxonomy );
157
158 if ( 0 < $id ) {
159 unset( $taxonomies[ $k ] );
160 }
161 }
162
163 if ( 1 === (int) pods_v( 'cleanup', $params, 0 ) ) {
164 if ( ! empty( $post_types ) ) {
165 if ( ! is_null( $this->post_option_name ) ) {
166 update_option( $this->post_option_name, $post_types );
167 }
168 } else {
169 if ( ! is_null( $this->post_option_name ) ) {
170 delete_option( $this->post_option_name );
171 }
172 }
173
174 if ( ! empty( $taxonomies ) ) {
175 if ( ! is_null( $this->taxonomy_option_name ) ) {
176 update_option( $this->taxonomy_option_name, $taxonomies );
177 }
178 } else {
179 if ( ! is_null( $this->taxonomy_option_name ) ) {
180 delete_option( $this->taxonomy_option_name );
181 }
182 }
183 }//end if
184 }
185
186 /**
187 *
188 *
189 * @since 2.0.0
190 *
191 * @param $post_type
192 *
193 * @return bool|int|mixed
194 */
195 private function migrate_post_type( $post_type ) {
196 $supports = [];
197
198 if ( isset( $post_type['supports'] ) && is_array( $post_type['supports'] ) ) {
199 // New style.
200 $supports = $post_type['supports'];
201 } elseif ( isset( $post_type[0] ) && is_array( $post_type[0] ) ) {
202 // Old style.
203 $supports = $post_type[0];
204 }
205
206 $taxonomies = [];
207
208 if ( isset( $post_type['taxonomies'] ) && is_array( $post_type['taxonomies'] ) ) {
209 // New style.
210 $taxonomies = $post_type['taxonomies'];
211 } elseif ( isset( $post_type[1] ) && is_array( $post_type[1] ) ) {
212 // Old style.
213 $taxonomies = $post_type[1];
214 }
215
216 $labels = [];
217
218 if ( isset( $post_type['labels'] ) && is_array( $post_type['labels'] ) ) {
219 // New style.
220 $labels = $post_type['labels'];
221 } elseif ( isset( $post_type[2] ) && is_array( $post_type[2] ) ) {
222 // Old style.
223 $labels = $post_type[2];
224 }
225
226 $params = [
227 'type' => 'post_type',
228 'storage' => 'meta',
229 'object' => '',
230 'name' => pods_v( 'name', $post_type ),
231 'label' => pods_v( 'label', $post_type ),
232 'label_singular' => pods_v( 'singular_label', $post_type ),
233 'description' => pods_v( 'description', $post_type ),
234
235 // Supports arguments.
236 'supports_title' => in_array( 'title', $supports, true ),
237 'supports_editor' => in_array( 'editor', $supports, true ),
238 'supports_excerpt' => in_array( 'excerpt', $supports, true ),
239 'supports_trackbacks' => in_array( 'trackbacks', $supports, true ),
240 'supports_custom_fields' => in_array( 'custom-fields', $supports, true ),
241 'supports_comments' => in_array( 'comments', $supports, true ),
242 'supports_revisions' => in_array( 'revisions', $supports, true ),
243 'supports_thumbnail' => in_array( 'thumbnail', $supports, true ),
244 'supports_author' => in_array( 'author', $supports, true ),
245 'supports_page_attributes' => in_array( 'page-attributes', $supports, true ),
246 'supports_post_formats' => in_array( 'post-formats', $supports, true ),
247 'supports_custom' => pods_v( 'custom_supports', $post_type ),
248
249 // Custom labels.
250 'menu_name' => pods_v( 'menu_name', $labels ),
251 'label_all_items' => pods_v( 'all_items', $labels ),
252 'label_add_new' => pods_v( 'add_new', $labels ),
253 'label_add_new_item' => pods_v( 'add_new_item', $labels ),
254 'label_edit_item' => pods_v( 'edit_item', $labels ),
255 'label_new_item' => pods_v( 'new_item', $labels ),
256 'label_view_item' => pods_v( 'view_item', $labels ),
257 'label_view_items' => pods_v( 'view_items', $labels ),
258 'label_search_items' => pods_v( 'search_items', $labels ),
259 'label_not_found' => pods_v( 'not_found', $labels ),
260 'label_not_found_in_trash' => pods_v( 'not_found_in_trash', $labels ),
261 'label_parent' => pods_v( 'parent', $labels ),
262 'label_featured_image' => pods_v( 'featured_image', $labels ),
263 'label_set_featured_image' => pods_v( 'set_featured_image', $labels ),
264 'label_remove_featured_image' => pods_v( 'remove_featured_image', $labels ),
265 'label_use_featured_image' => pods_v( 'use_featured_image', $labels ),
266 'label_archives' => pods_v( 'archives', $labels ),
267 'label_insert_into_item' => pods_v( 'insert_into_item', $labels ),
268 'label_uploaded_to_this_item' => pods_v( 'uploaded_to_this_item', $labels ),
269 'label_filter_items_list' => pods_v( 'filter_items_list', $labels ),
270 'label_items_list_navigation' => pods_v( 'items_list_navigation', $labels ),
271 'label_items_list' => pods_v( 'items_list', $labels ),
272 'label_attributes' => pods_v( 'attributes', $labels ),
273 'label_name_admin_bar' => pods_v( 'name_admin_bar', $labels ),
274 'label_item_published' => pods_v( 'item_published', $labels ),
275 'label_item_published_privately' => pods_v( 'item_published_privately', $labels ),
276 'label_item_reverted_to_draft' => pods_v( 'item_reverted_to_draft', $labels ),
277 'label_item_scheduled' => pods_v( 'item_scheduled', $labels ),
278 'label_item_updated' => pods_v( 'item_updated', $labels ),
279 'label_parent_item_colon' => pods_v( 'parent_item_colon', $labels ),
280
281 // Custom enter title here functionality.
282 'placeholder_enter_title_here' => pods_v( 'enter_title_here', $labels ),
283
284 // Other settings.
285 'public' => (int) pods_v( 'public', $post_type ),
286 'publicly_queryable' => (int) pods_v( 'publicly_queryable', $post_type ),
287 'show_ui' => (int) pods_v( 'show_ui', $post_type ),
288 'show_in_nav_menus' => (int) pods_v( 'show_in_nav_menus', $post_type ),
289 'delete_with_user' => (int) pods_v( 'delete_with_user', $post_type ),
290 'show_in_rest' => (int) pods_v( 'show_in_rest', $post_type ),
291 'rest_base' => pods_v( 'rest_base', $post_type ),
292 'rest_controller_class' => pods_v( 'rest_controller_class', $post_type ), // Not currently used.
293 'rest_namespace' => pods_v( 'rest_namespace', $post_type ),
294 'has_archive' => (int) pods_v( 'has_archive', $post_type ),
295 'has_archive_string' => pods_v( 'has_archive_string', $post_type ),
296 'exclude_from_search' => (int) pods_v( 'exclude_from_search', $post_type ),
297 'capability_type' => pods_v( 'capability_type', $post_type ),
298 'hierarchical' => (int) pods_v( 'hierarchical', $post_type ),
299 'can_export' => (int) pods_v( 'can_export', $post_type ),
300 'rewrite' => (int) pods_v( 'rewrite', $post_type ),
301 'rewrite_custom_slug' => pods_v( 'rewrite_slug', $post_type ),
302 'rewrite_with_front' => (int) pods_v( 'rewrite_withfront', $post_type ),
303 'query_var' => (int) pods_v( 'query_var', $post_type ),
304 'query_var_string' => pods_v( 'query_var_slug', $post_type ),
305 'menu_position' => pods_v( 'menu_position', $post_type ),
306 'show_in_menu' => (int) pods_v( 'show_in_menu', $post_type ),
307 'menu_location_custom' => pods_v( 'show_in_menu_string', $post_type ),
308 'menu_icon' => pods_v( 'menu_icon', $post_type ),
309 'register_meta_box_cb' => pods_v( 'register_meta_box_cb', $post_type ), // Not currently used.
310 ];
311
312 // Migrate built-in taxonomies
313 $builtin = $taxonomies;
314
315 foreach ( $builtin as $taxonomy_name ) {
316 $params[ 'built_in_taxonomies_' . $taxonomy_name ] = 1;
317 }
318
319 if ( ! is_object( $this->api ) ) {
320 $this->api = pods_api();
321 }
322
323 $pod = $this->api->load_pod( [ 'name' => pods_clean_name( $params['name'] ) ], false );
324
325 if ( ! empty( $pod ) ) {
326 return pods_error( sprintf( __( 'Pod with the name %s already exists', 'pods' ), pods_clean_name( $params['name'] ) ) );
327 }
328
329 $id = (int) $this->api->save_pod( $params );
330
331 if ( empty( $id ) ) {
332 return false;
333 }
334
335 $pod = $this->api->load_pod( [ 'id' => $id ], false );
336
337 if ( empty( $pod ) ) {
338 return false;
339 }
340
341 if ( $pod['name'] !== $params['name'] ) {
342 $this->api->rename_wp_object_type( $params['type'], $params['name'], $pod['name'] );
343 }
344
345 return $id;
346 }
347
348 /**
349 *
350 *
351 * @since 2.0.0
352 *
353 * @param $taxonomy
354 *
355 * @return bool|int|mixed
356 */
357 private function migrate_taxonomy( $taxonomy ) {
358 $labels = [];
359
360 if ( isset( $taxonomy['labels'] ) && is_array( $taxonomy['labels'] ) ) {
361 // New style.
362 $labels = $taxonomy['labels'];
363 } elseif ( isset( $taxonomy[0] ) && is_array( $taxonomy[0] ) ) {
364 // Old style.
365 $labels = $taxonomy[0];
366 }
367
368 $post_types = [];
369
370 if ( isset( $taxonomy['object_types'] ) && is_array( $taxonomy['object_types'] ) ) {
371 // New style.
372 $post_types = $taxonomy['object_types'];
373 } elseif ( isset( $taxonomy[0] ) && is_array( $taxonomy[0] ) ) {
374 // Old style.
375 $post_types = $taxonomy[0];
376 }
377
378 $default_term = explode( ',', pods_v( 'default_term', $taxonomy ) );
379
380 $params = [
381 'type' => 'taxonomy',
382 'storage' => 'meta',
383 'object' => '',
384 'name' => pods_v( 'name', $taxonomy ),
385 'label' => pods_v( 'label', $taxonomy ),
386 'label_singular' => pods_v( 'singular_label', $taxonomy ),
387 'description' => pods_v( 'description', $taxonomy ),
388
389 // Custom labels.
390 'label_menu_name' => pods_v( 'menu_name', $labels ),
391 'label_all_items' => pods_v( 'all_items', $labels ),
392 'label_edit_item' => pods_v( 'edit_item', $labels ),
393 'label_view_item' => pods_v( 'view_item', $labels ),
394 'label_update_item' => pods_v( 'update_item', $labels ),
395 'label_add_new_item' => pods_v( 'add_new_item', $labels ),
396 'label_new_item_name' => pods_v( 'new_item_name', $labels ),
397 'label_parent_item' => pods_v( 'parent_item', $labels ),
398 'label_parent_item_colon' => pods_v( 'parent_item_colon', $labels ),
399 'label_search_items' => pods_v( 'search_items', $labels ),
400 'label_popular_items' => pods_v( 'popular_items', $labels ),
401 'label_separate_items_with_commas' => pods_v( 'separate_items_with_commas', $labels ),
402 'label_add_or_remove_items' => pods_v( 'add_or_remove_items', $labels ),
403 'label_choose_from_most_used' => pods_v( 'choose_from_most_used', $labels ),
404 'label_not_found' => pods_v( 'not_found', $labels ),
405 'label_no_terms' => pods_v( 'no_terms', $labels ),
406 'label_items_list_navigation' => pods_v( 'items_list_navigation', $labels ),
407 'label_items_list' => pods_v( 'items_list', $labels ),
408 'label_back_to_items' => pods_v( 'back_to_items', $labels ),
409 'label_parent_field_description' => pods_v( 'parent_field_description', $labels ),
410 'label_slug_field_description' => pods_v( 'slug_field_description', $labels ),
411 'label_desc_field_description' => pods_v( 'desc_field_description', $labels ),
412
413 // Other settings.
414 'public' => (int) pods_v( 'public', $taxonomy, 1 ),
415 'publicly_queryable' => (int) pods_v( 'publicly_queryable', $taxonomy, 1 ),
416 'hierarchical' => (int) pods_v( 'hierarchical', $taxonomy ),
417 'show_ui' => (int) pods_v( 'show_ui', $taxonomy, 1 ),
418 'show_in_menu' => (int) pods_v( 'show_in_menu', $taxonomy, 1 ),
419 'show_in_nav_menus' => (int) pods_v( 'show_in_nav_menus', $taxonomy, 1 ),
420 'query_var' => (int) pods_v( 'query_var', $taxonomy, 1 ),
421 'query_var_string' => pods_v( 'query_var_slug', $taxonomy ),
422 'rewrite' => (int) pods_v( 'rewrite', $taxonomy, 1 ),
423 'rewrite_custom_slug' => pods_v( 'rewrite_slug', $taxonomy ),
424 'rewrite_with_front' => (int) pods_v( 'rewrite_withfront', $taxonomy ),
425 'rewrite_hierarchical' => (int) pods_v( 'rewrite_hierarchical', $taxonomy ),
426 'show_admin_column' => (int) pods_v( 'show_admin_column', $taxonomy ),
427 'show_in_rest' => (int) pods_v( 'show_in_rest', $taxonomy ),
428 'show_tagcloud' => (int) pods_v( 'show_tagcloud', $taxonomy ),
429 'sort' => (int) pods_v( 'sort', $taxonomy ),
430 'show_in_quick_edit' => (int) pods_v( 'show_in_quick_edit', $taxonomy ),
431 'rest_base' => pods_v( 'rest_base', $taxonomy ),
432 'rest_controller_class' => pods_v( 'rest_controller_class', $taxonomy ), // Not currently used.
433 'rest_namespace' => pods_v( 'rest_namespace', $taxonomy ),
434 'register_meta_box_cb' => pods_v( 'meta_box_cb', $taxonomy ), // Not currently used.
435 'default_term_name' => pods_v( 0, $default_term ),
436 'default_term_slug' => pods_v( 1, $default_term ),
437 'default_term_description' => pods_v( 2, $default_term ),
438 ];
439
440 // Migrate attach-to
441 $attach = $post_types;
442
443 foreach ( $attach as $type_name ) {
444 $params[ 'built_in_post_types_' . $type_name ] = 1;
445 }
446
447 if ( ! is_object( $this->api ) ) {
448 $this->api = pods_api();
449 }
450
451 $pod = $this->api->load_pod( [ 'name' => pods_clean_name( $params['name'] ) ], false );
452
453 if ( ! empty( $pod ) ) {
454 return pods_error( sprintf( __( 'Pod with the name %s already exists', 'pods' ), pods_clean_name( $params['name'] ) ) );
455 }
456
457 $id = (int) $this->api->save_pod( $params );
458
459 if ( empty( $id ) ) {
460 return false;
461 }
462
463 $pod = $this->api->load_pod( [ 'id' => $id ], false );
464
465 if ( empty( $pod ) ) {
466 return false;
467 }
468
469 if ( $pod['name'] != $params['name'] ) {
470 $this->api->rename_wp_object_type( $params['type'], $params['name'], $pod['name'] );
471 }
472
473 return $id;
474 }
475
476 /**
477 * @param array $option_name_list List of possible option names.
478 *
479 * @return null|string The first found option name, or NULL if none were found
480 */
481 private function get_option_name( $option_name_list ) {
482 $option_name_list = (array) $option_name_list;
483
484 foreach ( $option_name_list as $this_option_name ) {
485 if ( null !== get_option( $this_option_name, null ) ) {
486 return $this_option_name;
487 }
488 }
489
490 return null;
491 }
492
493 }
494