/wp-content/plugins/advanced-custom-fields-pro/admin/updates/5.0.0.php

https://gitlab.com/sihabudinahmad/asppi · PHP · 325 lines · 113 code · 129 blank · 83 comment · 19 complexity · 56b2c916a8148cddab5e234e73bba1a6 MD5 · raw file

  1. <?php
  2. /*
  3. * Upgrade to version 5.0.0
  4. *
  5. * @type upgrade
  6. * @date 20/02/2014
  7. * @since 5.0.0
  8. *
  9. * @param n/a
  10. * @return n/a
  11. */
  12. // Exit if accessed directly
  13. if( !defined('ABSPATH') ) exit;
  14. // global
  15. global $wpdb;
  16. // migrate field groups
  17. $ofgs = get_posts(array(
  18. 'numberposts' => -1,
  19. 'post_type' => 'acf',
  20. 'orderby' => 'menu_order title',
  21. 'order' => 'asc',
  22. 'suppress_filters' => true,
  23. ));
  24. // populate acfs
  25. if( $ofgs ){ foreach( $ofgs as $ofg ){
  26. // migrate field group
  27. $nfg = _migrate_field_group_500( $ofg );
  28. // get field from postmeta
  29. $rows = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->postmeta WHERE post_id = %d AND meta_key LIKE %s", $ofg->ID, 'field_%'), ARRAY_A);
  30. if( $rows )
  31. {
  32. $nfg['fields'] = array();
  33. foreach( $rows as $row )
  34. {
  35. $field = $row['meta_value'];
  36. $field = maybe_unserialize( $field );
  37. $field = maybe_unserialize( $field ); // run again for WPML
  38. // add parent
  39. $field['parent'] = $nfg['ID'];
  40. // migrate field
  41. $field = _migrate_field_500( $field );
  42. }
  43. }
  44. }}
  45. /*
  46. * _migrate_field_group_500
  47. *
  48. * description
  49. *
  50. * @type function
  51. * @date 20/02/2014
  52. * @since 5.0.0
  53. *
  54. * @param $post_id (int)
  55. * @return $post_id (int)
  56. */
  57. function _migrate_field_group_500( $ofg ) {
  58. // global
  59. global $wpdb;
  60. // get post status
  61. $post_status = $ofg->post_status;
  62. // create new field group
  63. $nfg = array(
  64. 'ID' => 0,
  65. 'title' => $ofg->post_title,
  66. 'menu_order' => $ofg->menu_order,
  67. );
  68. // location rules
  69. $groups = array();
  70. // get all rules
  71. $rules = get_post_meta($ofg->ID, 'rule', false);
  72. if( is_array($rules) ) {
  73. $group_no = 0;
  74. foreach( $rules as $rule ) {
  75. // if field group was duplicated, it may now be a serialized string!
  76. $rule = maybe_unserialize($rule);
  77. // does this rule have a group?
  78. // + groups were added in 4.0.4
  79. if( !isset($rule['group_no']) ) {
  80. $rule['group_no'] = $group_no;
  81. // sperate groups?
  82. if( get_post_meta($ofg->ID, 'allorany', true) == 'any' ) {
  83. $group_no++;
  84. }
  85. }
  86. // extract vars
  87. $group = acf_extract_var( $rule, 'group_no' );
  88. $order = acf_extract_var( $rule, 'order_no' );
  89. // add to group
  90. $groups[ $group ][ $order ] = $rule;
  91. // sort rules
  92. ksort( $groups[ $group ] );
  93. }
  94. // sort groups
  95. ksort( $groups );
  96. }
  97. $nfg['location'] = $groups;
  98. // settings
  99. if( $position = get_post_meta($ofg->ID, 'position', true) ) {
  100. $nfg['position'] = $position;
  101. }
  102. if( $layout = get_post_meta($ofg->ID, 'layout', true) ) {
  103. $nfg['layout'] = $layout;
  104. }
  105. if( $hide_on_screen = get_post_meta($ofg->ID, 'hide_on_screen', true) ) {
  106. $nfg['hide_on_screen'] = maybe_unserialize($hide_on_screen);
  107. }
  108. // Note: acf_update_field_group will call the acf_get_valid_field_group function and apply 'compatibility' changes
  109. // add old ID reference
  110. $nfg['old_ID'] = $ofg->ID;
  111. // save field group
  112. $nfg = acf_update_field_group( $nfg );
  113. // trash?
  114. if( $post_status == 'trash' ) {
  115. acf_trash_field_group( $nfg['ID'] );
  116. }
  117. // return
  118. return $nfg;
  119. }
  120. /*
  121. * _migrate_field_500
  122. *
  123. * description
  124. *
  125. * @type function
  126. * @date 20/02/2014
  127. * @since 5.0.0
  128. *
  129. * @param $post_id (int)
  130. * @return $post_id (int)
  131. */
  132. function _migrate_field_500( $field ) {
  133. // orig
  134. $orig = $field;
  135. // order_no is now menu_order
  136. $field['menu_order'] = acf_extract_var( $field, 'order_no' );
  137. // correct very old field keys
  138. if( substr($field['key'], 0, 6) !== 'field_' ) {
  139. $field['key'] = 'field_' . str_replace('field', '', $field['key']);
  140. }
  141. // get valid field
  142. $field = acf_get_valid_field( $field );
  143. // save field
  144. $field = acf_update_field( $field );
  145. // sub fields
  146. if( $field['type'] == 'repeater' ) {
  147. // get sub fields
  148. $sub_fields = acf_extract_var( $orig, 'sub_fields' );
  149. // save sub fields
  150. if( !empty($sub_fields) ) {
  151. $keys = array_keys($sub_fields);
  152. foreach( $keys as $key ) {
  153. $sub_field = acf_extract_var($sub_fields, $key);
  154. $sub_field['parent'] = $field['ID'];
  155. _migrate_field_500( $sub_field );
  156. }
  157. }
  158. } elseif( $field['type'] == 'flexible_content' ) {
  159. // get layouts
  160. $layouts = acf_extract_var( $orig, 'layouts' );
  161. // update layouts
  162. $field['layouts'] = array();
  163. // save sub fields
  164. if( !empty($layouts) ) {
  165. foreach( $layouts as $layout ) {
  166. // vars
  167. $layout_key = uniqid();
  168. // append layotu key
  169. $layout['key'] = $layout_key;
  170. // extract sub fields
  171. $sub_fields = acf_extract_var($layout, 'sub_fields');
  172. // save sub fields
  173. if( !empty($sub_fields) ) {
  174. $keys = array_keys($sub_fields);
  175. foreach( $keys as $key ) {
  176. $sub_field = acf_extract_var($sub_fields, $key);
  177. $sub_field['parent'] = $field['ID'];
  178. $sub_field['parent_layout'] = $layout_key;
  179. _migrate_field_500( $sub_field );
  180. }
  181. // foreach
  182. }
  183. // if
  184. // append layout
  185. $field['layouts'][] = $layout;
  186. }
  187. // foreach
  188. }
  189. // if
  190. // save field again with less sub field data
  191. $field = acf_update_field( $field );
  192. }
  193. // return
  194. return $field;
  195. }
  196. ?>