77% updraftplus

Code Review | UpdraftPlus: WordPress Backup & Migration Plugin

WordPress plugin UpdraftPlus: WordPress Backup & Migration Plugin scored77%from 54 tests.

About plugin

  • Plugin page: updraftplus
  • Plugin version: 1.23.13
  • PHP version: 7.4.16
  • WordPress compatibility: 3.2-6.4
  • WordPress version: 6.3.1
  • First release: May 22, 2012
  • Latest release: Nov 23, 2023
  • Number of updates: 1,777
  • Update frequency: every 2.4 days
  • Top authors: DavidAnderson (100%)

Code review

54 tests

User reviews

7292 reviews

Install metrics

3,000,000+ active /110,368,374 total downloads

Benchmarks

Plugin footprint 82% from 16 tests

Installer Passed 1 test

🔺 Critical test (weight: 50) | Checking the installer triggered no errors
Install script ran successfully

Server metrics [RAM: ▲3.70MB] [CPU: ▲21.17ms] Passed 4 tests

This is a short check of server-side resources used by UpdraftPlus: WordPress Backup & Migration Plugin
No issues were detected with server-side resource usage
Page Memory (MB) CPU Time (ms)
Home / 5.70 ▲2.24 58.98 ▲19.48
Dashboard /wp-admin 7.79 ▲4.48 81.34 ▲33.30
Posts /wp-admin/edit.php 7.79 ▲4.43 65.87 ▲19.70
Add New Post /wp-admin/post-new.php 9.53 ▲3.65 105.23 ▲12.21
Media Library /wp-admin/upload.php 7.79 ▲4.56 69.07 ▲37.92
UpdraftPlus Backups /wp-admin/options-general.php?page=updraftplus 9.87 157.68

Server storage [IO: ▲24.38MB] [DB: ▲0.11MB] 67% from 3 tests

Filesystem and database footprint
Please try to fix the following items
  • There were 3 files (0.24KB) illegally modified outside of "wp-content/plugins/updraftplus/" and "wp-content/uploads/"
    • (new file) wp-content/updraft/web.config
    • (new file) wp-content/updraft/index.html
    • (new file) wp-content/updraft/.htaccess
Filesystem: 1,215 new files
Database: no new tables, 24 new options
New WordPress options
updraft_s3generic
updraft_openstack
widget_theysaidso_widget
updraft_ftp
updraft_sftp
widget_recent-posts
theysaidso_admin_options
updraft_googlecloud
updraft_updraftvault
updraft_dropbox
...

Browser metrics Passed 4 tests

This is an overview of browser requirements for UpdraftPlus: WordPress Backup & Migration Plugin
Minimal impact on browser resources
Page Nodes Memory (MB) Script (ms) Layout (ms)
Home / 2,875 ▲113 14.68 ▲0.40 1.74 ▼0.07 42.11 ▼4.10
Dashboard /wp-admin 2,277 ▲100 5.57 ▲0.03 95.87 ▼3.99 42.70 ▼1.70
Posts /wp-admin/edit.php 2,136 ▲36 2.00 ▼0.03 37.94 ▼2.36 32.27 ▼5.28
Add New Post /wp-admin/post-new.php 1,555 ▲20 23.23 ▲4.91 682.68 ▲70.25 71.09 ▲2.58
Media Library /wp-admin/upload.php 1,436 ▲39 4.23 ▲0.05 105.26 ▲2.86 46.38 ▲1.68
UpdraftPlus Backups /wp-admin/options-general.php?page=updraftplus 6,421 6.53 281.17 99.67

Uninstaller [IO: ▲0.00MB] [DB: ▲0.11MB] 75% from 4 tests

