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