You've already forked wc-licensed-product
Implement multi-domain licensing for v0.5.0
- Add multi-domain checkout support for WooCommerce Blocks - Fix domain field rendering using ExperimentalOrderMeta slot - Add DOM injection fallback for checkout field rendering - Update translations with new multi-domain strings (de_CH) - Update email templates for grouped license display - Refactor account page to group licenses by product/order Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -194,7 +194,7 @@ final class LicenseEmailController
|
||||
}
|
||||
|
||||
/**
|
||||
* Add license key to order item in email
|
||||
* Add license key(s) to order item in email
|
||||
*/
|
||||
public function addLicenseToOrderItem(int $itemId, \WC_Order_Item $item, \WC_Order $order, bool $plainText): void
|
||||
{
|
||||
@@ -203,94 +203,117 @@ final class LicenseEmailController
|
||||
return;
|
||||
}
|
||||
|
||||
$license = $this->licenseManager->getLicenseByOrderAndProduct($order->get_id(), $product->get_id());
|
||||
if (!$license) {
|
||||
$licenses = $this->licenseManager->getLicensesByOrderAndProduct($order->get_id(), $product->get_id());
|
||||
if (empty($licenses)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($plainText) {
|
||||
echo "\n" . esc_html__('License Key:', 'wc-licensed-product') . ' ' . esc_html($license->getLicenseKey()) . "\n";
|
||||
echo "\n" . esc_html__('License Keys:', 'wc-licensed-product') . "\n";
|
||||
foreach ($licenses as $license) {
|
||||
echo ' - ' . esc_html($license->getLicenseKey());
|
||||
echo ' (' . esc_html($license->getDomain()) . ')' . "\n";
|
||||
}
|
||||
} else {
|
||||
?>
|
||||
<div style="margin-top: 10px; padding: 10px; background-color: #f8f9fa; border-left: 3px solid #7f54b3;">
|
||||
<strong><?php esc_html_e('License Key:', 'wc-licensed-product'); ?></strong>
|
||||
<code style="display: block; margin-top: 5px; padding: 5px; background: #fff; font-family: monospace;">
|
||||
<?php echo esc_html($license->getLicenseKey()); ?>
|
||||
</code>
|
||||
<strong><?php esc_html_e('License Keys:', 'wc-licensed-product'); ?></strong>
|
||||
<?php foreach ($licenses as $license) : ?>
|
||||
<div style="margin-top: 5px; padding: 5px; background: #fff;">
|
||||
<code style="font-family: monospace;">
|
||||
<?php echo esc_html($license->getLicenseKey()); ?>
|
||||
</code>
|
||||
<span style="color: #666; margin-left: 10px;">
|
||||
<?php echo esc_html($license->getDomain()); ?>
|
||||
</span>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all licenses for an order
|
||||
* Get all licenses for an order grouped by product
|
||||
*
|
||||
* @return array Array of products with their licenses
|
||||
*/
|
||||
private function getLicensesForOrder(\WC_Order $order): array
|
||||
{
|
||||
$licenses = [];
|
||||
$products = [];
|
||||
|
||||
foreach ($order->get_items() as $item) {
|
||||
$product = $item->get_product();
|
||||
if ($product && $product->is_type('licensed')) {
|
||||
$license = $this->licenseManager->getLicenseByOrderAndProduct($order->get_id(), $product->get_id());
|
||||
if ($license) {
|
||||
$licenses[] = [
|
||||
'license' => $license,
|
||||
$licenses = $this->licenseManager->getLicensesByOrderAndProduct($order->get_id(), $product->get_id());
|
||||
if (!empty($licenses)) {
|
||||
$products[] = [
|
||||
'product_name' => $product->get_name(),
|
||||
'licenses' => $licenses,
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $licenses;
|
||||
return $products;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render license info in HTML format
|
||||
*/
|
||||
private function renderHtmlLicenseInfo(array $licenses, \WC_Order $order): void
|
||||
private function renderHtmlLicenseInfo(array $products, \WC_Order $order): void
|
||||
{
|
||||
$domain = $order->get_meta('_licensed_product_domain');
|
||||
?>
|
||||
<div style="margin: 20px 0; padding: 20px; background-color: #f8f9fa; border: 1px solid #e5e5e5; border-radius: 4px;">
|
||||
<h2 style="margin-top: 0; color: #333;"><?php esc_html_e('Your License Keys', 'wc-licensed-product'); ?></h2>
|
||||
|
||||
<?php if ($domain) : ?>
|
||||
<p style="margin-bottom: 15px;">
|
||||
<strong><?php esc_html_e('Licensed Domain:', 'wc-licensed-product'); ?></strong>
|
||||
<?php echo esc_html($domain); ?>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($products as $product) : ?>
|
||||
<div style="margin-bottom: 20px;">
|
||||
<h3 style="margin: 0 0 10px 0; font-size: 1.1em; color: #333;">
|
||||
<?php echo esc_html($product['product_name']); ?>
|
||||
<span style="font-weight: normal; color: #666; font-size: 0.9em;">
|
||||
(<?php
|
||||
printf(
|
||||
esc_html(_n('%d license', '%d licenses', count($product['licenses']), 'wc-licensed-product')),
|
||||
count($product['licenses'])
|
||||
);
|
||||
?>)
|
||||
</span>
|
||||
</h3>
|
||||
|
||||
<table style="width: 100%; border-collapse: collapse;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: left; padding: 10px; border-bottom: 2px solid #ddd;"><?php esc_html_e('Product', 'wc-licensed-product'); ?></th>
|
||||
<th style="text-align: left; padding: 10px; border-bottom: 2px solid #ddd;"><?php esc_html_e('License Key', 'wc-licensed-product'); ?></th>
|
||||
<th style="text-align: left; padding: 10px; border-bottom: 2px solid #ddd;"><?php esc_html_e('Expires', 'wc-licensed-product'); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($licenses as $item) : ?>
|
||||
<tr>
|
||||
<td style="padding: 10px; border-bottom: 1px solid #eee;"><?php echo esc_html($item['product_name']); ?></td>
|
||||
<td style="padding: 10px; border-bottom: 1px solid #eee;">
|
||||
<code style="background: #fff; padding: 3px 6px; font-family: monospace;">
|
||||
<?php echo esc_html($item['license']->getLicenseKey()); ?>
|
||||
</code>
|
||||
</td>
|
||||
<td style="padding: 10px; border-bottom: 1px solid #eee;">
|
||||
<?php
|
||||
$expiresAt = $item['license']->getExpiresAt();
|
||||
echo $expiresAt
|
||||
? esc_html($expiresAt->format(get_option('date_format')))
|
||||
: esc_html__('Never', 'wc-licensed-product');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<table style="width: 100%; border-collapse: collapse; background: #fff;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: left; padding: 8px 10px; border-bottom: 2px solid #ddd; font-size: 0.9em;"><?php esc_html_e('License Key', 'wc-licensed-product'); ?></th>
|
||||
<th style="text-align: left; padding: 8px 10px; border-bottom: 2px solid #ddd; font-size: 0.9em;"><?php esc_html_e('Domain', 'wc-licensed-product'); ?></th>
|
||||
<th style="text-align: left; padding: 8px 10px; border-bottom: 2px solid #ddd; font-size: 0.9em;"><?php esc_html_e('Expires', 'wc-licensed-product'); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($product['licenses'] as $license) : ?>
|
||||
<tr>
|
||||
<td style="padding: 8px 10px; border-bottom: 1px solid #eee;">
|
||||
<code style="background: #f5f5f5; padding: 3px 6px; font-family: monospace; font-size: 0.9em;">
|
||||
<?php echo esc_html($license->getLicenseKey()); ?>
|
||||
</code>
|
||||
</td>
|
||||
<td style="padding: 8px 10px; border-bottom: 1px solid #eee;">
|
||||
<?php echo esc_html($license->getDomain()); ?>
|
||||
</td>
|
||||
<td style="padding: 8px 10px; border-bottom: 1px solid #eee;">
|
||||
<?php
|
||||
$expiresAt = $license->getExpiresAt();
|
||||
echo $expiresAt
|
||||
? esc_html($expiresAt->format(get_option('date_format')))
|
||||
: esc_html__('Never', 'wc-licensed-product');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<p style="margin-top: 15px; margin-bottom: 0; font-size: 0.9em; color: #666;">
|
||||
<?php esc_html_e('You can also view your licenses in your account under "Licenses".', 'wc-licensed-product'); ?>
|
||||
@@ -302,29 +325,33 @@ final class LicenseEmailController
|
||||
/**
|
||||
* Render license info in plain text format
|
||||
*/
|
||||
private function renderPlainTextLicenseInfo(array $licenses, \WC_Order $order): void
|
||||
private function renderPlainTextLicenseInfo(array $products, \WC_Order $order): void
|
||||
{
|
||||
$domain = $order->get_meta('_licensed_product_domain');
|
||||
|
||||
echo "\n\n";
|
||||
echo "==========================================================\n";
|
||||
echo esc_html__('YOUR LICENSE KEYS', 'wc-licensed-product') . "\n";
|
||||
echo "==========================================================\n\n";
|
||||
|
||||
if ($domain) {
|
||||
echo esc_html__('Licensed Domain:', 'wc-licensed-product') . ' ' . esc_html($domain) . "\n\n";
|
||||
}
|
||||
foreach ($products as $product) {
|
||||
echo esc_html($product['product_name']);
|
||||
echo ' (' . count($product['licenses']) . ' ' .
|
||||
_n('license', 'licenses', count($product['licenses']), 'wc-licensed-product') . ')';
|
||||
echo "\n";
|
||||
echo "-----------------------------------------------------------\n";
|
||||
|
||||
foreach ($licenses as $item) {
|
||||
echo esc_html($item['product_name']) . "\n";
|
||||
echo esc_html__('License Key:', 'wc-licensed-product') . ' ' . esc_html($item['license']->getLicenseKey()) . "\n";
|
||||
foreach ($product['licenses'] as $license) {
|
||||
echo esc_html__('License Key:', 'wc-licensed-product') . ' ';
|
||||
echo esc_html($license->getLicenseKey()) . "\n";
|
||||
echo esc_html__('Domain:', 'wc-licensed-product') . ' ';
|
||||
echo esc_html($license->getDomain()) . "\n";
|
||||
echo esc_html__('Expires:', 'wc-licensed-product') . ' ';
|
||||
|
||||
$expiresAt = $item['license']->getExpiresAt();
|
||||
echo esc_html__('Expires:', 'wc-licensed-product') . ' ';
|
||||
echo $expiresAt
|
||||
? esc_html($expiresAt->format(get_option('date_format')))
|
||||
: esc_html__('Never', 'wc-licensed-product');
|
||||
echo "\n\n";
|
||||
$expiresAt = $license->getExpiresAt();
|
||||
echo $expiresAt
|
||||
? esc_html($expiresAt->format(get_option('date_format')))
|
||||
: esc_html__('Never', 'wc-licensed-product');
|
||||
echo "\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo esc_html__('You can also view your licenses in your account under "Licenses".', 'wc-licensed-product') . "\n";
|
||||
|
||||
Reference in New Issue
Block a user