PluginProbe ʕ •ᴥ•ʔ
Pods – Custom Content Types and Fields / 3.2.2
Pods – Custom Content Types and Fields v3.2.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-ACF / Migrate-ACF.php
pods / components / Migrate-ACF Last commit date
ui 3 years ago Migrate-ACF.php 3 years ago
Migrate-ACF.php
479 lines
1 <?php
2 /**
3 * Name: Migrate: Import from the Advanced Custom Fields plugin
4 *
5 * Menu Name: Migrate ACF
6 *
7 * Description: Import Custom Post Types and Taxonomies from the Advanced Custom Fields (<a href="https://wordpress.org/plugins/advanced-custom-fields/">https://wordpress.org/plugins/advanced-custom-fields/</a>). This does NOT migrate custom fields or field groups from ACF.
8 *
9 * Category: Migration
10 *
11 * Version: 1.0
12 *
13 * Plugin: pods-migrate-acf/pods-migrate-acf.php
14 *
15 * @package Pods\Components
16 * @subpackage Migrate-ACF
17 */
18
19 if ( class_exists( 'Pods_Migrate_ACF' ) ) {
20 return;
21 }
22
23 /**
24 * Class Pods_Migrate_ACF
25 */
26 class Pods_Migrate_ACF 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 ACF only when needed.
65 */
66 public function init_data() {
67 if ( null !== $this->post_types ) {
68 return;
69 }
70
71 $this->post_types = function_exists( 'acf_get_acf_post_types' ) ? acf_get_acf_post_types() : [];
72 $this->taxonomies = function_exists( 'acf_get_acf_taxonomies' ) ? acf_get_acf_taxonomies() : [];
73 }
74
75 /**
76 * Enqueue styles
77 *
78 * @since 2.0.0
79 */
80 public function admin_assets() {
81 wp_enqueue_style( 'pods-wizard' );
82 }
83
84 /**
85 * Show the Admin
86 *
87 * @param $options
88 * @param $component
89 */
90 public function admin( $options, $component ) {
91 $this->init_data();
92
93 $post_types = $this->post_types;
94 $taxonomies = $this->taxonomies;
95
96 $method = 'migrate';
97
98 // ajax_migrate
99 pods_view( PODS_DIR . 'components/Migrate-ACF/ui/wizard.php', compact( array_keys( get_defined_vars() ) ) );
100 }
101
102 /**
103 * Handle the Migration AJAX
104 *
105 * @param $params
106 */
107 public function ajax_migrate( $params ) {
108 $this->init_data();
109
110 $post_types = (array) $this->post_types;
111 $taxonomies = (array) $this->taxonomies;
112
113 $migrate_post_types = [];
114
115 if ( isset( $params->post_type ) && ! empty( $params->post_type ) ) {
116 foreach ( $params->post_type as $post_type => $checked ) {
117 if ( true === (boolean) $checked ) {
118 $migrate_post_types[] = $post_type;
119 }
120 }
121 }
122
123 $migrate_taxonomies = [];
124
125 if ( isset( $params->taxonomy ) && ! empty( $params->taxonomy ) ) {
126 foreach ( $params->taxonomy as $taxonomy => $checked ) {
127 if ( true === (boolean) $checked ) {
128 $migrate_taxonomies[] = $taxonomy;
129 }
130 }
131 }
132
133 foreach ( $post_types as $k => $post_type ) {
134 if ( ! in_array( pods_v( 'post_type', $post_type ), $migrate_post_types, true ) ) {
135 continue;
136 }
137
138 $id = $this->migrate_post_type( $post_type );
139
140 if ( 0 < $id ) {
141 unset( $post_types[ $k ] );
142 }
143 }
144
145 foreach ( $taxonomies as $k => $taxonomy ) {
146 if ( ! in_array( pods_v( 'taxonomy', $taxonomy ), $migrate_taxonomies, true ) ) {
147 continue;
148 }
149
150 $id = $this->migrate_taxonomy( $taxonomy );
151
152 if ( 0 < $id ) {
153 unset( $taxonomies[ $k ] );
154 }
155 }
156
157 if ( 1 === (int) pods_v( 'cleanup', $params, 0 ) ) {
158 foreach ( $migrate_post_types as $post_type ) {
159 acf_delete_post_type( $post_type );
160 }
161
162 foreach ( $migrate_taxonomies as $taxonomy ) {
163 acf_delete_taxonomy( $taxonomy );
164 }
165 }//end if
166 }
167
168 /**
169 *
170 *
171 * @since 2.0.0
172 *
173 * @param $post_type
174 *
175 * @return bool|int|mixed
176 */
177 private function migrate_post_type( $post_type ) {
178 $supports = [];
179 $custom_supports = [];
180
181 if ( isset( $post_type['supports'] ) && is_array( $post_type['supports'] ) ) {
182 $supports = $post_type['supports'];
183
184 $core_supports = [
185 'title' => true,
186 'editor' => true,
187 'excerpt' => true,
188 'trackbacks' => true,
189 'custom-fields' => true,
190 'comments' => true,
191 'revisions' => true,
192 'thumbnail' => true,
193 'author' => true,
194 'page-attributes' => true,
195 'post-formats' => true,
196 ];
197
198 foreach ( $supports as $support ) {
199 // Skip support options that are WP core related.
200 if ( isset( $core_supports[ $support ] ) ) {
201 continue;
202 }
203
204 // Add to the custom supports.
205 $custom_supports[] = $support;
206 }
207 }
208
209 $taxonomies = [];
210
211 if ( isset( $post_type['taxonomies'] ) && is_array( $post_type['taxonomies'] ) ) {
212 $taxonomies = $post_type['taxonomies'];
213 }
214
215 $labels = [];
216
217 if ( isset( $post_type['labels'] ) && is_array( $post_type['labels'] ) ) {
218 $labels = $post_type['labels'];
219 }
220
221 $capability_type = [];
222
223 if ( ! empty( $post_type['singular_capability_name'] ) ) {
224 $capability_type[] = $post_type['singular_capability_name'];
225
226 if ( ! empty( $post_type['plural_capability_name'] ) ) {
227 $capability_type[] = $post_type['plural_capability_name'];
228 }
229 }
230
231 $params = [
232 'type' => 'post_type',
233 'storage' => 'meta',
234 'object' => '',
235 'name' => pods_v( 'post_type', $post_type ),
236 'label' => pods_v( 'title', $post_type ),
237 'label_singular' => pods_v( 'singular_name', $labels ),
238 'description' => pods_v( 'description', $post_type ),
239
240 // Supports arguments.
241 'supports_title' => in_array( 'title', $supports, true ),
242 'supports_editor' => in_array( 'editor', $supports, true ),
243 'supports_excerpt' => in_array( 'excerpt', $supports, true ),
244 'supports_trackbacks' => in_array( 'trackbacks', $supports, true ),
245 'supports_custom_fields' => in_array( 'custom-fields', $supports, true ),
246 'supports_comments' => in_array( 'comments', $supports, true ),
247 'supports_revisions' => in_array( 'revisions', $supports, true ),
248 'supports_thumbnail' => in_array( 'thumbnail', $supports, true ),
249 'supports_author' => in_array( 'author', $supports, true ),
250 'supports_page_attributes' => in_array( 'page-attributes', $supports, true ),
251 'supports_post_formats' => in_array( 'post-formats', $supports, true ),
252 'supports_custom' => implode( ',', $custom_supports ),
253
254 // Custom labels.
255 'menu_name' => pods_v( 'menu_name', $labels ),
256 'label_all_items' => pods_v( 'all_items', $labels ),
257 'label_add_new' => pods_v( 'add_new', $labels ),
258 'label_add_new_item' => pods_v( 'add_new_item', $labels ),
259 'label_edit_item' => pods_v( 'edit_item', $labels ),
260 'label_new_item' => pods_v( 'new_item', $labels ),
261 'label_view_item' => pods_v( 'view_item', $labels ),
262 'label_view_items' => pods_v( 'view_items', $labels ),
263 'label_search_items' => pods_v( 'search_items', $labels ),
264 'label_not_found' => pods_v( 'not_found', $labels ),
265 'label_not_found_in_trash' => pods_v( 'not_found_in_trash', $labels ),
266 'label_parent' => pods_v( 'parent', $labels ),
267 'label_featured_image' => pods_v( 'featured_image', $labels ),
268 'label_set_featured_image' => pods_v( 'set_featured_image', $labels ),
269 'label_remove_featured_image' => pods_v( 'remove_featured_image', $labels ),
270 'label_use_featured_image' => pods_v( 'use_featured_image', $labels ),
271 'label_archives' => pods_v( 'archives', $labels ),
272 'label_insert_into_item' => pods_v( 'insert_into_item', $labels ),
273 'label_uploaded_to_this_item' => pods_v( 'uploaded_to_this_item', $labels ),
274 'label_filter_items_list' => pods_v( 'filter_items_list', $labels ),
275 'label_items_list_navigation' => pods_v( 'items_list_navigation', $labels ),
276 'label_items_list' => pods_v( 'items_list', $labels ),
277 'label_attributes' => pods_v( 'attributes', $labels ),
278 'label_name_admin_bar' => pods_v( 'name_admin_bar', $labels ),
279 'label_item_published' => pods_v( 'item_published', $labels ),
280 'label_item_published_privately' => pods_v( 'item_published_privately', $labels ),
281 'label_item_reverted_to_draft' => pods_v( 'item_reverted_to_draft', $labels ),
282 'label_item_scheduled' => pods_v( 'item_scheduled', $labels ),
283 'label_item_updated' => pods_v( 'item_updated', $labels ),
284 'label_parent_item_colon' => pods_v( 'parent_item_colon', $labels ),
285
286 // Custom enter title here functionality.
287 'placeholder_enter_title_here' => pods_v( 'enter_title_here', $labels ),
288
289 // Other settings.
290 'public' => (int) pods_v( 'public', $post_type ),
291 'publicly_queryable' => (int) pods_v( 'publicly_queryable', $post_type ),
292 'show_ui' => (int) pods_v( 'show_ui', $post_type ),
293 'show_in_nav_menus' => (int) pods_v( 'show_in_nav_menus', $post_type ),
294 'delete_with_user' => (int) pods_v( 'delete_with_user', $post_type ),
295 'show_in_rest' => (int) pods_v( 'show_in_rest', $post_type ),
296 'rest_base' => pods_v( 'rest_base', $post_type ),
297 'rest_controller_class' => pods_v( 'rest_controller_class', $post_type ), // Not currently used.
298 'rest_namespace' => pods_v( 'rest_namespace', $post_type ),
299 'has_archive' => (int) pods_v( 'has_archive', $post_type ),
300 'has_archive_string' => pods_v( 'has_archive_slug', $post_type ),
301 'exclude_from_search' => (int) pods_v( 'exclude_from_search', $post_type ),
302 'capability_type' => implode( ',', $capability_type ),
303 'hierarchical' => (int) pods_v( 'hierarchical', $post_type ),
304 'can_export' => (int) pods_v( 'can_export', $post_type ),
305 'rewrite' => (int) ( 'no_permalink' !== pods_v( 'permalink_rewrite', pods_v( 'rewrite', $post_type ) ) ),
306 'rewrite_custom_slug' => pods_v( 'slug', pods_v( 'rewrite', $post_type ) ),
307 'rewrite_with_front' => (int) pods_v( 'with_front', pods_v( 'rewrite', $post_type ) ),
308 'query_var' => (int) ( 'none' !== pods_v( 'query_var', $post_type ) ),
309 'query_var_string' => pods_v( 'query_var_name', $post_type ),
310 'menu_position' => pods_v( 'menu_position', $post_type ),
311 'show_in_menu' => (int) pods_v( 'show_in_menu', $post_type ),
312 'menu_location_custom' => pods_v( 'admin_menu_parent', $post_type ),
313 'menu_icon' => pods_v( 'menu_icon', $post_type ),
314 'register_meta_box_cb' => pods_v( 'register_meta_box_cb', $post_type ), // Not currently used.
315
316 'import_source' => 'acf',
317 ];
318
319 // Migrate built-in taxonomies
320 $builtin = $taxonomies;
321
322 foreach ( $builtin as $taxonomy_name ) {
323 $params[ 'built_in_taxonomies_' . $taxonomy_name ] = 1;
324 }
325
326 if ( ! is_object( $this->api ) ) {
327 $this->api = pods_api();
328 }
329
330 $pod = $this->api->load_pod( [ 'name' => pods_clean_name( $params['name'] ) ], false );
331
332 if ( ! empty( $pod ) ) {
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 $labels = $taxonomy['labels'];
369 }
370
371 $post_types = [];
372
373 if ( isset( $taxonomy['object_type'] ) && is_array( $taxonomy['object_type'] ) ) {
374 $post_types = $taxonomy['object_type'];
375 }
376
377 $default_term_enabled = (int) pods_v( 'default_term_enabled', $taxonomy );
378
379 $params = [
380 'type' => 'taxonomy',
381 'storage' => 'meta',
382 'object' => '',
383 'name' => pods_v( 'taxonomy', $taxonomy ),
384 'label' => pods_v( 'title', $taxonomy ),
385 'label_singular' => pods_v( 'singular_name', $labels ),
386 'description' => pods_v( 'description', $taxonomy ),
387
388 // Custom labels.
389 'label_menu_name' => pods_v( 'menu_name', $labels ),
390 'label_all_items' => pods_v( 'all_items', $labels ),
391 'label_edit_item' => pods_v( 'edit_item', $labels ),
392 'label_view_item' => pods_v( 'view_item', $labels ),
393 'label_update_item' => pods_v( 'update_item', $labels ),
394 'label_add_new_item' => pods_v( 'add_new_item', $labels ),
395 'label_new_item_name' => pods_v( 'new_item_name', $labels ),
396 'label_parent_item' => pods_v( 'parent_item', $labels ),
397 'label_parent_item_colon' => pods_v( 'parent_item_colon', $labels ),
398 'label_search_items' => pods_v( 'search_items', $labels ),
399 'label_popular_items' => pods_v( 'popular_items', $labels ),
400 'label_separate_items_with_commas' => pods_v( 'separate_items_with_commas', $labels ),
401 'label_add_or_remove_items' => pods_v( 'add_or_remove_items', $labels ),
402 'label_choose_from_most_used' => pods_v( 'choose_from_most_used', $labels ),
403 'label_not_found' => pods_v( 'not_found', $labels ),
404 'label_no_terms' => pods_v( 'no_terms', $labels ),
405 'label_items_list_navigation' => pods_v( 'items_list_navigation', $labels ),
406 'label_items_list' => pods_v( 'items_list', $labels ),
407 'label_back_to_items' => pods_v( 'back_to_items', $labels ),
408 'label_parent_field_description' => pods_v( 'parent_field_description', $labels ),
409 'label_slug_field_description' => pods_v( 'slug_field_description', $labels ),
410 'label_desc_field_description' => pods_v( 'desc_field_description', $labels ),
411
412 // Other settings.
413 'public' => (int) pods_v( 'public', $taxonomy, 1 ),
414 'publicly_queryable' => (int) pods_v( 'publicly_queryable', $taxonomy, 1 ),
415 'hierarchical' => (int) pods_v( 'hierarchical', $taxonomy ),
416 'show_ui' => (int) pods_v( 'show_ui', $taxonomy, 1 ),
417 'show_in_menu' => (int) pods_v( 'show_in_menu', $taxonomy, 1 ),
418 'show_in_nav_menus' => (int) pods_v( 'show_in_nav_menus', $taxonomy, 1 ),
419 'rewrite' => (int) ( 'no_permalink' !== pods_v( 'permalink_rewrite', pods_v( 'rewrite', $taxonomy ) ) ),
420 'rewrite_custom_slug' => pods_v( 'slug', pods_v( 'rewrite', $taxonomy ) ),
421 'rewrite_with_front' => (int) pods_v( 'with_front', pods_v( 'rewrite', $taxonomy ) ),
422 'rewrite_hierarchical' => (int) pods_v( 'rewrite_hierarchical', pods_v( 'rewrite', $taxonomy ) ),
423 'query_var' => (int) ( 'none' !== pods_v( 'query_var', $taxonomy ) ),
424 'query_var_string' => pods_v( 'query_var_name', $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' => 1 === $default_term_enabled ? pods_v( 'default_term_name', $taxonomy ) : null,
436 'default_term_slug' => 1 === $default_term_enabled ? pods_v( 'default_term_slug', $taxonomy ) : null,
437 'default_term_description' => 1 === $default_term_enabled ? pods_v( 'default_term_description', $taxonomy ) : null,
438
439 'import_source' => 'acf',
440 ];
441
442 // Migrate attach-to
443 $attach = $post_types;
444
445 foreach ( $attach as $type_name ) {
446 $params[ 'built_in_post_types_' . $type_name ] = 1;
447 }
448
449 if ( ! is_object( $this->api ) ) {
450 $this->api = pods_api();
451 }
452
453 $pod = $this->api->load_pod( [ 'name' => pods_clean_name( $params['name'] ) ], false );
454
455 if ( ! empty( $pod ) ) {
456 return pods_error( sprintf( __( 'Pod with the name %s already exists', 'pods' ), pods_clean_name( $params['name'] ) ) );
457 }
458
459 $id = (int) $this->api->save_pod( $params );
460
461 if ( empty( $id ) ) {
462 return false;
463 }
464
465 $pod = $this->api->load_pod( [ 'id' => $id ], false );
466
467 if ( empty( $pod ) ) {
468 return false;
469 }
470
471 if ( $pod['name'] != $params['name'] ) {
472 $this->api->rename_wp_object_type( $params['type'], $params['name'], $pod['name'] );
473 }
474
475 return $id;
476 }
477
478 }
479