Implement version 0.0.1 - Licensed Product type for WooCommerce

Add complete plugin infrastructure for selling software with license keys:

- New "Licensed Product" WooCommerce product type
- License key generation (XXXX-XXXX-XXXX-XXXX format) on order completion
- Domain-based license validation system
- REST API endpoints (validate, status, activate, deactivate)
- Customer My Account "Licenses" page
- Admin license management under WooCommerce > Licenses
- Checkout domain field for licensed products
- Custom database tables for licenses and product versions
- Twig template engine integration
- Full i18n support with German (de_CH) translation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-21 18:55:18 +01:00
parent 8a4802248c
commit 404083f023
22 changed files with 3746 additions and 0 deletions

91
assets/css/admin.css Normal file
View File

@@ -0,0 +1,91 @@
/**
* WC Licensed Product - Admin Styles
*
* @package Jeremias\WcLicensedProduct
*/
/* License Status Badges */
.license-status {
display: inline-block;
padding: 0.2em 0.5em;
font-size: 0.85em;
font-weight: 500;
line-height: 1.2;
border-radius: 3px;
}
.license-status-active {
background-color: #d4edda;
color: #155724;
}
.license-status-inactive {
background-color: #fff3cd;
color: #856404;
}
.license-status-expired {
background-color: #f8d7da;
color: #721c24;
}
.license-status-revoked {
background-color: #d6d8db;
color: #383d41;
}
/* License Table */
.wp-list-table code {
font-family: monospace;
background-color: #f0f0f0;
padding: 0.15em 0.4em;
border-radius: 3px;
font-size: 0.9em;
}
/* License Product Tab */
#woocommerce-product-data .show_if_licensed {
display: block !important;
}
#woocommerce-product-data .hide_if_licensed {
display: none !important;
}
/* Action Buttons */
.wp-list-table .button-link-delete {
color: #a00;
}
.wp-list-table .button-link-delete:hover {
color: #dc3232;
}
/* Pagination */
.tablenav-pages .pagination-links {
display: flex;
align-items: center;
gap: 0.5em;
}
.tablenav-pages .paging-input {
margin: 0 0.5em;
}
/* Orders Column */
.column-license {
width: 15%;
}
.column-license .dashicons {
vertical-align: middle;
margin-right: 0.3em;
}
.column-license .dashicons-warning {
color: #dba617;
}
.column-license .dashicons-admin-network {
color: #2271b1;
}

124
assets/css/frontend.css Normal file
View File

@@ -0,0 +1,124 @@
/**
* WC Licensed Product - Frontend Styles
*
* @package Jeremias\WcLicensedProduct
*/
/* License Status Badges */
.license-status {
display: inline-block;
padding: 0.25em 0.6em;
font-size: 0.85em;
font-weight: 600;
line-height: 1;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: 0.25rem;
}
.license-status-active {
background-color: #d4edda;
color: #155724;
}
.license-status-inactive {
background-color: #fff3cd;
color: #856404;
}
.license-status-expired {
background-color: #f8d7da;
color: #721c24;
}
.license-status-revoked {
background-color: #d6d8db;
color: #383d41;
}
/* License Table */
.woocommerce-licenses-table {
width: 100%;
border-collapse: collapse;
margin-bottom: 1em;
}
.woocommerce-licenses-table th,
.woocommerce-licenses-table td {
padding: 0.75em;
text-align: left;
border-bottom: 1px solid #e5e5e5;
}
.woocommerce-licenses-table th {
font-weight: 600;
background-color: #f8f8f8;
}
.woocommerce-licenses-table code {
font-family: monospace;
background-color: #f5f5f5;
padding: 0.2em 0.4em;
border-radius: 3px;
font-size: 0.9em;
}
/* Domain Field */
#licensed-product-domain-field {
margin-top: 2em;
padding: 1.5em;
background-color: #f8f9fa;
border: 1px solid #e5e5e5;
border-radius: 4px;
}
#licensed-product-domain-field h3 {
margin-top: 0;
margin-bottom: 1em;
font-size: 1.1em;
}
#licensed-product-domain-field .description {
display: block;
margin-top: 0.5em;
font-size: 0.9em;
color: #666;
}
/* Responsive */
@media screen and (max-width: 768px) {
.woocommerce-licenses-table,
.woocommerce-licenses-table thead,
.woocommerce-licenses-table tbody,
.woocommerce-licenses-table th,
.woocommerce-licenses-table td,
.woocommerce-licenses-table tr {
display: block;
}
.woocommerce-licenses-table thead tr {
position: absolute;
top: -9999px;
left: -9999px;
}
.woocommerce-licenses-table tr {
border: 1px solid #e5e5e5;
margin-bottom: 1em;
}
.woocommerce-licenses-table td {
border: none;
position: relative;
padding-left: 50%;
}
.woocommerce-licenses-table td:before {
content: attr(data-title);
position: absolute;
left: 0.75em;
width: 45%;
font-weight: 600;
}
}