Plugin Directory

Changeset 3428116


Ignore:
Timestamp:
12/27/2025 08:38:15 AM (7 weeks ago)
Author:
badasswp
Message:

Deploy version 1.4.0 for image-converter-webp

Location:
image-converter-webp
Files:
255 added
12 edited

Legend:

Unmodified
Added
Removed
  • image-converter-webp/trunk/composer.json

    r3115201 r3428116  
    2929    "phpstan/phpstan": "^1.10",
    3030    "szepeviktor/phpstan-wordpress": "^1.3",
    31     "phpstan/extension-installer": "^1.3"
     31    "phpstan/extension-installer": "^1.3",
     32    "badasswp/wp-mock-tc": "^1.0"
    3233  },
    3334  "config": {
  • image-converter-webp/trunk/image-converter-webp.php

    r3315100 r3428116  
    44 * Plugin URI:  https://github.com/badasswp/image-converter-webp
    55 * Description: Convert your WordPress JPG/PNG images to WebP formats during runtime.
    6  * Version:     1.3.2
     6 * Version:     1.4.0
    77 * Author:      badasswp
    88 * Author URI:  https://github.com/badasswp
  • image-converter-webp/trunk/inc/Core/Converter.php

    r3125280 r3428116  
    1111namespace ImageConverterWebP\Core;
    1212
     13use WP_Error;
    1314use Exception;
    1415use WebPConvert\WebPConvert;
     
    9091        // Bail out, if source is empty.
    9192        if ( ! file_exists( $this->abs_source ) ) {
    92             return new \WP_Error(
     93            return new WP_Error(
    9394                'webp-img-error',
    9495                sprintf(
     
    103104        $filetype = wp_check_filetype( $this->abs_source );
    104105        if ( false === strpos( (string) $filetype['type'], 'image/' ) ) {
    105             return new \WP_Error(
     106            return new WP_Error(
    106107                'webp-img-error',
    107108                sprintf(
     
    122123            WebPConvert::convert( $this->abs_source, $this->abs_dest, $this->get_options() );
    123124        } catch ( Exception $e ) {
    124             $error_msg = sprintf(
    125                 /* translators: Exception error msg. */
    126                 __( 'Fatal Error: %s', 'image-converter-webp' ),
    127                 $e->getMessage()
     125            $webp = new WP_Error(
     126                'webp-img-error',
     127                sprintf(
     128                    /* translators: Exception error msg. */
     129                    __( 'Fatal Error: %s', 'image-converter-webp' ),
     130                    $e->getMessage()
     131                )
    128132            );
    129             error_log( $error_msg );
    130             $webp = new \WP_Error( 'webp-img-error', $error_msg );
    131133        }
    132134
  • image-converter-webp/trunk/inc/Services/Admin.php

    r3195908 r3428116  
    4242     */
    4343    public function register_options_menu(): void {
    44         add_submenu_page(
    45             'upload.php',
     44        add_menu_page(
    4645            Options::get_page_title(),
    4746            Options::get_page_title(),
     
    4948            Options::get_page_slug(),
    5049            [ $this, 'register_options_page' ],
     50            'dashicons-format-image',
     51            100
    5152        );
    5253    }
     
    137138
    138139        // Bail out, if not plugin Admin page.
    139         if ( ! is_object( $screen ) || 'media_page_image-converter-webp' !== $screen->id ) {
     140        if ( ! is_object( $screen ) || 'toplevel_page_image-converter-webp' !== $screen->id ) {
    140141            return;
    141142        }
  • image-converter-webp/trunk/inc/Services/Main.php

    r3222394 r3428116  
    8181            $this->source = [
    8282                'id'  => (int) $attachment_id,
    83                 'url' => trailingslashit( $img_url_prefix ) . $img['file'],
     83                'url' => trailingslashit( $img_url_prefix ) . ( $img['file'] ?? '' ),
    8484            ];
    8585
     
    143143            // Get absolute path of metadata image.
    144144            $img_url_prefix = substr( $main_image, 0, (int) strrpos( $main_image, '/' ) );
    145             $metadata_image = trailingslashit( $img_url_prefix ) . $img['file'];
    146 
    147             // Ensure image exists before proceeding.
    148             if ( $metadata_image ) {
    149                 // Get WebP version of metadata image.
    150                 $metadata_extension  = '.' . pathinfo( $metadata_image, PATHINFO_EXTENSION );
    151                 $webp_metadata_image = str_replace( $metadata_extension, '.webp', $metadata_image );
    152 
    153                 if ( file_exists( $webp_metadata_image ) ) {
    154                     unlink( $webp_metadata_image );
    155 
    156                     /**
    157                      * Fires after WebP Metadata Image has been deleted.
    158                      *
    159                      * @since 1.0.2
    160                      * @since 1.1.1 Rename hook to use `icfw` prefix.
    161                      *
    162                      * @param string $webp_metadata_image Absolute path to WebP image.
    163                      * @param int    $attachment_id       Image ID.
    164                      *
    165                      * @return void
    166                      */
    167                     do_action( 'icfw_metadata_delete', $webp_metadata_image, $attachment_id );
    168                 }
     145            $metadata_image = trailingslashit( $img_url_prefix ) . ( $img['file'] ?? '' );
     146
     147            // Get WebP version of metadata image.
     148            $metadata_extension  = '.' . pathinfo( $metadata_image, PATHINFO_EXTENSION );
     149            $webp_metadata_image = str_replace( $metadata_extension, '.webp', $metadata_image );
     150
     151            if ( file_exists( $webp_metadata_image ) ) {
     152                unlink( $webp_metadata_image );
     153
     154                /**
     155                 * Fires after WebP Metadata Image has been deleted.
     156                 *
     157                 * @since 1.0.2
     158                 * @since 1.1.1 Rename hook to use `icfw` prefix.
     159                 *
     160                 * @param string $webp_metadata_image Absolute path to WebP image.
     161                 * @param int    $attachment_id       Image ID.
     162                 *
     163                 * @return void
     164                 */
     165                do_action( 'icfw_metadata_delete', $webp_metadata_image, $attachment_id );
    169166            }
    170167        }
     
    226223        }
    227224
     225        // Get WebP image for full variation.
    228226        $metadata['sizes']['full']['url'] = $webp_image;
    229227
    230         return $this->get_webp_metadata( $metadata );
    231     }
    232 
    233     /**
    234      * Get WebP Metadata.
    235      *
    236      * Mutate Meta data array and get the WebP Images
    237      * for all Image meta data.
    238      *
    239      * @since 1.2.0
    240      *
    241      * @param mixed[] $metadata Meta data array.
    242      * @return mixed[]
    243      */
    244     protected function get_webp_metadata( $metadata ): array {
    245         $types = [ 'thumbnail', 'medium', 'large' ];
    246 
    247         foreach ( $types as $type ) {
    248             $metadata['sizes'][ $type ]['url'] = icfw_get_equivalent( $metadata['sizes'][ $type ]['url'] ?? '' );
     228        // Get WebP image for thumbnail variation only.
     229        foreach ( [ 'thumbnail' ] as $type ) {
     230            $url                               = $metadata['sizes'][ $type ]['url'] ?? '';
     231            $metadata['sizes'][ $type ]['url'] = icfw_get_equivalent( $url );
    249232        }
    250233
  • image-converter-webp/trunk/inc/Services/PageLoad.php

    r3125280 r3428116  
    150150        }
    151151
    152         // Get DOM object.
     152        // Ensure this is allowed.
     153        if ( ! icfw_get_settings( 'page_load' ) ) {
     154            return $html;
     155        }
     156
     157        $html = wp_filter_content_tags( $html );
     158
    153159        $dom = new DOMDocument();
    154160        $dom->loadHTML( $html, LIBXML_NOERROR );
     
    157163        foreach ( $dom->getElementsByTagName( 'img' ) as $image ) {
    158164            // For the src image.
    159             $src = $image->getAttribute( 'src' );
    160 
    161             if ( empty( $src ) ) {
    162                 return $html;
     165            $src    = $image->getAttribute( 'src' );
     166            $srcset = $image->getAttribute( 'srcset' );
     167
     168            // Generate the main WebP image for non-webp images.
     169            if ( $src && ( pathinfo( $src, PATHINFO_EXTENSION ) !== 'webp' ) ) {
     170                $html = str_replace( $src, $this->get_webp( $src, $id ), $html );
    163171            }
    164172
    165             // For the srcset images.
    166             $srcset = $image->getAttribute( 'srcset' );
    167 
    168             if ( empty( $srcset ) ) {
    169                 return $html;
     173            // Generate WebP images for srcset variations.
     174            if ( $srcset ) {
     175                $srcset_images = $this->get_all_srcset_images( $srcset );
     176                $srcset_webps  = array_map( fn( $srcset ) => $this->get_webp( $srcset, $id ), $srcset_images );
     177
     178                $html = str_replace( $srcset_images, $srcset_webps, $html );
    170179            }
    171 
    172             preg_match_all( '/http\S+\b/', $srcset, $image_urls );
    173 
    174             foreach ( $image_urls[0] as $img_url ) {
    175                 $html = $this->_get_webp_html( $img_url, $html, $id );
    176             }
    177180        }
    178181
     
    186189     * @since 1.1.0 Moved to PageLoad class.
    187190     *
    188      * @param string $img_url  Relative path to Image - 'https://example.com/wp-content/uploads/2024/01/sample.png'.
    189      * @param string $img_html The Image HTML - '<img src="sample.png"/>'.
     191     * @param string $img_url  Relative path - 'https://example.com/wp-content/uploads/2024/01/sample.png'.
    190192     * @param int    $img_id   Image Attachment ID.
    191193     *
    192194     * @return string
    193195     */
    194     protected function _get_webp_html( $img_url, $img_html, $img_id ): string {
     196    protected function get_webp( $img_url, $img_id ): string {
     197        // Get image ID.
     198        if ( ! $img_id ) {
     199            $img_id = attachment_url_to_postid( $img_url );
     200        }
     201
    195202        // Set Source.
    196203        $this->source = [
     
    199206        ];
    200207
    201         // Ensure this is allowed.
    202         if ( ! icfw_get_settings( 'page_load' ) ) {
    203             return $img_html;
    204         }
    205 
    206208        // Convert image to WebP.
    207209        $webp = $this->converter->convert();
    208210
    209         // Replace image with WebP.
    210         if ( ! is_wp_error( $webp ) && file_exists( $this->converter->abs_dest ) ) {
    211             return str_replace( $this->source['url'], $webp, $img_html );
    212         }
    213 
    214         return $img_html;
     211        // Fail gracefully, return default image.
     212        if ( is_wp_error( $webp ) ) {
     213            return $img_url;
     214        }
     215
     216        return $webp;
     217    }
     218
     219    /**
     220     * Get all srcset images.
     221     *
     222     * @since 1.4.0
     223     *
     224     * @param string $srcset Source set string containing image URLs with size variations.
     225     * @return string[]
     226     */
     227    protected function get_all_srcset_images( $srcset ): array {
     228        preg_match_all( '/https?:\/\/[^\s,]+\.(?:png|jpe?g|webp|gif|svg|avif)/i', $srcset, $matches );
     229
     230        return $matches[0];
    215231    }
    216232}
  • image-converter-webp/trunk/readme.txt

    r3315100 r3428116  
    33Tags: webp, image, convert, jpeg, png.
    44Requires at least: 4.0
    5 Tested up to: 6.8
    6 Stable tag: 1.3.2
     5Tested up to: 6.9
     6Stable tag: 1.4.0
    77Requires PHP: 7.4
    88License: GPLv2 or later
     
    16162. Search for <strong>Image Converter for WebP</strong> plugin from the official WordPress plugin repository.
    17173. Click <strong>Install Now</strong> and then <strong>Activate</strong>.
    18 4. Locate the <strong>Media</strong> menu option on the left side of the WP admin dashboard.
    19 5. You should see the <strong>Image Converter for WebP</strong> menu listed as one of the options, click on it.
     184. Locate the <strong>Image Converter for WebP</strong> menu option on the WP admin dashboard.
     195. Click on it.
    20206. You can now set your plugin options here. Ensure you enable the <strong>Convert Images on Upload</strong> option.
    21217. Now upload any image into your WP website, it would convert it to a WebP format that will be served on your pages when users visit your website.
     
    7070
    7171== Changelog ==
     72
     73= 1.4.0 =
     74* Fix: Resolve issue for Image with no `srcset` attribute.
     75* Fix: Missing thumbnail images in Media Library.
     76* Chore: Improve menu visibility on WP admin dashboard.
     77* Tests: Refactor & Improve PHP unit tests.
     78* Docs: Update README notes.
     79* Update to WP 6.9.
    7280
    7381= 1.3.2 =
  • image-converter-webp/trunk/vendor/autoload.php

    r3315100 r3428116  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInit63b70c2bf9f4141c4fcc4efda921beb5::getLoader();
     22return ComposerAutoloaderInit71b712c468783a5be11a1193faeb18ce::getLoader();
  • image-converter-webp/trunk/vendor/composer/autoload_real.php

    r3107449 r3428116  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit63b70c2bf9f4141c4fcc4efda921beb5
     5class ComposerAutoloaderInit71b712c468783a5be11a1193faeb18ce
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit63b70c2bf9f4141c4fcc4efda921beb5', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInit71b712c468783a5be11a1193faeb18ce', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit63b70c2bf9f4141c4fcc4efda921beb5', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInit71b712c468783a5be11a1193faeb18ce', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInit63b70c2bf9f4141c4fcc4efda921beb5::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInit71b712c468783a5be11a1193faeb18ce::getInitializer($loader));
    3333
    3434        $loader->register(true);
  • image-converter-webp/trunk/vendor/composer/autoload_static.php

    r3115201 r3428116  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInit63b70c2bf9f4141c4fcc4efda921beb5
     7class ComposerStaticInit71b712c468783a5be11a1193faeb18ce
    88{
    99    public static $prefixLengthsPsr4 = array (
    10         'W' => 
     10        'W' =>
    1111        array (
    1212            'WebPConvert\\' => 12,
    1313        ),
    14         'L' => 
     14        'L' =>
    1515        array (
    1616            'LocateBinaries\\' => 15,
    1717        ),
    18         'I' => 
     18        'I' =>
    1919        array (
    2020            'ImageMimeTypeSniffer\\' => 21,
     
    2323            'ImageConverterWebP\\' => 19,
    2424        ),
    25         'F' => 
     25        'F' =>
    2626        array (
    2727            'FileUtil\\' => 9,
    2828        ),
    29         'E' => 
     29        'E' =>
    3030        array (
    3131            'ExecWithFallback\\' => 17,
     
    3434
    3535    public static $prefixDirsPsr4 = array (
    36         'WebPConvert\\' => 
     36        'WebPConvert\\' =>
    3737        array (
    3838            0 => __DIR__ . '/..' . '/rosell-dk/webp-convert/src',
    3939        ),
    40         'LocateBinaries\\' => 
     40        'LocateBinaries\\' =>
    4141        array (
    4242            0 => __DIR__ . '/..' . '/rosell-dk/locate-binaries/src',
    4343        ),
    44         'ImageMimeTypeSniffer\\' => 
     44        'ImageMimeTypeSniffer\\' =>
    4545        array (
    4646            0 => __DIR__ . '/..' . '/rosell-dk/image-mime-type-sniffer/src',
    4747        ),
    48         'ImageMimeTypeGuesser\\' => 
     48        'ImageMimeTypeGuesser\\' =>
    4949        array (
    5050            0 => __DIR__ . '/..' . '/rosell-dk/image-mime-type-guesser/src',
    5151        ),
    52         'ImageConverterWebP\\Tests\\' => 
     52        'ImageConverterWebP\\Tests\\' =>
    5353        array (
    5454            0 => __DIR__ . '/../..' . '/tests',
    5555        ),
    56         'ImageConverterWebP\\' => 
     56        'ImageConverterWebP\\' =>
    5757        array (
    5858            0 => __DIR__ . '/../..' . '/inc',
    5959        ),
    60         'FileUtil\\' => 
     60        'FileUtil\\' =>
    6161        array (
    6262            0 => __DIR__ . '/..' . '/rosell-dk/file-util/src',
    6363        ),
    64         'ExecWithFallback\\' => 
     64        'ExecWithFallback\\' =>
    6565        array (
    6666            0 => __DIR__ . '/..' . '/rosell-dk/exec-with-fallback/src',
     
    7575    {
    7676        return \Closure::bind(function () use ($loader) {
    77             $loader->prefixLengthsPsr4 = ComposerStaticInit63b70c2bf9f4141c4fcc4efda921beb5::$prefixLengthsPsr4;
    78             $loader->prefixDirsPsr4 = ComposerStaticInit63b70c2bf9f4141c4fcc4efda921beb5::$prefixDirsPsr4;
    79             $loader->classMap = ComposerStaticInit63b70c2bf9f4141c4fcc4efda921beb5::$classMap;
     77            $loader->prefixLengthsPsr4 = ComposerStaticInit71b712c468783a5be11a1193faeb18ce::$prefixLengthsPsr4;
     78            $loader->prefixDirsPsr4 = ComposerStaticInit71b712c468783a5be11a1193faeb18ce::$prefixDirsPsr4;
     79            $loader->classMap = ComposerStaticInit71b712c468783a5be11a1193faeb18ce::$classMap;
    8080
    8181        }, null, ClassLoader::class);
  • image-converter-webp/trunk/vendor/composer/installed.php

    r3315100 r3428116  
    44        'pretty_version' => 'dev-master',
    55        'version' => 'dev-master',
    6         'reference' => 'ec38c1190487a3af552fbf4302a26735c7b0c6bf',
     6        'reference' => '723a359577448b264115d1778ebbec70852a5e13',
    77        'type' => 'package',
    88        'install_path' => __DIR__ . '/../../',
     
    1414            'pretty_version' => 'dev-master',
    1515            'version' => 'dev-master',
    16             'reference' => 'ec38c1190487a3af552fbf4302a26735c7b0c6bf',
     16            'reference' => '723a359577448b264115d1778ebbec70852a5e13',
    1717            'type' => 'package',
    1818            'install_path' => __DIR__ . '/../../',
  • image-converter-webp/trunk/vendor/composer/platform_check.php

    r3107449 r3428116  
    2020        }
    2121    }
    22     trigger_error(
    23         'Composer detected issues in your platform: ' . implode(' ', $issues),
    24         E_USER_ERROR
     22    throw new \RuntimeException(
     23        'Composer detected issues in your platform: ' . implode(' ', $issues)
    2524    );
    2625}
Note: See TracChangeset for help on using the changeset viewer.