From 306a99a7071d97e1e22a94d47abef8430fcdb5dd Mon Sep 17 00:00:00 2001 From: Brian DiChiara Date: Tue, 18 Nov 2025 13:34:25 -0600 Subject: [PATCH] [N/A] Better import db support during setup --- .../ProjectEvents/PostInstallScript.php | 100 +++++++++++++++++- .../ProjectEvents/PreScripts.php | 1 + 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/bin/composer-scripts/ProjectEvents/PostInstallScript.php b/bin/composer-scripts/ProjectEvents/PostInstallScript.php index 66576009..3937dc81 100644 --- a/bin/composer-scripts/ProjectEvents/PostInstallScript.php +++ b/bin/composer-scripts/ProjectEvents/PostInstallScript.php @@ -482,7 +482,8 @@ private static function isWordPressDbInstalled(): bool { * @return void */ private static function importDatabase(): void { - $databaseFile = self::ask( 'Please specify the path to the database file' ); + $defaultDatabaseFile = self::locateDatabaseFile(); + $databaseFile = self::ask( 'Please specify the path to the database file', $defaultDatabaseFile ); if ( ! $databaseFile ) { self::writeError( 'No database file provided.' ); @@ -506,6 +507,103 @@ private static function importDatabase(): void { self::runCommand( $cmd ); self::writeInfo( 'Database imported.' ); + + // Get the site URL with `wp option get siteurl` + $defaultSiteUrl = shell_exec( 'wp option get siteurl' ); + if ( ! $defaultSiteUrl ) { + $defaultSiteUrl = '//'; + } else { + $defaultSiteUrl = strtolower( $defaultSiteUrl ); + $defaultSiteUrl = str_replace( 'https://', '//', $defaultSiteUrl ); + $defaultSiteUrl = str_replace( 'http://', '//', $defaultSiteUrl ); + $defaultSiteUrl = trim( $defaultSiteUrl ); + } + + $localUrl = strtolower( self::$info['url'] ); + $localUrl = str_replace( 'https://', '//', $localUrl ); + $localUrl = str_replace( 'http://', '//', $localUrl ); + $localUrl = trim( $localUrl ); + + if ( $defaultSiteUrl === $localUrl ) { + return; + } + + $siteUrl = self::ask( 'Please specify the URL in the database file to perform the search-replace on', $defaultSiteUrl ); + + $siteUrl = trim( strtolower( $siteUrl ) ); + + if ( ! $siteUrl ) { + self::writeError( 'No site URL provided. Skipping search-replace.' ); + return; + } + + self::writeInfo( 'Updating the database URLs...' ); + + // Run `wp search-replace` to replace the site URL. + $cmd = sprintf( + 'wp search-replace %s %s', + escapeshellarg( $siteUrl ), + escapeshellarg( $localUrl ) + ); + + self::runCommand( $cmd ); + + self::writeInfo( 'Database URLs updated.' ); + } + + /** + * Locate the database file. + * + * @return string + */ + private static function locateDatabaseFile(): string { + $patterns = [ + '*.sql', + '*.sql.gz', + '*.sql.bz2', + '*.sql.zip', + '*.sql.tar', + '*.sql.tar.gz', + '*.sql.tar.bz2', + '*.sql.7z', + '*.sql.xz', + 'wp-content/*.sql', + 'wp-content/*.sql.gz', + 'wp-content/*.sql.bz2', + 'wp-content/*.sql.zip', + 'wp-content/*.sql.tar', + 'wp-content/*.sql.tar.gz', + 'wp-content/*.sql.tar.bz2', + 'wp-content/*.sql.7z', + 'wp-content/*.sql.xz', + ]; + + $files = []; + foreach ( $patterns as $pattern ) { + $globResult = glob( self::translatePath( $pattern ) ); + if ( $globResult !== false && ! empty( $globResult ) ) { + $files = array_merge( $files, $globResult ); + } + } + + if ( empty( $files ) ) { + return ''; + } + + usort( $files, function( $a, $b ) { + $mtimeA = filemtime( $a ); + $mtimeB = filemtime( $b ); + + // First sort by modification time (descending - most recent first) + if ( $mtimeA !== $mtimeB ) { + return $mtimeB <=> $mtimeA; + } + + // If same modification time, sort by filename descending + return strcmp( $b, $a ); + } ); + + return $files[0]; } /** diff --git a/bin/composer-scripts/ProjectEvents/PreScripts.php b/bin/composer-scripts/ProjectEvents/PreScripts.php index cf570ae5..035f6a83 100644 --- a/bin/composer-scripts/ProjectEvents/PreScripts.php +++ b/bin/composer-scripts/ProjectEvents/PreScripts.php @@ -20,6 +20,7 @@ class PreScripts extends ComposerScript { 'viget/viget-blocks-toolkit' => 'viget-blocks-toolkit', 'viget/viget-form-blocks' => 'viget-form-blocks', 'viget/viget-parts-kit' => 'viget-parts-kit', + 'viget/wp-sonny' => 'wp-sonny', ]; /**