An error occurred while updating Visual Portfolio Pro: Could not create directory

Table of Contents

Symptom

Updating Pro fails with An error occurred while updating Visual Portfolio Pro: Could not create directory. visual-portfolio-pro/assets.

Cause

Windows servers limit a path to about 250 characters. WordPress builds the name of the temporary download file from the signed download URL, which is long, and the resulting path goes over the limit.

Fix

Add a must-use plugin that shortens the temporary file name for plugin package downloads. Create the file wp-content/mu-plugins/visual-portfolio-pro-windows-compat.php and paste this into it:

<?php
/**
 * Plugin Name: Visual Portfolio Pro Windows Server Compatibility
 * Plugin URI: https://staging.visualportfolio.com/docs/troubleshooting/an-error-occurred-while-updating-visual-portfolio-pro-could-not-create-directory/
 * Description: Resolves an issue on Windows servers that prevents Visual Portfolio Pro from automatically updating.
 */

/**
 * @link https://gist.github.com/spivurno/d7a93ab4920c4fa88bad0e5177b45ba1
 * Easy Digital Downloads provides packages URLs that look something like this:
 * 
 * http://mysite.com/edd-sl/package_download/MTQ4NjA1NTA0NjphMDA5MTkzZjQ0NGRiNmVmMzczY2JhNTFiZWIxMWZiYzo0NzM3MzphM2Q5ZDA3NDQwMjZjZDFmOWVhYTBiNzBjMjVlZjI0YjpodHRwQC8vbXVzaWNmZXN0aXZhbC5zY2hvb2wubno
 * 
 * This generates a temporary filename for the update process that look something like this:
 * 
 * MTQ4NjA1NTA0NjphMDA5MTkzZjQ0NGRiNmVmMzczY2JhNTFiZWIxMWZiYzo0NzM3MzphM2Q5ZDA3NDQwMjZjZDFmOWVhYTBiNzBjMjVlZjI0YjpodHRwQC8vbXVzaWNmZXN0aXZhbC5zY2hvb2wubno.tmp
 *
 * Some Windows servers choke on filenames of this size. As a result, the update wil fail and WordPress
 * will give you a "Could not copy file." error.
 *
 * This solution (which is a little weird) will check if the package URL that is about to be downloaded 
 * by WordPress is an EDD package URL. If so, it will truncate the temporary filename to 50 characters.
 */
 
// initiate a fix for Windows servers where the GP package file name is too long and prevents installs/updates from processing
add_filter( 'upgrader_pre_download', 'mu_gkt_pro_maybe_shorten_edd_filename', 10, 4 );

/**
 * Check if the URL that is about to be downloaded is an EDD package URL. If so, hook our function to shorten
 * the filename.
 *
 * @param mixed  $return
 * @param string $package The URL of the file to be downloaded.
 *
 * @return mixed
 */
function mu_gkt_pro_maybe_shorten_edd_filename( $return, $package ) {
    if( strpos( $package, '/edd-sl/package_download/' ) !== false ) {
        add_filter( 'wp_unique_filename', 'mu_gkt_pro_shorten_edd_filename', 10, 2 );
    }

    return $return;
}

/**
 * Truncate the temporary filename to 50 characters. This resolves issues with some Windows servers which
 * can not handle very long filenames.
 *
 * @param string $filename
 * @param string $ext
 *
 * @return string
 */
function mu_gkt_pro_shorten_edd_filename( $filename, $ext ) {
    $filename = substr( $filename, 0, 50 ) . $ext;
    remove_filter( 'wp_unique_filename', 'mu_gkt_pro_shorten_edd_filename', 10 );

    return $filename;
}

Files in wp-content/mu-plugins/ are active as soon as they exist; there is nothing to activate. Run the update again after saving the file. You can delete the file once the update is done, or keep it: it only affects downloads of this plugin’s package.

Was this page helpful?