= $plugin_version
if( version_compare( $acf_version, $plugin_version, '>=') ) {
return;
}
// update version
update_option('acf_version', $plugin_version );
// update admin page
add_submenu_page('edit.php?post_type=acf', __('Upgrade','acf'), __('Upgrade','acf'), 'manage_options','acf-upgrade', array($this,'html') );
}
/*
* html
*
* @description:
* @since 3.1.8
* @created: 23/06/12
*/
function html()
{
$version = get_option('acf_version','1.0.5');
$next = false;
// list of starting points
if( $version < '3.0.0' )
{
$next = '3.0.0';
}
elseif( $version < '3.1.8' )
{
$next = '3.1.8';
}
elseif( $version < '3.2.5' )
{
$next = '3.2.5';
}
elseif( $version < '3.3.3' )
{
$next = '3.3.3';
}
elseif( $version < '3.4.1' )
{
$next = '3.4.1';
}
?>
No Upgrade Required
';
}
}
/*
* upgrade_ajax
*
* @description:
* @since 3.1.8
* @created: 23/06/12
*/
function upgrade_ajax()
{
// global
global $wpdb;
// tables
$acf_fields = $wpdb->prefix.'acf_fields';
$acf_values = $wpdb->prefix.'acf_values';
$acf_rules = $wpdb->prefix.'acf_rules';
$wp_postmeta = $wpdb->prefix.'postmeta';
$wp_options = $wpdb->prefix.'options';
// vars
$return = array(
'status' => false,
'message' => "",
'next' => false,
);
// versions
switch($_POST['version'])
{
/*---------------------
*
* 3.0.0
*
*--------------------*/
case '3.0.0':
// upgrade options first as "field_group_layout" will cause get_fields to fail!
// get acf's
$acfs = get_posts(array(
'numberposts' => -1,
'post_type' => 'acf',
'orderby' => 'menu_order title',
'order' => 'asc',
'suppress_filters' => false,
));
if($acfs)
{
foreach($acfs as $acf)
{
// position
update_post_meta($acf->ID, 'position', 'normal');
//layout
$layout = get_post_meta($acf->ID, 'field_group_layout', true) ? get_post_meta($acf->ID, 'field_group_layout', true) : 'in_box';
if($layout == 'in_box')
{
$layout = 'default';
}
else
{
$layout = 'no_box';
}
update_post_meta($acf->ID, 'layout', $layout);
delete_post_meta($acf->ID, 'field_group_layout');
// show_on_page
$show_on_page = get_post_meta($acf->ID, 'show_on_page', true) ? get_post_meta($acf->ID, 'show_on_page', true) : array();
if($show_on_page)
{
$show_on_page = unserialize($show_on_page);
}
update_post_meta($acf->ID, 'show_on_page', $show_on_page);
}
}
$return = array(
'status' => true,
'message' => "Migrating Options...",
'next' => '3.0.0 (step 2)',
);
break;
/*---------------------
*
* 3.0.0
*
*--------------------*/
case '3.0.0 (step 2)':
// get acf's
$acfs = get_posts(array(
'numberposts' => -1,
'post_type' => 'acf',
'orderby' => 'menu_order title',
'order' => 'asc',
'suppress_filters' => false,
));
if($acfs)
{
foreach($acfs as $acf)
{
// allorany doesn't need to change!
$rules = $wpdb->get_results("SELECT * FROM $acf_rules WHERE acf_id = '$acf->ID' ORDER BY order_no ASC", ARRAY_A);
if($rules)
{
foreach($rules as $rule)
{
// options rule has changed
if($rule['param'] == 'options_page')
{
$rule['value'] = 'Options';
}
add_post_meta($acf->ID, 'rule', $rule);
}
}
}
}
$return = array(
'status' => true,
'message' => "Migrating Location Rules...",
'next' => '3.0.0 (step 3)',
);
break;
/*---------------------
*
* 3.0.0
*
*--------------------*/
case '3.0.0 (step 3)':
$message = "Migrating Fields?";
$parent_id = 0;
$fields = $wpdb->get_results("SELECT * FROM $acf_fields WHERE parent_id = $parent_id ORDER BY order_no, name", ARRAY_A);
if($fields)
{
// loop through fields
foreach($fields as $field)
{
// unserialize options
if(@unserialize($field['options']))
{
$field['options'] = unserialize($field['options']);
}
else
{
$field['options'] = array();
}
// sub fields
if($field['type'] == 'repeater')
{
$field['options']['sub_fields'] = array();
$parent_id = $field['id'];
$sub_fields = $wpdb->get_results("SELECT * FROM $acf_fields WHERE parent_id = $parent_id ORDER BY order_no, name", ARRAY_A);
// if fields are empty, this must be a new or broken acf.
if(empty($sub_fields))
{
$field['options']['sub_fields'] = array();
}
else
{
// loop through fields
foreach($sub_fields as $sub_field)
{
// unserialize options
if(@unserialize($sub_field['options']))
{
$sub_field['options'] = @unserialize($sub_field['options']);
}
else
{
$sub_field['options'] = array();
}
// merge options with field
$sub_field = array_merge($sub_field, $sub_field['options']);
unset($sub_field['options']);
// each field has a unique id!
if(!isset($sub_field['key'])) $sub_field['key'] = 'field_' . $sub_field['id'];
$field['options']['sub_fields'][] = $sub_field;
}
}
}
// end if sub field
// merge options with field
$field = array_merge($field, $field['options']);
unset($field['options']);
// each field has a unique id!
if(!isset($field['key'])) $field['key'] = 'field_' . $field['id'];
// update field
$this->parent->update_field( $field['post_id'], $field);
// create field name (field_rand)
//$message .= print_r($field, true) . '
';
}
// end foreach $fields
}
$return = array(
'status' => true,
'message' => $message,
'next' => '3.0.0 (step 4)',
);
break;
/*---------------------
*
* 3.0.0
*
*--------------------*/
case '3.0.0 (step 4)':
$message = "Migrating Values...";
// update normal values
$values = $wpdb->get_results("SELECT v.field_id, m.post_id, m.meta_key, m.meta_value FROM $acf_values v LEFT JOIN $wp_postmeta m ON v.value = m.meta_id WHERE v.sub_field_id = 0", ARRAY_A);
if($values)
{
foreach($values as $value)
{
// options page
if($value['post_id'] == 0) $value['post_id'] = 999999999;
// unserialize value (relationship, multi select, etc)
if(@unserialize($value['meta_value']))
{
$value['meta_value'] = unserialize($value['meta_value']);
}
update_post_meta($value['post_id'], $value['meta_key'], $value['meta_value']);
update_post_meta($value['post_id'], '_' . $value['meta_key'], 'field_' . $value['field_id']);
}
}
// update repeater values
$values = $wpdb->get_results("SELECT v.field_id, v.sub_field_id, v.order_no, m.post_id, m.meta_key, m.meta_value FROM $acf_values v LEFT JOIN $wp_postmeta m ON v.value = m.meta_id WHERE v.sub_field_id != 0", ARRAY_A);
if($values)
{
$rows = array();
foreach($values as $value)
{
// update row count
$row = (int) $value['order_no'] + 1;
// options page
if($value['post_id'] == 0) $value['post_id'] = 999999999;
// unserialize value (relationship, multi select, etc)
if(@unserialize($value['meta_value']))
{
$value['meta_value'] = unserialize($value['meta_value']);
}
// current row
$current_row = isset($rows[$value['post_id']][$value['field_id']]) ? $rows[$value['post_id']][$value['field_id']] : 0;
if($row > $current_row) $rows[$value['post_id']][$value['field_id']] = (int) $row;
// get field name
$field_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM $acf_fields WHERE id = %d", $value['field_id']));
// get sub field name
$sub_field_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM $acf_fields WHERE id = %d", $value['sub_field_id']));
// save new value
$new_meta_key = $field_name . '_' . $value['order_no'] . '_' . $sub_field_name;
update_post_meta($value['post_id'], $new_meta_key , $value['meta_value']);
// save value hidden field id
update_post_meta($value['post_id'], '_' . $new_meta_key, 'field_' . $value['sub_field_id']);
}
foreach($rows as $post_id => $field_ids)
{
foreach($field_ids as $field_id => $row_count)
{
// get sub field name
$field_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM $acf_fields WHERE id = %d", $field_id));
delete_post_meta($post_id, $field_name);
update_post_meta($post_id, $field_name, $row_count);
update_post_meta($post_id, '_' . $field_name, 'field_' . $field_id);
}
}
}
// update version (only upgrade 1 time)
update_option('acf_version','3.0.0');
$return = array(
'status' => true,
'message' => $message,
'next' => '3.1.8',
);
break;
/*---------------------
*
* 3.1.8
*
*--------------------*/
case '3.1.8':
// vars
$message = __("Migrating options values from the $wp_postmeta table to the $wp_options table",'acf') . '...';
// update normal values
$rows = $wpdb->get_results( $wpdb->prepare("SELECT meta_key FROM $wp_postmeta WHERE post_id = %d", 999999999) , ARRAY_A);
if($rows)
{
foreach($rows as $row)
{
// original name
$field_name = $row['meta_key'];
// name
$new_name = "";
if( substr($field_name, 0, 1) == "_" )
{
$new_name = '_options' . $field_name;
}
else
{
$new_name = 'options_' . $field_name;
}
// value
$value = get_post_meta( 999999999, $field_name, true );
// update option
update_option( $new_name, $value );
// deleet old postmeta
delete_post_meta( 999999999, $field_name );
}
// foreach($values as $value)
}
// if($values)
// update version
update_option('acf_version','3.1.8');
$return = array(
'status' => true,
'message' => $message,
'next' => '3.2.5',
);
break;
/*---------------------
*
* 3.1.8
*
*--------------------*/
case '3.2.5':
// vars
$message = __("Modifying field group options 'show on page'",'acf') . '...';
// get acf's
$acfs = get_posts(array(
'numberposts' => -1,
'post_type' => 'acf',
'orderby' => 'menu_order title',
'order' => 'asc',
'suppress_filters' => false,
));
$show_all = array('the_content', 'discussion', 'custom_fields', 'comments', 'slug', 'author');
// populate acfs
if($acfs)
{
foreach($acfs as $acf)
{
$show_on_page = get_post_meta($acf->ID, 'show_on_page', true) ? get_post_meta($acf->ID, 'show_on_page', true) : array();
$hide_on_screen = array_diff($show_all, $show_on_page);
update_post_meta($acf->ID, 'hide_on_screen', $hide_on_screen);
delete_post_meta($acf->ID, 'show_on_page');
}
}
// update version
update_option('acf_version','3.2.5');
$return = array(
'status' => true,
'message' => $message,
'next' => '3.3.3',
);
break;
/*
* 3.3.3
*
* @description: changed field option: taxonomies filter on relationship / post object and page link fields.
* @created: 20/07/12
*/
case '3.3.3':
// vars
$message = __("Modifying field option 'taxonomy'",'acf') . '...';
$wp_term_taxonomy = $wpdb->prefix.'term_taxonomy';
$term_taxonomies = array();
$rows = $wpdb->get_results("SELECT * FROM $wp_term_taxonomy", ARRAY_A);
if($rows)
{
foreach($rows as $row)
{
$term_taxonomies[ $row['term_id'] ] = $row['taxonomy'] . ":" . $row['term_id'];
}
}
// get acf's
$acfs = get_posts(array(
'numberposts' => -1,
'post_type' => 'acf',
'orderby' => 'menu_order title',
'order' => 'asc',
'suppress_filters' => false,
));
// populate acfs
if($acfs)
{
foreach($acfs as $acf)
{
$fields = $this->parent->get_acf_fields($acf->ID);
if( $fields )
{
foreach( $fields as $field )
{
// only edit the option: taxonomy
if( !isset($field['taxonomy']) )
{
continue;
}
if( is_array($field['taxonomy']) )
{
foreach( $field['taxonomy'] as $k => $v )
{
// could be "all"
if( !is_numeric($v) )
{
continue;
}
$field['taxonomy'][ $k ] = $term_taxonomies[ $v ];
}
// foreach( $field['taxonomy'] as $k => $v )
}
// if( $field['taxonomy'] )
$this->parent->update_field( $acf->ID, $field);
}
// foreach( $fields as $field )
}
// if( $fields )
}
// foreach($acfs as $acf)
}
// if($acfs)
// update version
update_option('acf_version','3.3.3');
$return = array(
'status' => true,
'message' => $message,
'next' => '3.4.1',
);
break;
/*
* 3.4.1
*
* @description: Move user custom fields from wp_options to wp_usermeta
* @created: 20/07/12
*/
case '3.4.1':
// vars
$message = __("Moving user custom fields from wp_options to wp_usermeta",'acf') . '...';
$option_row_ids = array();
$option_rows = $wpdb->get_results("SELECT option_id, option_name, option_value FROM $wpdb->options WHERE option_name LIKE 'user%' OR option_name LIKE '\_user%'", ARRAY_A);
if( $option_rows )
{
foreach( $option_rows as $k => $row)
{
preg_match('/user_([0-9]+)_(.*)/', $row['option_name'], $matches);
// if no matches, this is not an acf value, ignore it
if( !$matches )
{
continue;
}
// add to $delete_option_rows
$option_row_ids[] = $row['option_id'];
// meta_key prefix
$meta_key_prefix = "";
if( substr($row['option_name'], 0, 1) == "_" )
{
$meta_key_prefix = '_';
}
// update user meta
update_user_meta( $matches[1], $meta_key_prefix . $matches[2], $row['option_value'] );
}
}
// clear up some memory ( aprox 14 kb )
unset( $option_rows );
// remove $option_row_ids
if( $option_row_ids )
{
$option_row_ids = implode(', ', $option_row_ids);
$wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($option_row_ids)");
}
// update version
update_option('acf_version','3.4.1');
$return = array(
'status' => true,
'message' => $message,
'next' => false,
);
break;
}
// return json
echo json_encode($return);
die;
}
}
new acf_upgrade();
?>