Skip to content

Instantly share code, notes, and snippets.

@thisislawatts
Last active May 25, 2021 02:54
Show Gist options
  • Save thisislawatts/89f17ab4075638a57657 to your computer and use it in GitHub Desktop.
Save thisislawatts/89f17ab4075638a57657 to your computer and use it in GitHub Desktop.
Force database upgrade
<?php
class acf_update {
/*
* __construct
*
* A good place to add actions / filters
*
* @type functionac
* @date 11/08/13
*
* @param N/A
* @return N/A
*/
function __construct() {
// actions
add_action('admin_menu', array($this,'admin_menu'), 20);
// insert our update info into the update array maintained by WP
add_filter('site_transient_update_plugins', array($this, 'inject_downgrade'));
// ajax
add_action('wp_ajax_acf/admin/data_upgrade', array($this, 'ajax_upgrade'));
add_action('init', array( $this, 'ajax_upgrade'));
}
/*
* ajax_upgrade
*
* description
*
* @type function
* @date 24/10/13
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function ajax_upgrade() {
if ( isset($_GET['page']) && $_GET['page'] === 'acf-upgrade')
// options
$options = acf_parse_args( $_POST, array(
'version' => '5.0.0',
'nonce' => '',
));
// var_dump($options);
// // validate
// if( ! wp_verify_nonce($options['nonce'], 'acf_nonce') ) {
// wp_send_json_error();
// }
// vars
$path = acf_get_path("admin/updates/{$options['version']}.php");
// load version
if( !file_exists( $path ) ) {
wp_send_json_error();
}
// load any errors / feedback from update
ob_start();
// include
include( $path );
// get feedback
$feedback = ob_get_clean();
// update successful
update_option('acf_version', $options['version'] );
// check for relevant updates. If none are found, update this to the plugin version
$updates = acf_get_updates();
if( empty($updates) ) {
update_option('acf_version', acf_get_setting('version'));
}
// return
wp_send_json_success(array(
'feedback' => $feedback
));
}
/*
* admin_menu
*
* description
*
* @type function
* @date 19/02/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function admin_menu() {
// bail early if no show_admin
if( !acf_get_setting('show_admin') ) {
return;
}
// update admin page
$page = add_submenu_page('edit.php?post_type=acf-field-group', __('Upgrade','acf'), __('Upgrade','acf'), 'manage_options','acf-upgrade', array($this,'html') );
// vars
$plugin_version = acf_get_setting('version');
$acf_version = get_option('acf_version');
// bail early if a new install
if( empty($acf_version) ) {
update_option('acf_version', $plugin_version );
return;
}
// bail early if $acf_version is >= $plugin_version
if( version_compare( $acf_version, $plugin_version, '>=') ) {
return;
}
// bail early if no updates available
$updates = acf_get_updates();
if( empty($updates) ) {
update_option('acf_version', $plugin_version );
return;
}
// actions
add_action( 'admin_notices', array( $this, 'admin_notices'), 1 );
/*
// vars
$l10n = array(
'h4' => __('Data Upgrade Required', 'acf'),
'p' => sprintf(__('%s %s requires some updates to the database', 'acf'), acf_get_setting('name'), $plugin_version),
'a' => __( 'Run the updater', 'acf' )
);
// add notice
$message = '
<h4>' . $l10n['h4'] . '</h4>
<p>' . $l10n['p'] . '
<a id="acf-run-the-updater" href="' . admin_url('edit.php?post_type=acf-field-group&page=acf-upgrade') . '" class="acf-button blue">
' . $l10n['a'] . '
</a>
</p>
<script type="text/javascript">
(function($) {
$("#acf-run-the-updater").on("click", function(){
var answer = confirm("'. __( 'It is strongly recommended that you backup your database before proceeding. Are you sure you wish to run the updater now?', 'acf' ) . '");
return answer;
});
})(jQuery);
</script>';
acf_add_admin_notice( $message, 'acf-update-notice', '' );
*/
}
/*
* admin_notices
*
* This function will render any admin notices
*
* @type function
* @date 17/10/13
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function admin_notices() {
// view
$view = array(
'updates' => acf_get_updates(),
'version' => acf_get_setting('version'),
'rollback' => get_option('acf_version'),
'pro' => acf_get_setting('pro'),
'basename' => acf_get_setting('basename'),
'addons' => array()
);
// add-ons
$addons = array(
'acf-flexible-content' => 'Flexible Content Field',
'acf-gallery' => 'Gallery Field',
'acf-options-page' => 'Options Page',
'acf-repeater' => 'Repeater Field',
);
// get active plugins
$plugins = implode(' ', get_option('active_plugins'));
foreach( $addons as $k => $v ) {
if( strpos($plugins, $k) !== false ) {
$view['addons'][] = $v;
}
}
// load view
acf_get_view('update-notice', $view);
}
/*
* html
*
* description
*
* @type function
* @date 19/02/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function html() {
// view
$view = array(
'updates' => acf_get_updates()
);
// load view
acf_get_view('update', $view);
}
/*
* inject_downgrade
*
* description
*
* @type function
* @date 16/01/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function inject_downgrade( $transient ) {
// bail early if no plugins are being checked
if( empty($transient->checked) ) {
return $transient;
}
// bail early if no nonce
if( empty($_GET['_acfrollback']) ) {
return $transient;
}
// vars
$rollback = get_option('acf_version');
// bail early if nonce is not correct
if( !wp_verify_nonce( $_GET['_acfrollback'], 'rollback-acf_' . $rollback ) ) {
return $transient;
}
// create new object for update
$obj = new stdClass();
$obj->slug = $_GET['plugin'];
$obj->new_version = $rollback;
$obj->url = 'https://wordpress.org/plugins/advanced-custom-fields';
$obj->package = 'http://downloads.wordpress.org/plugin/advanced-custom-fields.' . $rollback . '.zip';;
// add to transient
$transient->response[ $_GET['plugin'] ] = $obj;
// return
return $transient;
}
}
new acf_update();
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment