Skip to content
Open
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4680f5c
release: 3.6.10
Sreini Feb 16, 2026
e154eb9
Merge branch 'master' of https://github.com/tinify/wordpress-plugin
tijmenbruggeman Feb 16, 2026
f53f00b
Merge branch 'tinify:master' into master
tijmenbruggeman Feb 17, 2026
ba97e04
Merge branch 'master' of https://github.com/tinify/wordpress-plugin
tijmenbruggeman Mar 6, 2026
3933d3c
Merge branch 'master' of https://github.com/tinify/wordpress-plugin
tijmenbruggeman Mar 17, 2026
c91a855
Merge branch 'master' of https://github.com/tinify/wordpress-plugin
tijmenbruggeman Mar 18, 2026
7ea5ea3
add checkbox for backup
tijmenbruggeman Mar 18, 2026
2446827
seperate backup settings from preserve
tijmenbruggeman Mar 18, 2026
24c7c0a
seperate settings
tijmenbruggeman Mar 18, 2026
435823c
create backup of original image
tijmenbruggeman Mar 18, 2026
a522659
add docs for tests
tijmenbruggeman Mar 18, 2026
6882d97
add docs for stubs
tijmenbruggeman Mar 18, 2026
9c5b056
add test
tijmenbruggeman Mar 18, 2026
b765371
Add more tests
tijmenbruggeman Mar 18, 2026
1d86da6
ensure trailing slash on dir
tijmenbruggeman Mar 18, 2026
43991bf
format
tijmenbruggeman Mar 19, 2026
3a863f7
fix test: also has backup registered
tijmenbruggeman Mar 25, 2026
fd2bdc8
wait for healthcheck to resolve in docker compose
tijmenbruggeman Mar 25, 2026
295b1dc
Merge branch 'master' of https://github.com/tinify/wordpress-plugin
tijmenbruggeman Apr 7, 2026
45e082e
Merge branch 'master' of github.com:wcreateweb/wordpress-plugin into …
tijmenbruggeman Apr 7, 2026
2dc0ccd
use action to create filter
tijmenbruggeman Apr 7, 2026
8e11b25
change hook params and only trigger once per image.
tijmenbruggeman Apr 9, 2026
c0826fd
change docblocks
tijmenbruggeman Apr 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bin/run-mocks
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

port="$1"

docker compose -f config/mocks.docker-compose.yml up -d
docker compose -f config/mocks.docker-compose.yml up -d --wait