🔸 Tests weight: 35 | All plugins must uninstall correctly, removing their source code and extra database tables they might have created
You still need to fix the following
  • This plugin does not fully uninstall, leaving 24 options in the database
    • updraft_dropbox
    • updraft_openstack
    • updraft_s3
    • updraft_pcloud
    • updraft_azure
    • db_upgraded
    • updraft_webdav
    • updraft_s3generic
    • updraft_onedrive
    • widget_recent-posts
    • ...

Smoke tests 50% from 4 tests

Server-side errors Passed 1 test

🔹 Test weight: 20 | A smoke test targeting server-side errors
The smoke test was a success, however most plugin functionality was not tested

SRP 0% from 2 tests

🔹 Tests weight: 20 | The single-responsibility principle: PHP files have to remain inert when accessed directly, throwing no errors and performing no actions
Please take a closer look at the following
  • 130× PHP files output non-empty strings when accessed directly via GET requests (only 10 are shown):
    • > /wp-content/plugins/updraftplus/templates/wp-admin/advanced/db-size.php
    • > /wp-content/plugins/updraftplus/templates/wp-admin/settings/upload-backups-modal.php
    • > /wp-content/plugins/updraftplus/includes/class-manipulation-functions.php
    • > /wp-content/plugins/updraftplus/templates/wp-admin/settings/temporary-clone.php
    • > /wp-content/plugins/updraftplus/methods/dropbox.php
    • > /wp-content/plugins/updraftplus/includes/class-updraft-dashboard-news.php
    • > /wp-content/plugins/updraftplus/methods/template.php
    • > /wp-content/plugins/updraftplus/class-updraftplus.php
    • > /wp-content/plugins/updraftplus/methods/ftp.php
    • > /wp-content/plugins/updraftplus/central/modules/core.php
  • 315× GET requests to PHP files trigger server-side errors or Error 500 responses (only 10 are shown):
    • > PHP Fatal error
      Uncaught Error: Interface 'Guzzle\\Common\\Exception\\GuzzleException' not found in wp-content/plugins/updraftplus/vendor/guzzle/guzzle/src/Guzzle/Batch/Exception/BatchTransferException.php:12
    • > PHP Fatal error
      Uncaught Error: Interface 'Guzzle\\Parser\\Message\\MessageParserInterface' not found in wp-content/plugins/updraftplus/vendor/guzzle/guzzle/src/Guzzle/Parser/Message/AbstractMessageParser.php:8
    • > PHP Fatal error
      Uncaught Error: Class 'Eher\\OAuth\\SignatureMethod\\SignatureMethod' not found in wp-content/plugins/updraftplus/vendor/eher/oauth/src/Eher/OAuth/RsaSha1.php:13
    • > PHP Fatal error
      Uncaught Error: Interface 'Guzzle\\Http\\QueryAggregator\\QueryAggregatorInterface' not found in wp-content/plugins/updraftplus/vendor/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/CommaAggregator.php:10
    • > PHP Fatal error
      Uncaught Error: Class 'Guzzle\\Service\\Command\\LocationVisitor\\Request\\AbstractRequestVisitor' not found in wp-content/plugins/updraftplus/vendor/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/JsonVisitor.php:12
    • > PHP Fatal error
      Uncaught Error: Class 'phpseclib\\Crypt\\Base' not found in wp-content/plugins/updraftplus/vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php:64
    • > PHP Fatal error
      Uncaught Error: Interface 'Guzzle\\Batch\\BatchInterface' not found in wp-content/plugins/updraftplus/vendor/guzzle/guzzle/src/Guzzle/Batch/AbstractBatchDecorator.php:8
    • > PHP Fatal error
      Uncaught Error: Interface 'Psr\\Http\\Message\\StreamInterface' not found in wp-content/plugins/updraftplus/vendor/guzzlehttp/psr7/src/DroppingStream.php:13
    • > PHP Fatal error
      Uncaught Error: Interface 'Psr\\Http\\Message\\MessageInterface' not found in wp-content/plugins/updraftplus/vendor/psr/http-message/src/RequestInterface.php:26
    • > PHP Fatal error
      Uncaught Error: Class 'Guzzle\\Log\\AbstractLogAdapter' not found in wp-content/plugins/updraftplus/vendor/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php:11

