Skip to content

Commit

Permalink
Merge pull request #357 from WordPress/add/subfolder-to-zip
Browse files Browse the repository at this point in the history
Adding files to zip subfolder called as theme slug
  • Loading branch information
matiasbenedetto authored Jun 19, 2023
2 parents 6495f16 + ea0ae97 commit 74f287b
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 24 deletions.
18 changes: 9 additions & 9 deletions admin/class-create-theme.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ function create_sibling_theme( $theme, $screenshot ) {
$zip = Theme_Zip::add_theme_json_to_zip( $zip, 'current' );

// Add readme.txt.
$zip->addFromString(
$zip->addFromStringToTheme(
'readme.txt',
Theme_Readme::build_readme_txt( $theme )
);
Expand All @@ -134,14 +134,14 @@ function create_sibling_theme( $theme, $screenshot ) {
$css_contents = trim( substr( $css_contents, strpos( $css_contents, '*/' ) + 2 ) );
// Add new metadata
$css_contents = Theme_Styles::build_child_style_css( $theme ) . $css_contents;
$zip->addFromString(
$zip->addFromStringToTheme(
'style.css',
$css_contents
);

// Add / replace screenshot.
if ( $this->is_valid_screenshot( $screenshot ) ) {
$zip->addFile(
$zip->addFileToTheme(
$screenshot['tmp_name'],
'screenshot.png'
);
Expand Down Expand Up @@ -191,7 +191,7 @@ function clone_theme( $theme, $screenshot ) {
$zip = Theme_Zip::add_theme_json_to_zip( $zip, 'all' );

// Add readme.txt.
$zip->addFromString(
$zip->addFromStringToTheme(
'readme.txt',
Theme_Readme::build_readme_txt( $theme )
);
Expand All @@ -202,14 +202,14 @@ function clone_theme( $theme, $screenshot ) {
$css_contents = trim( substr( $css_contents, strpos( $css_contents, '*/' ) + 2 ) );
// Add new metadata
$css_contents = Theme_Styles::build_child_style_css( $theme ) . $css_contents;
$zip->addFromString(
$zip->addFromStringToTheme(
'style.css',
$css_contents
);

// Add / replace screenshot.
if ( $this->is_valid_screenshot( $screenshot ) ) {
$zip->addFile(
$zip->addFileToTheme(
$screenshot['tmp_name'],
'screenshot.png'
);
Expand Down Expand Up @@ -255,20 +255,20 @@ function create_child_theme( $theme, $screenshot ) {
$zip = Theme_Zip::add_theme_json_to_zip( $zip, 'user' );

// Add readme.txt.
$zip->addFromString(
$zip->addFromStringToTheme(
'readme.txt',
Theme_Readme::build_readme_txt( $theme )
);

// Add style.css.
$zip->addFromString(
$zip->addFromStringToTheme(
'style.css',
Theme_Styles::build_child_style_css( $theme )
);

// Add / replace screenshot.
if ( $this->is_valid_screenshot( $screenshot ) ) {
$zip->addFile(
$zip->addFileToTheme(
$screenshot['tmp_name'],
'screenshot.png'
);
Expand Down
34 changes: 34 additions & 0 deletions admin/create-theme/cbt-zip-archive.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

if ( class_exists( 'ZipArchive' ) ) {

// This Class extends the ZipArchive class to add the theme slug as a base folder for all the files
class CbtZipArchive extends ZipArchive {

private string $theme_slug;

function __construct( $theme_slug ) {
// If the original theme is in a subfolder the theme slug will be the last part of the path
$complete_slug = explode( DIRECTORY_SEPARATOR, $theme_slug );
$folder = end( $complete_slug );
$this->theme_folder = $folder;
}

function addFromStringToTheme( $name, $content ) {
$name = $this->theme_folder . '/' . $name;
return parent::addFromString( $name, $content );
}

function addFileToTheme( $filepath, $entryname ) {
$entryname = $this->theme_folder . '/' . $entryname;
return parent::addFile( $filepath, $entryname );
}

function addThemeDir( $dirname ) {
$dirname = $this->theme_folder . '/' . $dirname;
return parent::addEmptyDir( $dirname );
}

}

}
30 changes: 18 additions & 12 deletions admin/create-theme/theme-zip.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,27 @@
require_once( __DIR__ . '/theme-blocks.php' );
require_once( __DIR__ . '/theme-templates.php' );
require_once( __DIR__ . '/theme-patterns.php' );
require_once( __DIR__ . '/theme-utils.php' );
require_once( __DIR__ . '/cbt-zip-archive.php' );

class Theme_Zip {

public static function create_zip( $filename ) {
if ( ! class_exists( 'ZipArchive' ) ) {
return new WP_Error( 'Zip Export not supported.' );
}
$zip = new ZipArchive();

$theme_slug = get_stylesheet();
if ( ! empty( $_POST['theme']['name'] ) ) {
$theme_slug = Theme_Utils::get_theme_slug( $_POST['theme']['name'] );
}

$zip = new CbtZipArchive( $theme_slug );
$zip->open( $filename, ZipArchive::CREATE | ZipArchive::OVERWRITE );
return $zip;
}

public static function add_theme_json_to_zip( $zip, $export_type ) {
$zip->addFromString(
$zip->addFromStringToTheme(
'theme.json',
MY_Theme_JSON_Resolver::export_theme_data( $export_type )
);
Expand Down Expand Up @@ -62,7 +68,7 @@ public static function copy_theme_to_zip( $zip, $new_slug, $new_name ) {
$valid_extensions = array( 'php', 'css', 'scss', 'js', 'txt', 'html' );
$valid_extensions_regex = implode( '|', $valid_extensions );
if ( ! preg_match( "/\.({$valid_extensions_regex})$/", $relative_path ) ) {
$zip->addFile( $file_path, $relative_path );
$zip->addFileToTheme( $file_path, $relative_path );
} else {
$contents = file_get_contents( $file_path );

Expand All @@ -72,7 +78,7 @@ public static function copy_theme_to_zip( $zip, $new_slug, $new_name ) {
}

// Add current file to archive
$zip->addFromString( $relative_path, $contents );
$zip->addFromStringToTheme( $relative_path, $contents );
}
}
}
Expand All @@ -94,11 +100,11 @@ public static function add_templates_to_zip( $zip, $export_type, $new_slug ) {
$theme_templates = Theme_Templates::get_theme_templates( $export_type );

if ( $theme_templates->templates ) {
$zip->addEmptyDir( 'templates' );
$zip->addThemeDir( 'templates' );
}

if ( $theme_templates->parts ) {
$zip->addEmptyDir( 'parts' );
$zip->addThemeDir( 'parts' );
}

foreach ( $theme_templates->templates as $template ) {
Expand All @@ -114,7 +120,7 @@ public static function add_templates_to_zip( $zip, $export_type, $new_slug ) {
$template_data->content = Theme_Patterns::create_pattern_link( $pattern_link_attributes );

// Add pattern to zip
$zip->addFromString(
$zip->addFromStringToTheme(
'patterns/' . $template_data->slug . '.php',
$pattern['content']
);
Expand All @@ -124,7 +130,7 @@ public static function add_templates_to_zip( $zip, $export_type, $new_slug ) {
}

// Add template to zip
$zip->addFromString(
$zip->addFromStringToTheme(
'templates/' . $template_data->slug . '.html',
$template_data->content
);
Expand All @@ -144,7 +150,7 @@ public static function add_templates_to_zip( $zip, $export_type, $new_slug ) {
$template_data->content = Theme_Patterns::create_pattern_link( $pattern_link_attributes );

// Add pattern to zip
$zip->addFromString(
$zip->addFromStringToTheme(
'patterns/' . $template_data->slug . '.php',
$pattern['content']
);
Expand All @@ -154,7 +160,7 @@ public static function add_templates_to_zip( $zip, $export_type, $new_slug ) {
}

// Add template to zip
$zip->addFromString(
$zip->addFromStringToTheme(
'parts/' . $template_data->slug . '.html',
$template_data->content
);
Expand All @@ -173,7 +179,7 @@ static function add_media_to_zip( $zip, $media ) {
if ( ! is_wp_error( $download_file ) ) {
$content_array = file( $download_file );
$file_as_string = implode( '', $content_array );
$zip->addFromString( $folder_path . basename( $url ), $file_as_string );
$zip->addFromStringToTheme( $folder_path . basename( $url ), $file_as_string );
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions includes/class-create-block-theme-api.php
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ function rest_export_cloned_theme( $request ) {
$zip = Theme_Zip::add_theme_json_to_zip( $zip, 'all' );

// Add readme.txt.
$zip->addFromString(
$zip->addFromStringToTheme(
'readme.txt',
Theme_Readme::build_readme_txt( $theme )
);
Expand All @@ -273,14 +273,14 @@ function rest_export_cloned_theme( $request ) {
$css_contents = file_get_contents( get_stylesheet_directory() . '/style.css' );
$css_contents = trim( substr( $css_contents, strpos( $css_contents, '*/' ) + 2 ) );
$css_contents = Theme_Styles::build_child_style_css( $theme ) . $css_contents;
$zip->addFromString(
$zip->addFromStringToTheme(
'style.css',
$css_contents
);

// Add / replace screenshot.
if ( $this->is_valid_screenshot( $screenshot ) ) {
$zip->addFile(
$zip->addFileToTheme(
$screenshot['tmp_name'],
'screenshot.png'
);
Expand Down

0 comments on commit 74f287b

Please sign in to comment.