WP Manifestindependent plugin directory
manifest / ecommerce / classic-commerce

Classic Commerce WP Registry grade D+. High-severity findings · 3 findingsWP RegistryHigh-severity findings · 3 findingsOpen the reportD+

A simple but powerful e-commerce platform built for ClassicPress. Forked from WooCommerce and compatible with many Woo extensions.

★ 59stars
1.8krelease downloads
≈90active sites
13composer installs
1.0.4latest · 5 years ago

Install

Download classic-commerce.zip From the 1.0.4 release on GitHub, Jul 18, 2021

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/classicpress/classic-commerce/releases/download/1.0.4/classic-commerce.zip

On Packagist as classicpress-research/classic-commerce:

composer require classicpress-research/classic-commerce
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

Classic Commerce Build Status

Welcome to the Classic Commerce repository on GitHub. This is a fork of WooCommerce and is still in development.

Classic Commerce is a simple, powerful and independent e-commerce platform. Sell anything with ease.

You can browse the source, look at open issues and keep track of development here.

We recommend all developers follow the Issues and Pull Requests for the latest development updates.

Roadmap

You can follow up on the development cycle by reading our roadmap.

FAQs

Can I install WooCommerce together with Classic Commerce? Yes, you can have both WooCommerce and Classic Commerce installed as plugins. However, you can't have them both activated. You will need to deactivate one before activating the other.

What are the differences between WooCommerce and Classic Commerce? Classic Commerce is a fork of WooCommerce with all the WooCommerce Services and Jetpack integrations removed. This means there will be no "nags" or "upsells" at any stage when you are using Classic Commerce. You won't find any plugins or products that are promoted or pushed in any way.

Can I import my products and settings from WooCommerce to Classic Commerce? There is no need to import anything when changing from WooCommerce to Classic Commerce. They share all the same classes and hooks so your existing WooCommerce records will be recognised by Classic Commerce and immediately available.

What version of WooCommerce is Classic Commerce based on? Classic Commerce is a fork of WooCommerce 3.5.3.

What plugins work with Classic Commerce? All of the extensions compatible with WooCommerce 3.5.3 should still be usable, provided they do not rely on Jetpack or WooCommerce Services. However, we strongly recommend that you test and monitor any extensions or plugins that you may need to provide extra functionality.

How do I switch over from using WooCommerce to using Classic Commerce? Is it safe to uninstall WooCommerce? To try out Classic Commerce you can manually install it as a plugin. Make sure you deactivate WooCommerce before activating Classic Commerce. If you want to uninstall WooCommerce completely you can do so safely, but we recommend you take a full backup of your site first. Note that deactivating and deleting WooCommerce normally only removes the plugin and its files; the settings, orders, products, pages, etc are retained in the database. However, there is a possibility that a setting in your site’s wp-config file may over-ride this, so it is worth checking to make sure the following condition has not been included anywhere in that file: define( 'WC_REMOVE_ALL_DATA', true);

Documentation

Reporting Security Issues

To disclose a security issue to our team. (security@classicpress.net)

Support

This repository is most suitable for development but can also be used for support. We will add a support tag to your issue. However, this might take a little longer to get a response. You can also use the dedicated support area on the ClassicPress community forum.

Contributing to Classic Commerce

If you have a patch or have stumbled upon an issue with Classic Commerce core, you can contribute this back to the code. Please read our contributor guidelines for more information about how you can do this.

Releases

10 releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
1.0.4 latest
Jul 18, 2021 5 years ago
classic-commerce.zip
1,069
Nov 19, 2020 5 years ago
classic-commerce.zip
231
Oct 17, 2020 6 years ago
classic-commerce.zip
82
Oct 1, 2020 6 years ago
classic-commerce.zip
83
Aug 29, 2020 6 years ago
classic-commerce.zip
98
Aug 29, 2020 6 years ago
classic-commerce.zip
29
May 16, 2020 6 years ago
classic-commerce.zip
91
Jan 20, 2020 6 years ago
classic-commerce.zip
84
Dec 29, 2019 6 years ago
classic-commerce.zip
58
Dec 28, 2019 6 years ago
classic-commerce.zip
23