mv src/vendor/tinify/Tinify/Client.php src/vendor/tinify/Tinify/Client.php.bak
cp test/fixtures/Client.php src/vendor/tinify/Tinify/Client.php
Expand Down
2 changes: 1 addition & 1 deletion src/class-tiny-compress.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public function get_status() {
/**
* Compresses a single file
*
* @param [type] $file
* @param string $file path to file
* @param array $resize_opts
* @param array $preserve_opts
* @param array{ string } conversion options
Expand Down
41 changes: 39 additions & 2 deletions src/class-tiny-image.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,9 @@ public function compress() {
if ( ! $size->is_duplicate() ) {
$size->add_tiny_meta_start();
$this->update_tiny_post_meta();
$resize = $this->settings->get_resize_options( $size_name );
$preserve = $this->settings->get_preserve_options( $size_name );
$backup_created = $this->create_backup( $size_name, $size->filename );
Comment thread
tijmenbruggeman marked this conversation as resolved.
Outdated
$resize = $this->settings->get_resize_options( $size_name );
$preserve = $this->settings->get_preserve_options( $size_name );
Tiny_Logger::debug(
'compress size',
array(
Expand All @@ -238,6 +239,7 @@ public function compress() {
'has_been_compressed' => $size->has_been_compressed(),
'filesize' => $size->filesize(),
'mimetype' => $size->mimetype(),
'backup' => $backup_created,
)
);
try {
Expand Down Expand Up @@ -605,4 +607,39 @@ public function mark_as_compressed() {

$this->update_tiny_post_meta();
}

/**
* creates a backup of the image as <originalfile>.bak.<extension>
Comment thread
tijmenbruggeman marked this conversation as resolved.
Outdated
*
* @param string $size_name name of the size
* @param string $filepath path to file that needs backup
* @return bool true when backup is created
*/
private function create_backup( $size_name, $filepath ) {
if ( ! $this->needs_backup( $size_name ) ) {
return false;
}

$fileinfo = pathinfo( $filepath );
$backup_file = sprintf(
'%s%s.bak.%s',
trailingslashit( $fileinfo['dirname'] ),
$fileinfo['filename'],
$fileinfo['extension']
);

Comment thread
tijmenbruggeman marked this conversation as resolved.
Outdated
return copy( $filepath, $backup_file );
}

/**
* @param string $size_name name of the size
* @return bool true when backup needs to be created
*/
private function needs_backup( $size_name ) {
if ( ! self::is_original( $size_name ) ) {
return false;
}

return $this->settings->get_backup_enabled();
}
}
19 changes: 19 additions & 0 deletions src/class-tiny-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,9 @@ public function admin_init() {
$field = self::get_prefixed_name( 'resize_original' );
register_setting( 'tinify', $field );

$field = self::get_prefixed_name( 'backup' );
register_setting( 'tinify', $field );

$field = self::get_prefixed_name( 'preserve_data' );
register_setting( 'tinify', $field );

Expand Down Expand Up @@ -305,6 +308,16 @@ public function new_plugin_install() {
return ! $compression_timing;
}

public function get_backup_enabled() {
$sizes = $this->get_sizes();
if ( ! $sizes[ Tiny_Image::ORIGINAL ]['tinify'] ) {
return false;
}

$setting = get_option( self::get_prefixed_name( 'backup' ) );
return isset( $setting['enabled'] ) && 'on' === $setting['enabled'];
}

public function get_resize_enabled() {
/* This only applies if the original is being resized. */
$sizes = $this->get_sizes();
Expand Down Expand Up @@ -343,6 +356,12 @@ public function get_preserve_enabled( $name ) {
return isset( $setting[ $name ] ) && 'on' === $setting[ $name ];
}

/**
* Retrieves the preserve options for the original image
*
* @param string - size name
* @return false|array<string> false if size is not original, otherwise array of preserved keys
Comment thread
tijmenbruggeman marked this conversation as resolved.
Outdated
*/
public function get_preserve_options( $size_name ) {
if ( ! Tiny_Image::is_original( $size_name ) ) {
return false;
Expand Down
22 changes: 22 additions & 0 deletions src/views/settings-original-image.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,28 @@
</div>
</div>

<p class="tiny-preserve">
<?php
$backup_enabled_id = self::get_prefixed_name( 'backup' );
$backup_enabled_name = self::get_prefixed_name( 'backup[enabled]' );
$backup_enabled = $this->get_backup_enabled();
?>
<input
type="checkbox"
id="<?php echo esc_attr( $backup_enabled_id ); ?>"
name="<?php echo esc_attr( $backup_enabled_name ); ?>"
value="on"
<?php checked( $backup_enabled ); ?> />
<label for="<?php echo esc_attr( $backup_enabled_id ); ?>">
<?php
esc_html_e(
'Create a backup of the uncompressed image',
'tiny-compress-images'
);
?>
</label>
</p>

<?php
$this->render_preserve_input(
'creation',
Expand Down
15 changes: 15 additions & 0 deletions test/helpers/wordpress.php
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,14 @@ public function createImage($file_size, $path, $name)
->at($dir);
}

/**
* Creates images on the virtual disk for testing
* @param null|array $sizes Array of size => bytes to create, file will be named $name-$size.png
Comment thread
tijmenbruggeman marked this conversation as resolved.
Outdated
* @param int $original_size Bytes of image
* @param string $path Path to image
* @param string $name Name of the image
* @return void
*/
public function createImages($sizes = null, $original_size = 12345, $path = '14/01', $name = 'test')
{
vfsStream::newDirectory(self::UPLOAD_DIR . "/$path")->at($this->vfs);
Expand Down Expand Up @@ -309,6 +317,13 @@ public function createImagesFromJSON($virtual_images)
}
}

/**
* creates image meta data for testing
*
* @param string $path directory of the file in UPLOAD_DIR
* @param string $name name of the file without extension
* @return array object containing metadata
Comment thread
tijmenbruggeman marked this conversation as resolved.
Outdated
*/
public function getTestMetadata($path = '14/01', $name = 'test')
{
$metadata = array(
Expand Down
90 changes: 90 additions & 0 deletions test/unit/TinyImageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -306,4 +306,94 @@ public function test_conversion_same_mimetype()
// second call should be only with image/webp because first call was a image/webp
$this->assertEquals(array('image/webp'), $compress_calls[1]['convert_to']);
}

public function test_creates_backup_of_original_image() {
$this->wp->addOption('tinypng_backup', array(
'enabled' => 'on',
));
$this->wp->addOption('tinypng_sizes', array(
Tiny_Image::ORIGINAL => 'on',
));
$this->wp->stub('get_post_mime_type', function () {
return 'image/png';
});

$input_dir = '26/03';
$input_name = 'testforbackup';
$this->wp->createImages(array(), 1000, $input_dir, $input_name);

$settings = new Tiny_Settings();
$mock_compressor = $this->createMock(Tiny_Compress::class);
$settings->set_compressor($mock_compressor);

$metadata = $this->wp->getTestMetadata($input_dir, $input_name);
Comment thread
tijmenbruggeman marked this conversation as resolved.
Outdated
$tinyimg = new Tiny_Image($settings, 999, $metadata);
$tinyimg->compress();

$this->assertTrue(
file_exists( $this->vfs->url() . '/wp-content/uploads/' . $input_dir . '/' . $input_name . '.bak.png' ) ,
'backup of file should be created');
}

public function test_will_not_backup_other_sizes() {
$this->wp->addOption('tinypng_backup', array(
'enabled' => 'on',
));
$this->wp->addOption('tinypng_sizes', array(
'thumbnail' => 'on',
));
$this->wp->stub('get_post_mime_type', function () {
return 'image/png';
});

$input_dir = '26/03';
$input_name = 'testforbackup';
$this->wp->createImages(array(
'thumbnail' => 1000,
), 1000, $input_dir, $input_name);

$settings = new Tiny_Settings();
$mock_compressor = $this->createMock(Tiny_Compress::class);
$settings->set_compressor($mock_compressor);

$metadata = $this->wp->getTestMetadata($input_dir, $input_name);
Comment thread
tijmenbruggeman marked this conversation as resolved.
Outdated
$tinyimg = new Tiny_Image($settings, 999, $metadata);
$tinyimg->compress();

$this->assertFalse(
file_exists( $this->vfs->url() . '/wp-content/uploads/' . $input_dir . '/' . $input_name . '.bak.png' ) ,
'backup of original should not exist');

$this->assertFalse(
file_exists( $this->vfs->url() . '/wp-content/uploads/' . $input_dir . '/' . $input_name . '-thumbnail.bak.png' ) ,
'backup of thumbnail should not exist');
}

public function test_will_not_backup_when_disabled() {
$this->wp->addOption('tinypng_backup', array(
'enabled' => false,
));
$this->wp->addOption('tinypng_sizes', array(
Tiny_Image::ORIGINAL => 'on',
));
$this->wp->stub('get_post_mime_type', function () {
return 'image/png';
});

$input_dir = '26/03';
$input_name = 'testforbackup';
$this->wp->createImages(array(), 1000, $input_dir, $input_name);

$settings = new Tiny_Settings();
$mock_compressor = $this->createMock(Tiny_Compress::class);
$settings->set_compressor($mock_compressor);

$metadata = $this->wp->getTestMetadata($input_dir, $input_name);
$tinyimg = new Tiny_Image($settings, 999, $metadata);
Comment thread
tijmenbruggeman marked this conversation as resolved.
Outdated
$tinyimg->compress();

$this->assertFalse(
file_exists( $this->vfs->url() . '/wp-content/uploads/' . $input_dir . '/' . $input_name . '.bak.png' ) ,
'backup of original should not exist');
}
}
1 change: 1 addition & 0 deletions test/unit/TinySettingsAdminTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public function test_admin_init_should_register_keys() {
array( 'tinify', 'tinypng_compression_timing' ),
array( 'tinify', 'tinypng_sizes' ),
array( 'tinify', 'tinypng_resize_original' ),
array( 'tinify', 'tinypng_backup' ),
array( 'tinify', 'tinypng_preserve_data' ),
array( 'tinify', 'tinypng_convert_format' ),
array( 'tinify', 'tinypng_logging_enabled' ),
Expand Down
5 changes: 5 additions & 0 deletions test/unit/TinyTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ public static function client_supported() {
}

abstract class Tiny_TestCase extends TestCase {
/**
* WordPress stubs
*
* @var \WordPressStubs
*/
protected $wp;
protected $vfs;

Expand Down
Loading