PluginProbe ʕ •ᴥ•ʔ
Pods – Custom Content Types and Fields / 3.3.7
Pods – Custom Content Types and Fields v3.3.7
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 4 months ago Migrate-ACF.php 4 months ago
Migrate-ACF.php
490 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 Advanced Custom Fields plugin
10 *
11 * Menu Name: Migrate ACF
12 *
13 * 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.
14 *
15 * Category: Migration
16 *
17 * Version: 1.0
18 *
19 * Plugin: pods-migrate-acf/pods-migrate-acf.php
20 *
21 * @package Pods\Components
22 * @subpackage Migrate-ACF
23 */
24
25 if ( class_exists( 'Pods_Migrate_ACF' ) ) {
26 return;
27 }
28
29 /**
30 * Class Pods_Migrate_ACF
31 */
32 class Pods_Migrate_ACF 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 ACF only when needed.
71 */
72 public function init_data() {
73 if ( null !== $this->post_types ) {
74 return;
75 }
76
77 $this->post_types = function_exists( 'acf_get_acf_post_types' ) ? acf_get_acf_post_types() : [];
78 $this->taxonomies = function_exists( 'acf_get_acf_taxonomies' ) ? acf_get_acf_taxonomies() : [];
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 = $this->post_types;
100 $taxonomies = $this->taxonomies;
101
102 $method = 'migrate';
103
104 // ajax_migrate
105 pods_view( PODS_DIR . 'components/Migrate-ACF/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( 'post_type', $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( 'taxonomy', $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 foreach ( $migrate_post_types as $post_type ) {
165 if ( function_exists( 'acf_delete_post_type' ) ) {
166 acf_delete_post_type( $post_type );
167 }
168 }
169
170 foreach ( $migrate_taxonomies as $taxonomy ) {
171 if ( function_exists( 'acf_delete_taxonomy' ) ) {
172 acf_delete_taxonomy( $taxonomy );
173 }
174 }
175 }//end if
176 }
177
178 /**
179 *
180 *
181 * @since 2.0.0
182 *
183 * @param $post_type
184 *
185 * @return bool|int|mixed
186 */
187 private function migrate_post_type( $post_type ) {
188 $supports = [];
189 $custom_supports = [];
190
191 if ( isset( $post_type['supports'] ) && is_array( $post_type['supports'] ) ) {
192 $supports = $post_type['supports'];
193
194 $core_supports = [
195 'title' => true,
196 'editor' => true,
197 'excerpt' => true,
198 'trackbacks' => true,
199 'custom-fields' => true,
200 'comments' => true,
201 'revisions' => true,
202 'thumbnail' => true,
203 'author' => true,
204 'page-attributes' => true,
205 'post-formats' => true,
206 ];
207
208 foreach ( $supports as $support ) {
209 // Skip support options that are WP core related.
210 if ( isset( $core_supports[ $support ] ) ) {
211 continue;
212 }
213
214 // Add to the custom supports.
215 $custom_supports[] = $support;
216 }
217 }
218
219 $taxonomies = [];
220
221 if ( isset( $post_type['taxonomies'] ) && is_array( $post_type['taxonomies'] ) ) {
222 $taxonomies = $post_type['taxonomies'];
223 }
224
225 $labels = [];
226
227 if ( isset( $post_type['labels'] ) && is_array( $post_type['labels'] ) ) {
228 $labels = $post_type['labels'];
229 }
230
231 $capability_type = [];
232
233 if ( ! empty( $post_type['singular_capability_name'] ) ) {
234 $capability_type[] = $post_type['singular_capability_name'];
235
236 if ( ! empty( $post_type['plural_capability_name'] ) ) {
237 $capability_type[] = $post_type['plural_capability_name'];
238 }
239 }
240
241 $params = [
242 'type' => 'post_type',
243 'storage' => 'meta',
244 'object' => '',
245 'name' => pods_v( 'post_type', $post_type ),
246 'label' => pods_v( 'title', $post_type ),
247 'label_singular' => pods_v( 'singular_name', $labels ),
248 'description' => pods_v( 'description', $post_type ),
249
250 // Supports arguments.
251 'supports_title' => in_array( 'title', $supports, true ),
252 'supports_editor' => in_array( 'editor', $supports, true ),
253 'supports_excerpt' => in_array( 'excerpt', $supports, true ),
254 'supports_trackbacks' => in_array( 'trackbacks', $supports, true ),
255 'supports_custom_fields' => in_array( 'custom-fields', $supports, true ),
256 'supports_comments' => in_array( 'comments', $supports, true ),
257 'supports_revisions' => in_array( 'revisions', $supports, true ),
258 'supports_thumbnail' => in_array( 'thumbnail', $supports, true ),
259 'supports_author' => in_array( 'author', $supports, true ),
260 'supports_page_attributes' => in_array( 'page-attributes', $supports, true ),
261 'supports_post_formats' => in_array( 'post-formats', $supports, true ),
262 'supports_custom' => implode( ',', $custom_supports ),
263
264 // Custom labels.
265 'menu_name' => pods_v( 'menu_name', $labels ),
266 'label_all_items' => pods_v( 'all_items', $labels ),
267 'label_add_new' => pods_v( 'add_new', $labels ),
268 'label_add_new_item' => pods_v( 'add_new_item', $labels ),
269 'label_edit_item' => pods_v( 'edit_item', $labels ),
270 'label_new_item' => pods_v( 'new_item', $labels ),
271 'label_view_item' => pods_v( 'view_item', $labels ),
272 'label_view_items' => pods_v( 'view_items', $labels ),
273 'label_search_items' => pods_v( 'search_items', $labels ),
274 'label_not_found' => pods_v( 'not_found', $labels ),
275 'label_not_found_in_trash' => pods_v( 'not_found_in_trash', $labels ),
276 'label_parent' => pods_v( 'parent', $labels ),
277 'label_featured_image' => pods_v( 'featured_image', $labels ),
278 'label_set_featured_image' => pods_v( 'set_featured_image', $labels ),
279 'label_remove_featured_image' => pods_v( 'remove_featured_image', $labels ),
280 'label_use_featured_image' => pods_v( 'use_featured_image', $labels ),
281 'label_archives' => pods_v( 'archives', $labels ),
282 'label_insert_into_item' => pods_v( 'insert_into_item', $labels ),
283 'label_uploaded_to_this_item' => pods_v( 'uploaded_to_this_item', $labels ),
284 'label_filter_items_list' => pods_v( 'filter_items_list', $labels ),
285 'label_items_list_navigation' => pods_v( 'items_list_navigation', $labels ),
286 'label_items_list' => pods_v( 'items_list', $labels ),
287 'label_attributes' => pods_v( 'attributes', $labels ),
288 'label_name_admin_bar' => pods_v( 'name_admin_bar', $labels ),
289 'label_item_published' => pods_v( 'item_published', $labels ),
290 'label_item_published_privately' => pods_v( 'item_published_privately', $labels ),
291 'label_item_reverted_to_draft' => pods_v( 'item_reverted_to_draft', $labels ),
292 'label_item_scheduled' => pods_v( 'item_scheduled', $labels ),
293 'label_item_updated' => pods_v( 'item_updated', $labels ),
294 'label_parent_item_colon' => pods_v( 'parent_item_colon', $labels ),
295
296 // Custom enter title here functionality.
297 'placeholder_enter_title_here' => pods_v( 'enter_title_here', $labels ),
298
299 // Other settings.
300 'public' => (int) pods_v( 'public', $post_type ),
301 'publicly_queryable' => (int) pods_v( 'publicly_queryable', $post_type ),
302 'show_ui' => (int) pods_v( 'show_ui', $post_type ),
303 'show_in_nav_menus' => (int) pods_v( 'show_in_nav_menus', $post_type ),
304 'delete_with_user' => (int) pods_v( 'delete_with_user', $post_type ),
305 'show_in_rest' => (int) pods_v( 'show_in_rest', $post_type ),
306 'rest_base' => pods_v( 'rest_base', $post_type ),
307 'rest_controller_class' => pods_v( 'rest_controller_class', $post_type ), // Not currently used.
308 'rest_namespace' => pods_v( 'rest_namespace', $post_type ),
309 'has_archive' => (int) pods_v( 'has_archive', $post_type ),
310 'has_archive_string' => pods_v( 'has_archive_slug', $post_type ),
311 'exclude_from_search' => (int) pods_v( 'exclude_from_search', $post_type ),
312 'capability_type' => implode( ',', $capability_type ),
313 'hierarchical' => (int) pods_v( 'hierarchical', $post_type ),
314 'can_export' => (int) pods_v( 'can_export', $post_type ),
315 'rewrite' => (int) ( 'no_permalink' !== pods_v( 'permalink_rewrite', pods_v( 'rewrite', $post_type ) ) ),
316 'rewrite_custom_slug' => pods_v( 'slug', pods_v( 'rewrite', $post_type ) ),
317 'rewrite_with_front' => (int) pods_v( 'with_front', pods_v( 'rewrite', $post_type ) ),
318 'query_var' => (int) ( 'none' !== pods_v( 'query_var', $post_type ) ),
319 'query_var_string' => pods_v( 'query_var_name', $post_type ),
320 'menu_position' => pods_v( 'menu_position', $post_type ),
321 'show_in_menu' => (int) pods_v( 'show_in_menu', $post_type ),
322 'menu_location_custom' => pods_v( 'admin_menu_parent', $post_type ),
323 'menu_icon' => pods_v( 'menu_icon', $post_type ),
324 'register_meta_box_cb' => pods_v( 'register_meta_box_cb', $post_type ), // Not currently used.
325
326 'import_source' => 'acf',
327 ];
328
329 // Migrate built-in taxonomies
330 $builtin = $taxonomies;
331
332 foreach ( $builtin as $taxonomy_name ) {
333 $params[ 'built_in_taxonomies_' . $taxonomy_name ] = 1;
334 }
335
336 if ( ! is_object( $this->api ) ) {
337 $this->api = pods_api();
338 }
339
340 $pod = $this->api->load_pod( [ 'name' => pods_clean_name( $params['name'] ) ], false );
341
342 if ( ! empty( $pod ) ) {
343 // translators: %s is the pod name.
344 return pods_error( sprintf( __( 'Pod with the name %s already exists', 'pods' ), pods_clean_name( $params['name'] ) ) );
345 }
346
347 $id = (int) $this->api->save_pod( $params );
348
349 if ( empty( $id ) ) {
350 return false;
351 }
352
353 $pod = $this->api->load_pod( [ 'id' => $id ], false );
354
355 if ( empty( $pod ) ) {
356 return false;
357 }
358
359 if ( $pod['name'] !== $params['name'] ) {
360 $this->api->rename_wp_object_type( $params['type'], $params['name'], $pod['name'] );
361 }
362
363 return $id;
364 }
365
366 /**
367 *
368 *
369 * @since 2.0.0
370 *
371 * @param $taxonomy
372 *
373 * @return bool|int|mixed
374 */
375 private function migrate_taxonomy( $taxonomy ) {
376 $labels = [];
377
378 if ( isset( $taxonomy['labels'] ) && is_array( $taxonomy['labels'] ) ) {
379 $labels = $taxonomy['labels'];
380 }
381
382 $post_types = [];
383
384 if ( isset( $taxonomy['object_type'] ) && is_array( $taxonomy['object_type'] ) ) {
385 $post_types = $taxonomy['object_type'];
386 }
387
388 $default_term_enabled = (int) pods_v( 'default_term_enabled', $taxonomy );
389
390 $params = [
391 'type' => 'taxonomy',
392 'storage' => 'meta',
393 'object' => '',
394 'name' => pods_v( 'taxonomy', $taxonomy ),
395 'label' => pods_v( 'title', $taxonomy ),
396 'label_singular' => pods_v( 'singular_name', $labels ),
397 'description' => pods_v( 'description', $taxonomy ),
398
399 // Custom labels.
400 'label_menu_name' => pods_v( 'menu_name', $labels ),
401 'label_all_items' => pods_v( 'all_items', $labels ),
402 'label_edit_item' => pods_v( 'edit_item', $labels ),
403 'label_view_item' => pods_v( 'view_item', $labels ),
404 'label_update_item' => pods_v( 'update_item', $labels ),
405 'label_add_new_item' => pods_v( 'add_new_item', $labels ),
406 'label_new_item_name' => pods_v( 'new_item_name', $labels ),
407 'label_parent_item' => pods_v( 'parent_item', $labels ),
408 'label_parent_item_colon' => pods_v( 'parent_item_colon', $labels ),
409 'label_search_items' => pods_v( 'search_items', $labels ),
410 'label_popular_items' => pods_v( 'popular_items', $labels ),
411 'label_separate_items_with_commas' => pods_v( 'separate_items_with_commas', $labels ),
412 'label_add_or_remove_items' => pods_v( 'add_or_remove_items', $labels ),
413 'label_choose_from_most_used' => pods_v( 'choose_from_most_used', $labels ),
414 'label_not_found' => pods_v( 'not_found', $labels ),
415 'label_no_terms' => pods_v( 'no_terms', $labels ),
416 'label_items_list_navigation' => pods_v( 'items_list_navigation', $labels ),
417 'label_items_list' => pods_v( 'items_list', $labels ),
418 'label_back_to_items' => pods_v( 'back_to_items', $labels ),
419 'label_parent_field_description' => pods_v( 'parent_field_description', $labels ),
420 'label_slug_field_description' => pods_v( 'slug_field_description', $labels ),
421 'label_desc_field_description' => pods_v( 'desc_field_description', $labels ),
422
423 // Other settings.
424 'public' => (int) pods_v( 'public', $taxonomy, 1 ),
425 'publicly_queryable' => (int) pods_v( 'publicly_queryable', $taxonomy, 1 ),
426 'hierarchical' => (int) pods_v( 'hierarchical', $taxonomy ),
427 'show_ui' => (int) pods_v( 'show_ui', $taxonomy, 1 ),
428 'show_in_menu' => (int) pods_v( 'show_in_menu', $taxonomy, 1 ),
429 'show_in_nav_menus' => (int) pods_v( 'show_in_nav_menus', $taxonomy, 1 ),
430 'rewrite' => (int) ( 'no_permalink' !== pods_v( 'permalink_rewrite', pods_v( 'rewrite', $taxonomy ) ) ),
431 'rewrite_custom_slug' => pods_v( 'slug', pods_v( 'rewrite', $taxonomy ) ),
432 'rewrite_with_front' => (int) pods_v( 'with_front', pods_v( 'rewrite', $taxonomy ) ),
433 'rewrite_hierarchical' => (int) pods_v( 'rewrite_hierarchical', pods_v( 'rewrite', $taxonomy ) ),
434 'query_var' => (int) ( 'none' !== pods_v( 'query_var', $taxonomy ) ),
435 'query_var_string' => pods_v( 'query_var_name', $taxonomy ),
436 'show_admin_column' => (int) pods_v( 'show_admin_column', $taxonomy ),
437 'show_in_rest' => (int) pods_v( 'show_in_rest', $taxonomy ),
438 'show_tagcloud' => (int) pods_v( 'show_tagcloud', $taxonomy ),
439 'sort' => (int) pods_v( 'sort', $taxonomy ),
440 'show_in_quick_edit' => (int) pods_v( 'show_in_quick_edit', $taxonomy ),
441 'rest_base' => pods_v( 'rest_base', $taxonomy ),
442 'rest_controller_class' => pods_v( 'rest_controller_class', $taxonomy ), // Not currently used.
443 'rest_namespace' => pods_v( 'rest_namespace', $taxonomy ),
444 'register_meta_box_cb' => pods_v( 'meta_box_cb', $taxonomy ), // Not currently used.
445 'default_term_name' => 1 === $default_term_enabled ? pods_v( 'default_term_name', $taxonomy ) : null,
446 'default_term_slug' => 1 === $default_term_enabled ? pods_v( 'default_term_slug', $taxonomy ) : null,
447 'default_term_description' => 1 === $default_term_enabled ? pods_v( 'default_term_description', $taxonomy ) : null,
448
449 'import_source' => 'acf',
450 ];
451
452 // Migrate attach-to
453 $attach = $post_types;
454
455 foreach ( $attach as $type_name ) {
456 $params[ 'built_in_post_types_' . $type_name ] = 1;
457 }
458
459 if ( ! is_object( $this->api ) ) {
460 $this->api = pods_api();
461 }
462
463 $pod = $this->api->load_pod( [ 'name' => pods_clean_name( $params['name'] ) ], false );
464
465 if ( ! empty( $pod ) ) {
466 // translators: %s is the pod name.
467 return pods_error( sprintf( __( 'Pod with the name %s already exists', 'pods' ), pods_clean_name( $params['name'] ) ) );
468 }
469
470 $id = (int) $this->api->save_pod( $params );
471
472 if ( empty( $id ) ) {
473 return false;
474 }
475
476 $pod = $this->api->load_pod( [ 'id' => $id ], false );
477
478 if ( empty( $pod ) ) {
479 return false;
480 }
481
482 if ( $pod['name'] != $params['name'] ) {
483 $this->api->rename_wp_object_type( $params['type'], $params['name'], $pod['name'] );
484 }
485
486 return $id;
487 }
488
489 }
490