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:
@@ -10,6 +10,7 @@ declare(strict_types=1);
|
||||
namespace Jeremias\WcLicensedProduct\Checkout;
|
||||
|
||||
use Automattic\WooCommerce\Blocks\Integrations\IntegrationInterface;
|
||||
use Jeremias\WcLicensedProduct\Admin\SettingsController;
|
||||
|
||||
/**
|
||||
* Integration with WooCommerce Checkout Blocks
|
||||
@@ -30,7 +31,7 @@ final class CheckoutBlocksIntegration implements IntegrationInterface
|
||||
public function initialize(): void
|
||||
{
|
||||
$this->registerScripts();
|
||||
$this->registerBlockExtensionData();
|
||||
$this->registerAdditionalCheckoutFields();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -45,7 +46,7 @@ final class CheckoutBlocksIntegration implements IntegrationInterface
|
||||
wp_register_script(
|
||||
'wc-licensed-product-checkout-blocks',
|
||||
$scriptUrl,
|
||||
['wc-blocks-checkout', 'wp-element', 'wp-components', 'wp-i18n'],
|
||||
['wc-blocks-checkout', 'wp-element', 'wp-components', 'wp-i18n', 'wp-plugins', 'wp-data'],
|
||||
WC_LICENSED_PRODUCT_VERSION,
|
||||
true
|
||||
);
|
||||
@@ -59,20 +60,33 @@ final class CheckoutBlocksIntegration implements IntegrationInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* Register block extension data
|
||||
* Register additional checkout fields using WooCommerce Blocks API
|
||||
*/
|
||||
private function registerBlockExtensionData(): void
|
||||
private function registerAdditionalCheckoutFields(): void
|
||||
{
|
||||
// Pass data to the checkout block script
|
||||
add_filter(
|
||||
'woocommerce_blocks_checkout_block_registration_data',
|
||||
function (array $data): array {
|
||||
$data['wc-licensed-product'] = [
|
||||
'hasLicensedProducts' => $this->cartHasLicensedProducts(),
|
||||
];
|
||||
return $data;
|
||||
add_action('woocommerce_blocks_loaded', function (): void {
|
||||
// Check if the function exists (WooCommerce 8.9+)
|
||||
if (!function_exists('woocommerce_register_additional_checkout_field')) {
|
||||
return;
|
||||
}
|
||||
);
|
||||
|
||||
// Register the domain field using WooCommerce's checkout fields API
|
||||
// For single domain mode only (multi-domain uses custom JS component)
|
||||
if (!SettingsController::isMultiDomainEnabled()) {
|
||||
woocommerce_register_additional_checkout_field([
|
||||
'id' => 'wc-licensed-product/domain',
|
||||
'label' => __('License Domain', 'wc-licensed-product'),
|
||||
'location' => 'order',
|
||||
'type' => 'text',
|
||||
'required' => false,
|
||||
'attributes' => [
|
||||
'placeholder' => __('example.com', 'wc-licensed-product'),
|
||||
'pattern' => '^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$',
|
||||
'title' => __('Enter a valid domain (without http:// or www)', 'wc-licensed-product'),
|
||||
],
|
||||
]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -96,13 +110,23 @@ final class CheckoutBlocksIntegration implements IntegrationInterface
|
||||
*/
|
||||
public function get_script_data(): array
|
||||
{
|
||||
$isMultiDomain = SettingsController::isMultiDomainEnabled();
|
||||
|
||||
return [
|
||||
'hasLicensedProducts' => $this->cartHasLicensedProducts(),
|
||||
'fieldLabel' => __('Domain for License Activation', 'wc-licensed-product'),
|
||||
'licensedProducts' => $this->getLicensedProductsFromCart(),
|
||||
'isMultiDomainEnabled' => $isMultiDomain,
|
||||
'fieldPlaceholder' => __('example.com', 'wc-licensed-product'),
|
||||
'fieldDescription' => __('Enter the domain where you will use this license (without http:// or www).', 'wc-licensed-product'),
|
||||
'sectionTitle' => __('License Domain', 'wc-licensed-product'),
|
||||
'validationError' => __('Please enter a valid domain for your license activation.', 'wc-licensed-product'),
|
||||
'fieldDescription' => $isMultiDomain
|
||||
? __('Enter a unique domain for each license (without http:// or www).', 'wc-licensed-product')
|
||||
: __('Enter the domain where you will use the license (without http:// or www).', 'wc-licensed-product'),
|
||||
'sectionTitle' => $isMultiDomain
|
||||
? __('License Domains', 'wc-licensed-product')
|
||||
: __('License Domain', 'wc-licensed-product'),
|
||||
'validationError' => __('Please enter a valid domain.', 'wc-licensed-product'),
|
||||
'duplicateError' => __('Each license requires a unique domain.', 'wc-licensed-product'),
|
||||
'licenseLabel' => __('License %d:', 'wc-licensed-product'),
|
||||
'singleDomainLabel' => __('Domain', 'wc-licensed-product'),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -110,18 +134,34 @@ final class CheckoutBlocksIntegration implements IntegrationInterface
|
||||
* Check if cart contains licensed products
|
||||
*/
|
||||
private function cartHasLicensedProducts(): bool
|
||||
{
|
||||
return !empty($this->getLicensedProductsFromCart());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get licensed products from cart with quantities
|
||||
*
|
||||
* @return array<int, array{product_id: int, name: string, quantity: int}>
|
||||
*/
|
||||
private function getLicensedProductsFromCart(): array
|
||||
{
|
||||
if (!WC()->cart) {
|
||||
return false;
|
||||
return [];
|
||||
}
|
||||
|
||||
$licensedProducts = [];
|
||||
foreach (WC()->cart->get_cart() as $cartItem) {
|
||||
$product = $cartItem['data'];
|
||||
if ($product && $product->is_type('licensed')) {
|
||||
return true;
|
||||
$productId = $product->get_id();
|
||||
$licensedProducts[] = [
|
||||
'product_id' => $productId,
|
||||
'name' => $product->get_name(),
|
||||
'quantity' => (int) $cartItem['quantity'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return $licensedProducts;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user