18 Commits

Author SHA1 Message Date
968cd6a18f Merge branch 'dev' for v0.1.0 release 2026-01-22 11:57:16 +01:00
5256f88815 Prepare v0.1.0 release - code review and documentation updates
- Conducted comprehensive security and best practices review
- Fixed VersionManager null format handling for attachment updates
- Improved input sanitization in AdminController for page context checks
- Updated README.md with complete feature documentation
- Updated CHANGELOG.md with 0.1.0 release notes
- Updated translations (.pot, .po, .mo files) to version 0.1.0
- Bumped version to 0.1.0 in plugin header and constant

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 11:57:05 +01:00
d0c0756412 Update CLAUDE.md with v0.0.11 session history
Corrected session history to reflect actual v0.0.11 release:
- Created date column added to license overview
- Removed references to AnalyticsController (was deleted due to issues)
- Added release package details and SHA256 checksum

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 00:26:46 +01:00
6770ec5201 Clean up translations, remove unused strings
Removed strings from deleted AnalyticsController.
Compiled German translation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 00:21:18 +01:00
6f1ea3c6fa Remove License Statistics page due to issues
Keep existing Reports > Licenses dashboard which works correctly.
Version 0.0.11 now only includes the Created column in license overview.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 00:10:32 +01:00
10453360ad Revert to manage_woocommerce capability 2026-01-22 00:08:26 +01:00
8ada21afb0 Register hooks in constructor like AdminController 2026-01-22 00:07:27 +01:00
27dc1b67c5 Fix AnalyticsController being garbage collected
Store the AnalyticsController instance as a class property
to prevent it from being garbage collected before WordPress
can call the registered callbacks.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 00:06:28 +01:00
a73b7cc550 Debug: simple test page 2026-01-22 00:05:06 +01:00
89c5a40f56 Add error output for debugging statistics page 2026-01-22 00:03:41 +01:00
79b9c2cefd Use PHP rendering for statistics page
Skip Twig template and use direct PHP rendering for
better stability and debugging.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 00:02:53 +01:00
f8b88e4c98 Fix statistics page error handling
Catch all Twig errors (not just LoaderError) to ensure
fallback to PHP rendering works properly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 00:02:17 +01:00
1008617623 Fix License Statistics page permission issue
Changed capability from manage_woocommerce to manage_options
to ensure admin users can access the page.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 00:00:59 +01:00
45531f86d6 Implement version 0.0.11 features
- Add Created date column to admin license overview
- Add License Statistics page under WooCommerce menu
- Add REST API endpoints for analytics data with time-series support
- WooCommerce Analytics integration via submenu page

New files:
- src/Admin/AnalyticsController.php
- templates/admin/statistics.html.twig

REST API endpoints:
- GET /wc-licensed-product/v1/analytics/stats
- GET /wc-licensed-product/v1/analytics/products

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:50:57 +01:00
ff9b27e811 added claude settings.json 2026-01-21 23:27:23 +01:00
a59631aec3 Add releases directory to .gitignore
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:25:41 +01:00
0e3b57482e Update CLAUDE.md with v0.0.10 session history
- Document inline editing features for licenses
- Document live search and copy license key functionality
- Document AJAX handlers and new LicenseManager methods
- Record release v0.0.10 details with checksums
- Note known bug about version uploads

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:24:47 +01:00
b3cf3e114b Update CHANGELOG and add v0.0.10 release package
- Updated CHANGELOG with all v0.0.10 features
- Added release package with checksums

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:23:16 +01:00
13 changed files with 2759 additions and 1542 deletions

8
.claude/settings.json Normal file
View File