User-side errors Passed 1 test

🔹 Test weight: 20 | Just a short smoke test targeting errors on the browser (console and network errors and warnings)
Everything seems fine on the user side

Optimizations

Plugin configuration 93% from 29 tests

readme.txt 94% from 16 tests

The readme.txt file is important because it is parsed by WordPress.org for the public listing of your plugin
Attributes that need to be fixed:
  • Screenshots: These screenshots do not have images: #5 (Restoration shows as successful), #6 (To migrate, first click 'Database', 'Plugins' etc. to download these backups to your local machine.), #7 (On the destination site, 'upload backup files' from the source site to restore and migrate to the new destination.)
Please take inspiration from this readme.txt

updraftplus/updraftplus.php 92% from 13 tests

"UpdraftPlus: WordPress Backup & Migration Plugin" version 1.23.13's main PHP file describes plugin functionality and also serves as the entry point to any WordPress functionality
Please make the necessary changes and fix the following:
  • Description: Keep the plugin description shorter than 140 characters (currently 147 characters long)

Code Analysis 95% from 3 tests

File types Passed 1 test

🔸 Test weight: 35 | An overview of files in this plugin; executable files are not allowed
Success! There were no dangerous files found in this plugin324,874 lines of code in 1,026 files:
Language Files Blank lines Comment lines Lines of code
PO File 32 67,808 83,520 136,691
PHP 828 23,739 55,343 133,391
JavaScript 35 7,119 7,815 35,109
CSS 34 1,686 197 10,719
Markdown 34 1,623 0 5,246
JSON 49 67 0 3,284
Sass 1 28 0 167
XML 7 16 12 142
HTML 1 16 0 41
Ant 1 10 1 34
YAML 1 2 0 25
Dockerfile 1 8 0 10
Perl 1 4 1 8
SVG 1 0 0 7

PHP code 0% from 2 tests

This plugin's cyclomatic complexity and code structure detailed below
It is recommended to fix the following
  • Class cyclomatic complexity has to be reduced to less than 1000 (currently 1,523)
  • Cyclomatic complexity of methods has to be reduced to less than 100 (currently 286)
Cyclomatic complexity
Average complexity per logical line of code 0.46
Average class complexity 21.82
▷ Minimum class complexity 1.00
▷ Maximum class complexity 1,523.00
Average method complexity 3.94
▷ Minimum method complexity 1.00
▷ Maximum method complexity 286.00
Code structure
Namespaces 96
Interfaces 74
Traits 4
Classes 896
▷ Abstract classes 49 5.47%
▷ Concrete classes 847 94.53%
▷ Final classes 29 3.42%
Methods 7,239
▷ Static methods 515 7.11%
▷ Public methods 6,396 88.35%
▷ Protected methods 310 4.28%
▷ Private methods 533 7.36%
Functions 263
▷ Named functions 136 51.71%
▷ Anonymous functions 127 48.29%
Constants 737
▷ Global constants 157 21.30%
▷ Class constants 580 78.70%
▷ Public constants 580 100.00%

Plugin size Passed 2 tests

Image compression Passed 2 tests

All PNG images should be compressed to minimize bandwidth usage for end users
106 compressed PNG files occupy 0.55MB
Potential savings
Compression of 5 random PNG files using pngquant
File Size - original Size - compressed Savings
images/notices/locksettings.png 1.25KB 1.37KB 0.00%
includes/images/ui-icons_222222_256x240.png 4.33KB 4.17KB ▼ 3.52%
images/addons-images/azure.png 5.54KB 5.77KB 0.00%
images/icons/googledrive.png 1.88KB 1.42KB ▼ 24.22%
images/other-plugins/updraft-central.png 5.02KB 3.32KB ▼ 33.86%