Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
SearchWP Windows Update Compatibility
<?php
/**
* Plugin Name: SearchWP Windows Server Compatibility
* Plugin URI: https://searchwp.com/docs/kb/an-error-occurred-while-updating-searchwp-could-not-create-directory/
* Description: Resolves an issue on Windows servers that prevents SearchWP 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', 'musearchwp_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 musearchwp_maybe_shorten_edd_filename( $return, $package ) {
if( strpos( $package, '/edd-sl/package_download/' ) !== false ) {
add_filter( 'wp_unique_filename', 'musearchwp_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 musearchwp_shorten_edd_filename( $filename, $ext ) {
$filename = substr( $filename, 0, 50 ) . $ext;
remove_filter( 'wp_unique_filename', 'musearchwp_shorten_edd_filename', 10 );
return $filename;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.