@@ -0,0 +1,8 @@
{
"permissions": {
"allow": [
"Bash(composer config:*)",
"Bash(composer update:*)"
]
}
}

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@
wp-plugins wp-plugins
wp-core wp-core
vendor/ vendor/
releases/*

View File

@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [0.1.0] - 2026-01-22
### Added
- First stable minor release
- Comprehensive code review for WordPress/WooCommerce best practices
- Security audit completed
### Changed
- Improved input sanitization for admin page context checks
- Fixed VersionManager null format handling for attachment updates
### Technical Details
- All code reviewed for OWASP Top 10 security vulnerabilities
- Verified proper nonce verification, capability checks, and input sanitization
- SQL injection prevention confirmed using `$wpdb->prepare()` throughout
- XSS prevention confirmed with proper output escaping
- Rate limiting verified on REST API endpoints
- README.md updated with full feature documentation
## [0.0.11] - 2026-01-22
### Added
- Created date column in admin license overview
### Technical Details
- Added "Created" column to licenses table in admin (Twig template and PHP fallback)
- Shows when each license was generated
## [0.0.10] - 2026-01-21 ## [0.0.10] - 2026-01-21
### Added ### Added
@@ -17,13 +50,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- View licenses table showing all licenses for an order - View licenses table showing all licenses for an order
- Link to full licenses management page from order view - Link to full licenses management page from order view
- Support for both classic orders and HPOS (High-Performance Order Storage) - Support for both classic orders and HPOS (High-Performance Order Storage)
- Inline editing for license fields (status, expiry date, domain) in admin
- Copy license key button in admin licenses overview
- Live search for licenses in admin overview
- Settings link in plugin actions
### Fixed
- Fixed 404 error on licenses menu item
- Fixed Twig template cache issues with auto_reload
### Technical Details ### Technical Details
- New `OrderLicenseController` class for order page integration - New `OrderLicenseController` class for order page integration
- New `getLicensesByOrder()` method in LicenseManager - New `getLicensesByOrder()` method in LicenseManager
- New `updateLicenseExpiry()` method in LicenseManager
- JavaScript file `order-licenses.js` for inline domain editing - JavaScript file `order-licenses.js` for inline domain editing
- JavaScript file `admin-licenses.js` for live search and inline editing
- AJAX handlers for updating order domain and license domains - AJAX handlers for updating order domain and license domains
- AJAX handlers for inline editing (status, expiry, domain updates)
## [0.0.9] - 2026-01-21 ## [0.0.9] - 2026-01-21
@@ -252,7 +297,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- WordPress REST API integration - WordPress REST API integration
- Custom WooCommerce product type extending WC_Product - Custom WooCommerce product type extending WC_Product
[Unreleased]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.7...HEAD [Unreleased]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.1.0...HEAD
[0.1.0]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.11...v0.1.0
[0.0.11]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.10...v0.0.11
[0.0.10]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.9...v0.0.10
[0.0.9]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.8...v0.0.9
[0.0.8]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.7...v0.0.8
[0.0.7]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.6...v0.0.7 [0.0.7]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.6...v0.0.7
[0.0.6]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.5...v0.0.6 [0.0.6]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.5...v0.0.6
[0.0.5]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.4...v0.0.5 [0.0.5]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.4...v0.0.5

View File

@@ -34,11 +34,14 @@ This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase w
### Known Bugs ### Known Bugs
None currently known. No known bugs at the moment
### Version 0.0.11 (planned) ### Release 0.1.0
- TBD - no specific features planned yet - Check the code for wordpress best practices, WooCommerce best practices and common security pitfalls. Refactor if needed.
- Update the README.md according to the current featureset
- Update all translations
- Create a release package 0.1.0
## Technical Stack ## Technical Stack
@@ -554,17 +557,70 @@ Full API documentation available in `openapi.json` (OpenAPI 3.1 specification).
- Inline edit UI with save/cancel for license domains - Inline edit UI with save/cancel for license domains
- Links to full licenses management page for advanced actions - Links to full licenses management page for advanced actions
**Bug fix (post v0.0.10):** **Additional features added in this session:**
- Inline editing for license fields (status, expiry date, domain) in admin licenses overview
- Copy license key button with clipboard API and fallback for older browsers
- Live search for licenses in admin overview with AJAX-powered results dropdown
- Settings link added to plugin action links in Plugins list
- Fixed 404 error on licenses menu item in customer account
- Fixed Twig template cache issues with `auto_reload` option
**New files:**
- `assets/js/admin-licenses.js` - JavaScript for live search, inline editing, and copy functionality
**New methods in LicenseManager:**
- `updateLicenseExpiry()` - Update license expiry date with auto-reactivation for expired licenses
**AJAX handlers added to AdminController:**
- `handleAjaxStatusUpdate()` - Update license status via AJAX
- `handleAjaxExpiryUpdate()` - Update license expiry date via AJAX
- `handleAjaxDomainUpdate()` - Update license domain via AJAX
- `handleAjaxRevoke()` - Revoke license via AJAX
**Technical notes:**
- Live search uses 300ms debounce and keyboard navigation (arrows, enter, escape)
- Inline editing shows edit icons on hover, supports enter to save and escape to cancel
- Copy button uses Clipboard API with textarea fallback for older browsers
- All AJAX handlers use nonce verification (`wclp_inline_edit` nonce)
- Twig configured with `auto_reload => true` for development to always check template changes
**Bug fix:**
- Fixed: Licenses menu item in customer account page resulted in 404 error - Fixed: Licenses menu item in customer account page resulted in 404 error
- Root cause: WooCommerce My Account endpoints require both `add_rewrite_endpoint()` AND registration with `woocommerce_get_query_vars` filter
- Fix: Added `addLicensesQueryVar()` method to register the endpoint query var with WooCommerce
**Root cause:** **Release v0.0.10:**
- WooCommerce My Account endpoints require both `add_rewrite_endpoint()` AND registration with `woocommerce_get_query_vars` filter - Created release package: `releases/wc-licensed-product-0.0.10.zip` (472 KB)
- The endpoint also needs to be registered before rewrite rules are flushed during activation - SHA256: `3f4a093f6d4d02389082c3a88c00542f477ab3ad4d4a0c65079e524ef0739620`
- Tagged as `v0.0.10` and pushed to `main` branch
**Fix:** ### 2026-01-22 - Version 0.0.11 Features
- Added `addLicensesQueryVar()` method to register the endpoint query var with WooCommerce **Implemented:**
- Updated Installer to register endpoint before flushing rewrite rules on activation
- Existing installations may need to visit Settings > Permalinks and click Save to regenerate rewrite rules - Created date column added to admin license overview showing when each license was generated
**Modified files:**
- `templates/admin/licenses.html.twig` - Added "Created" column to table header and data cells
- `src/Admin/AdminController.php` - Added "Created" column to PHP fallback rendering
- `src/Plugin.php` - Added `getInstance()` alias for singleton access
**Technical notes:**
- New column displays license creation date in Y-m-d format
- Both Twig template and PHP fallback updated for consistency
- WooCommerce Analytics integration was attempted but removed due to WordPress permission issues with submenu pages
**Release v0.0.11:**
- Created release package: `releases/wc-licensed-product-0.0.11.zip` (473 KB)
- SHA256: `c3f66c4ac54741053f87ce1a63b4ddb49ad9707d5c194a271311bb95518ab13c`
- Tagged as `v0.0.11` and pushed to `main` branch

View File

@@ -17,6 +17,7 @@ WC Licensed Product adds a new product type "Licensed Product" to WooCommerce, e
- **Version Binding**: Optional binding to major software versions - **Version Binding**: Optional binding to major software versions
- **Expiration Support**: Set license validity periods or lifetime licenses - **Expiration Support**: Set license validity periods or lifetime licenses
- **Rate Limiting**: API endpoints protected with rate limiting (30 requests/minute) - **Rate Limiting**: API endpoints protected with rate limiting (30 requests/minute)
- **Checkout Blocks**: Full support for WooCommerce Checkout Blocks (default since WC 8.3+)
### Customer Features ### Customer Features
@@ -30,12 +31,16 @@ WC Licensed Product adds a new product type "Licensed Product" to WooCommerce, e
- **License Management**: Full CRUD interface for license management - **License Management**: Full CRUD interface for license management
- **License Dashboard**: Statistics and analytics (WooCommerce > Reports > Licenses) - **License Dashboard**: Statistics and analytics (WooCommerce > Reports > Licenses)
- **Search & Filtering**: Search by license key, domain, status, or product - **Search & Filtering**: Search by license key, domain, status, or product
- **Live Search**: AJAX-powered instant search results
- **Inline Editing**: Edit license status, expiry, and domain directly in the list
- **Bulk Operations**: Activate, deactivate, revoke, extend, or delete multiple licenses - **Bulk Operations**: Activate, deactivate, revoke, extend, or delete multiple licenses
- **License Transfer**: Transfer licenses to new domains - **License Transfer**: Transfer licenses to new domains
- **CSV Export/Import**: Export and import licenses via CSV - **CSV Export/Import**: Export and import licenses via CSV
- **Order Integration**: View and manage licenses directly from order pages
- **Expiration Warnings**: Automatic email notifications before license expiration - **Expiration Warnings**: Automatic email notifications before license expiration
- **Version Management**: Manage multiple versions per product with file attachments - **Version Management**: Manage multiple versions per product with file attachments
- **Global Settings**: Default license settings via WooCommerce settings tab - **Global Settings**: Default license settings via WooCommerce settings tab
- **WooCommerce HPOS**: Compatible with High-Performance Order Storage
## Requirements ## Requirements
@@ -60,7 +65,6 @@ WC Licensed Product adds a new product type "Licensed Product" to WooCommerce, e
- **Max Activations**: Number of domains allowed per license - **Max Activations**: Number of domains allowed per license
- **License Validity**: Days until expiration (empty = lifetime) - **License Validity**: Days until expiration (empty = lifetime)
- **Bind to Major Version**: Lock license to current major version - **Bind to Major Version**: Lock license to current major version
- **Current Version**: Your software's current version
### Managing Product Versions ### Managing Product Versions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -105,7 +105,9 @@ final class AdminController
{ {
// Check for our pages and WooCommerce Reports page with licenses tab // Check for our pages and WooCommerce Reports page with licenses tab
$isLicensePage = in_array($hook, ['woocommerce_page_wc-licenses', 'woocommerce_page_wc-license-dashboard'], true); $isLicensePage = in_array($hook, ['woocommerce_page_wc-licenses', 'woocommerce_page_wc-license-dashboard'], true);
$isReportsPage = $hook === 'woocommerce_page_wc-reports' && isset($_GET['tab']) && $_GET['tab'] === 'licenses'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Only checking current page context
$currentTab = isset($_GET['tab']) ? sanitize_text_field(wp_unslash($_GET['tab'])) : '';
$isReportsPage = $hook === 'woocommerce_page_wc-reports' && $currentTab === 'licenses';
if (!$isLicensePage && !$isReportsPage) { if (!$isLicensePage && !$isReportsPage) {
return; return;
@@ -1253,6 +1255,7 @@ final class AdminController
<th><?php esc_html_e('Customer', 'wc-licensed-product'); ?></th> <th><?php esc_html_e('Customer', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Domain', 'wc-licensed-product'); ?></th> <th><?php esc_html_e('Domain', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Status', 'wc-licensed-product'); ?></th> <th><?php esc_html_e('Status', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Created', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Expires', 'wc-licensed-product'); ?></th> <th><?php esc_html_e('Expires', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Actions', 'wc-licensed-product'); ?></th> <th><?php esc_html_e('Actions', 'wc-licensed-product'); ?></th>
</tr> </tr>
@@ -1260,7 +1263,7 @@ final class AdminController
<tbody> <tbody>
<?php if (empty($enrichedLicenses)): ?> <?php if (empty($enrichedLicenses)): ?>
<tr> <tr>
<td colspan="8"><?php esc_html_e('No licenses found.', 'wc-licensed-product'); ?></td> <td colspan="9"><?php esc_html_e('No licenses found.', 'wc-licensed-product'); ?></td>
</tr> </tr>
<?php else: ?> <?php else: ?>
<?php foreach ($enrichedLicenses as $item): ?> <?php foreach ($enrichedLicenses as $item): ?>
@@ -1320,6 +1323,9 @@ final class AdminController
<button type="button" class="wclp-cancel-btn button button-small"><?php esc_html_e('Cancel', 'wc-licensed-product'); ?></button> <button type="button" class="wclp-cancel-btn button button-small"><?php esc_html_e('Cancel', 'wc-licensed-product'); ?></button>
</div> </div>
</td> </td>
<td class="wclp-created-cell">
<?php echo esc_html($item['license']->getCreatedAt()->format(get_option('date_format'))); ?>
</td>
<td class="wclp-editable-cell" data-field="expiry" data-license-id="<?php echo esc_attr($item['license']->getId()); ?>"> <td class="wclp-editable-cell" data-field="expiry" data-license-id="<?php echo esc_attr($item['license']->getId()); ?>">
<?php $expiresAt = $item['license']->getExpiresAt(); ?> <?php $expiresAt = $item['license']->getExpiresAt(); ?>
<span class="wclp-display-value"> <span class="wclp-display-value">
@@ -1387,6 +1393,7 @@ final class AdminController
<th><?php esc_html_e('Customer', 'wc-licensed-product'); ?></th> <th><?php esc_html_e('Customer', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Domain', 'wc-licensed-product'); ?></th> <th><?php esc_html_e('Domain', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Status', 'wc-licensed-product'); ?></th> <th><?php esc_html_e('Status', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Created', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Expires', 'wc-licensed-product'); ?></th> <th><?php esc_html_e('Expires', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Actions', 'wc-licensed-product'); ?></th> <th><?php esc_html_e('Actions', 'wc-licensed-product'); ?></th>
</tr> </tr>

View File

@@ -68,6 +68,14 @@ final class Plugin
return self::$instance; return self::$instance;
} }
/**
* Get singleton instance (alias for instance())
*/
public static function getInstance(): Plugin
{
return self::instance();
}
/** /**
* Private constructor for singleton * Private constructor for singleton
*/ */

