I have a Wordpress 2.7.x setup that I would like to migrate to the latest version 3.2.1, however I need to make a stepped-upgrade as some plugins need an older version first (3.0.6 IIRC).

However Wordpress is only offering me the latest and greatest version to upgrade to. Is there a way - prefereably within the admin - to update core to a specific version? Or am I bound to manual upgrades?

Is there probably a way to tell the wordpress core upgrader which version to pick? It was downloading a zip only recently, right?

4 Answers 4


You can hook on option_update_core and edit the update url, as a plugin you can do something like this (Remember to disable the plugin after updating wordpress)

function wpse_26750($options){
    global $wp_version;

    //Add Previous updates skipping the ones already passed
    foreach($updates as $version=>$updateUrl){
        if( version_compare($wp_version,$version) < 0){
            $update=new StdClass();
    //Restore latest update
    return $options;

Starting 2.8 you also need to hook on transient_update_core as get_transient is used instead of get_option Also, there is version checking here, so no versions lower than itself is shown. The only (¿major?) issue, is that the list of versions need to added manually.

  • That's interesting. Do you know if there is a hook to offer multiple versions in the backend as a list?
    – hakre
    Sep 25, 2011 at 8:37
  • Not that im aware of, im updating my answer to match multiple version (still using the same hook)
    – hacksy
    Sep 25, 2011 at 23:23
  • That looks very sweet. Thanks a lot Hansy, I'll consider this for some little plugin.
    – hakre
    Sep 26, 2011 at 10:00

@grappler thnx for the solution. Used it to update to a specific version of 5.4.2. Made the version variable for easy integration.

add_filter('pre_site_option_update_core','wpse_26750' );
add_filter('site_transient_update_core','wpse_26750' );
function wpse_26750($updates){
    global $wp_version;

    // New version to update to
    $new_version = "5.4.2";

    // If current version is new_version or higher then stop
    if ( version_compare( $wp_version, $new_version ) >= 0 ) {
        return $updates;

    // Override the update data
    $updates->updates[0]->download = 'https://downloads.wordpress.org/release/wordpress-'.$new_version.'.zip';
    $updates->updates[0]->packages->full = 'https://downloads.wordpress.org/release/wordpress-'.$new_version.'.zip';
    $updates->updates[0]->packages->no_content = 'https://downloads.wordpress.org/release/wordpress-'.$new_version.'-no-content.zip';
    $updates->updates[0]->packages->new_bundled = 'https://downloads.wordpress.org/release/wordpress-'.$new_version.'-new-bundled.zip';
    $updates->updates[0]->current = $new_version;

    return $updates;

I'm not sure of a way to do it through admin but it would be easy to accomplish with svn.

Make a copy or move wp-content and wp-config.php to a temp directory then delete all the WordPress files and check out the 2.8 branch, move wp-content and config back, then run the update script.

mv wordpress/wp-content /tmp/wp-content
mv wordpress/wp-config.php /tmp/wp-config.php
rm -rf wordpress
mkdir wordpress
cd wordpress
svn co http://core.svn.wordpress.org/tags/2.7.x/ .
mv /tmp/wp-content/* wordpress/wp-content/
mv /tmp/wp-config.php wordpress/wp-config.php

//Run upgrade script:  http://yoursite/wordpress/wp-admin/upgrade.php

//Check out the next version
cd wordpress
svn sw http://core.svn.wordpress.org/tags/2.8.x .

//Run upgrade script

//Rinse and repeat
  • Well why I was asking for admin was because it's just a standard hosting webserver, they normally do not have svn available. What I alternatively do is just upload the versions zipfile and extract it over (older versions are available as packages from the wordpress website). I didn't run into problems, config does not get overwritten, only akismet, hello dolly and the default theme.
    – hakre
    Aug 25, 2011 at 7:22

Hansy's solution was not working for me as I was using WP 3.5. I wanted to update to WP 3.7.8. I based my solution on Hansy's with a few changes.

add_filter('pre_site_option_update_core','wpse_26750' );
add_filter('site_transient_update_core','wpse_26750' );
function wpse_26750($updates){
    global $wp_version;
    // If current version is 3.7.8 or higher then stop
    if ( version_compare( $wp_version, '3.7.8' ) >= 0 ) {
        return $updates;
    $updates->updates[0]->download = 'https://downloads.wordpress.org/release/wordpress-3.7.8.zip';
    $updates->updates[0]->packages->full = 'https://downloads.wordpress.org/release/wordpress-3.7.8.zip';
    $updates->updates[0]->packages->no_content = 'https://downloads.wordpress.org/release/wordpress-3.7.8-no-content.zip';
    $updates->updates[0]->packages->new_bundled = 'https://downloads.wordpress.org/release/wordpress-3.7.8-new-bundled.zip';
    $updates->updates[0]->current = '3.7.8';

    return $updates;

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.