Active-site estimate ≈90 comes from the median of recent superseded releases. Method.

D+ grade

Security

Classic Commerce 1.0.4 · audited by WP Registry

High-severity findings.

2 high 1 medium
Audited release
1.0.4
Findings
3
Worst severity
high
Content hash
2b9b00f654f7bc7f9327cd15…

Findings

  • high Shop Manager SQL injection via coupon usage report coupon_codes parameter

    sql_injection

    The Coupons by date report reads $_GET['coupon_codes'], runs wp_unslash (undoing wp_magic_quotes), then sanitize_text_field, and passes the values into WC_Admin_Report::get_order_report_data as an IN list. That helper concatenates the values into SQL as IN ('{$value}') with no $wpdb->prepare. A Shop Manager (view_woocommerce_reports, no manage_options) can visit admin.php?page=wc-reports&tab=orders&report=coupon_usage&coupon_codes=')+AND+SLEEP(5)--+- and execute arbitrary SQL. Time-based or UNION queries can extract wp_users password hashes. Shop Manager is explicitly blocked from editing administrator users via wc_modify_map_meta_cap, so this is privilege escalation. Same sink exists for other report where-clauses that pass unsanitized strings; product_ids reports correctly use absint. WooCommerce core patched this class of reports interpolation in 2025 (HackerOne 3198980); Classic Commerce 1.0.4 still has the 3.5-era code.

    includes/admin/reports/class-wc-admin-report.php:288-342

    Recommendation

    Pass coupon codes through $wpdb->prepare with a repeated %s placeholder list (or esc_sql each element after unslash). Do not interpolate unsanitized report filters into SQL. Restrict report filters to known coupon posts.

  • high Shop Manager arbitrary local file download via downloadable product file paths

    file_access

    Product download files are stored as free-form paths. WC_Product_Download::is_allowed_filetype() returns true for any path with no extension, and file_exists() accepts absolute paths that start with /. WC_Download_Handler::parse_file_path() then maps those paths onto the local filesystem (ABSPATH-relative, /wp-content/..., or any scheme-less path that file_exists()) and force-downloads the file. A Shop Manager (edit_products, no manage_options) can set a downloadable product file to /etc/passwd or another extensionless server file, grant themselves a download (or buy a $0 product), and read it. PHP files such as wp-config.php are blocked on save by mime-type, but extensionless secrets and allowed-type files (txt/pdf/csv) anywhere on disk are not confined to uploads. WooCommerce 5.2+ restricted downloads to the uploads directory; this 3.5.3-based fork never received that check. The download endpoint itself is unauthenticated once a valid email/order_key/download_id tuple exists.

    includes/class-wc-download-handler.php:224-273

    Recommendation

    Resolve the path with realpath and require it to live under wp_upload_dir()['basedir'] (or an explicit allowlist). Reject absolute paths, .. segments, and extensionless files outside uploads. Re-validate the resolved path at download time, not only on product save.

  • medium Shop Manager can fopen arbitrary server .csv/.txt files via product CSV importer

    file_access

    WC_Product_CSV_Importer_Controller takes $_REQUEST['file'] as a filesystem path. WC_Product_CSV_Importer::read_file() only checks wp_check_filetype against csv/txt and that the path does not contain '://'; it does not confine the path to the uploads directory. A Shop Manager with the import capability (assigned by default) who has a woocommerce-csv-importer nonce from the importer screen can set file to any readable .txt or .csv on the server (for example a credentials dump or backup named .txt). fopen reads it and the mapping UI echoes the first row as a sample. handle_upload() also accepts POST file_url as ABSPATH-relative csv/txt. Later WooCommerce versions chroot importer files to uploads.

    includes/admin/importers/class-wc-product-csv-importer-controller.php:151-153

    Recommendation

    Resolve the importer file with realpath and require it to be inside the uploads directory (or the attachment created by wp_handle_upload). Do not accept arbitrary file or file_url query arguments.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.