View File

@@ -167,8 +167,20 @@ class VersionManager
} }
if ($attachmentId !== null) { if ($attachmentId !== null) {
$data['attachment_id'] = $attachmentId > 0 ? $attachmentId : null; if ($attachmentId > 0) {
$formats[] = $attachmentId > 0 ? '%d' : null; $data['attachment_id'] = $attachmentId;
$formats[] = '%d';
} else {
// Set to NULL using raw SQL instead of adding to $data
global $wpdb;
$tableName = Installer::getVersionsTable();
$wpdb->query(
$wpdb->prepare(
"UPDATE {$tableName} SET attachment_id = NULL WHERE id = %d",
$versionId
)
);
}
} }
if (empty($data)) { if (empty($data)) {

View File

@@ -95,6 +95,7 @@
<th>{{ __('Customer') }}</th> <th>{{ __('Customer') }}</th>
<th>{{ __('Domain') }}</th> <th>{{ __('Domain') }}</th>
<th>{{ __('Status') }}</th> <th>{{ __('Status') }}</th>
<th>{{ __('Created') }}</th>
<th>{{ __('Expires') }}</th> <th>{{ __('Expires') }}</th>
<th>{{ __('Actions') }}</th> <th>{{ __('Actions') }}</th>
</tr> </tr>
@@ -102,7 +103,7 @@
<tbody> <tbody>
{% if licenses is empty %} {% if licenses is empty %}
<tr> <tr>
<td colspan="8">{{ __('No licenses found.') }}</td> <td colspan="9">{{ __('No licenses found.') }}</td>
</tr> </tr>
{% else %} {% else %}
{% for item in licenses %} {% for item in licenses %}
@@ -160,6 +161,9 @@
<button type="button" class="wclp-cancel-btn button button-small">{{ __('Cancel') }}</button> <button type="button" class="wclp-cancel-btn button button-small">{{ __('Cancel') }}</button>
</div> </div>
</td> </td>
<td class="wclp-created-cell">
{{ item.license.createdAt|date('Y-m-d') }}
</td>
<td class="wclp-editable-cell" data-field="expiry" data-license-id="{{ item.license.id }}"> <td class="wclp-editable-cell" data-field="expiry" data-license-id="{{ item.license.id }}">
<span class="wclp-display-value"> <span class="wclp-display-value">
{% if item.license.expiresAt %} {% if item.license.expiresAt %}
@@ -219,6 +223,7 @@
<th>{{ __('Customer') }}</th> <th>{{ __('Customer') }}</th>
<th>{{ __('Domain') }}</th> <th>{{ __('Domain') }}</th>
<th>{{ __('Status') }}</th> <th>{{ __('Status') }}</th>
<th>{{ __('Created') }}</th>
<th>{{ __('Expires') }}</th> <th>{{ __('Expires') }}</th>
<th>{{ __('Actions') }}</th> <th>{{ __('Actions') }}</th>
</tr> </tr>

View File

@@ -3,7 +3,7 @@
* Plugin Name: WooCommerce Licensed Product * Plugin Name: WooCommerce Licensed Product
* Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-licensed-product * Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-licensed-product
* Description: WooCommerce plugin to sell software products using license keys with domain-based validation. * Description: WooCommerce plugin to sell software products using license keys with domain-based validation.
* Version: 0.0.10 * Version: 0.1.0
* Author: Marco Graetsch * Author: Marco Graetsch
* Author URI: https://src.bundespruefstelle.ch/magdev * Author URI: https://src.bundespruefstelle.ch/magdev
* License: GPL-2.0-or-later * License: GPL-2.0-or-later
@@ -28,7 +28,7 @@ if (!defined('ABSPATH')) {
} }
// Plugin constants // Plugin constants
define('WC_LICENSED_PRODUCT_VERSION', '0.0.10'); define('WC_LICENSED_PRODUCT_VERSION', '0.1.0');
define('WC_LICENSED_PRODUCT_PLUGIN_FILE', __FILE__); define('WC_LICENSED_PRODUCT_PLUGIN_FILE', __FILE__);
define('WC_LICENSED_PRODUCT_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('WC_LICENSED_PRODUCT_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('WC_LICENSED_PRODUCT_PLUGIN_URL', plugin_dir_url(__FILE__)); define('WC_LICENSED_PRODUCT_PLUGIN_URL', plugin_dir_url(__FILE__));