class-license-exchange.php
2 days ago
class-license-package-installer.php
2 days ago
class-license-product-map.php
2 days ago
class-license-shop-client.php
2 days ago
class-license-site-activation.php
2 days ago
class-license.php
2 days ago
utils.php
2 days ago
class-license-product-map.php
101 lines
| 1 | <?php |
| 2 | /** |
| 3 | * Map exchange/API product names to add-on ids used in legacy license storage. |
| 4 | * |
| 5 | * @package AdvancedAds |
| 6 | * @since 2.0.9 |
| 7 | * @author Advanced Ads <info@wpadvancedads.com> |
| 8 | */ |
| 9 | |
| 10 | namespace AdvancedAds\License; |
| 11 | |
| 12 | defined( 'ABSPATH' ) || exit; |
| 13 | |
| 14 | /** |
| 15 | * Product name ↔ addon id helpers. |
| 16 | */ |
| 17 | final class License_Product_Map { |
| 18 | |
| 19 | /** |
| 20 | * Normalize a display name for comparison. |
| 21 | * |
| 22 | * @param string $name Raw name. |
| 23 | * @return string |
| 24 | */ |
| 25 | public static function normalize_name( string $name ): string { |
| 26 | $name = strtolower( trim( $name ) ); |
| 27 | return (string) preg_replace( '/\s+/', ' ', $name ); |
| 28 | } |
| 29 | |
| 30 | /** |
| 31 | * Remove site-tier suffix from a normalized product name (e.g. "advanced ads pro / 2 sites"). |
| 32 | * |
| 33 | * @param string $normalized Output of normalize_name(). |
| 34 | * @return string |
| 35 | */ |
| 36 | public static function strip_tier_suffix( string $normalized ): string { |
| 37 | $stripped = preg_replace( '#\s*/\s*\d+\s*sites?.*$#i', '', $normalized ); |
| 38 | $stripped = preg_replace( '#\s*\(\s*\d+\s*sites?\s*\).*$#i', '', (string) $stripped ); |
| 39 | |
| 40 | return trim( (string) $stripped ); |
| 41 | } |
| 42 | |
| 43 | /** |
| 44 | * Whether this product name represents an All Access–style bundle row. |
| 45 | * |
| 46 | * @param string $name From exchange payload `name`. |
| 47 | * @return bool |
| 48 | */ |
| 49 | public static function is_all_access_bundle_name( string $name ): bool { |
| 50 | $normalized = self::normalize_name( $name ); |
| 51 | |
| 52 | return '' !== $normalized && str_starts_with( $normalized, 'all access' ); |
| 53 | } |
| 54 | |
| 55 | /** |
| 56 | * Resolve addon id (e.g. "tracking") from API product name using installed add-on metadata. |
| 57 | * |
| 58 | * @param string $product_name From exchange payload `name`. |
| 59 | * @param array<string, array> $addons Output shape from Data::get_addons(). |
| 60 | * @return string|null Addon id or null if unknown / bundle row. |
| 61 | */ |
| 62 | public static function addon_id_from_product_name( string $product_name, array $addons ): ?string { |
| 63 | if ( self::is_all_access_bundle_name( $product_name ) ) { |
| 64 | return null; |
| 65 | } |
| 66 | |
| 67 | $target = self::normalize_name( $product_name ); |
| 68 | if ( '' === $target ) { |
| 69 | return null; |
| 70 | } |
| 71 | |
| 72 | $target = self::strip_tier_suffix( $target ); |
| 73 | if ( '' === $target ) { |
| 74 | return null; |
| 75 | } |
| 76 | |
| 77 | foreach ( $addons as $row ) { |
| 78 | if ( empty( $row['id'] ) || empty( $row['name'] ) ) { |
| 79 | continue; |
| 80 | } |
| 81 | |
| 82 | $addon_name = self::normalize_name( (string) $row['name'] ); |
| 83 | |
| 84 | if ( $addon_name === $target ) { |
| 85 | return (string) $row['id']; |
| 86 | } |
| 87 | |
| 88 | // API often sends "Advanced Ads Pro"; installed add-on label is "Pro". |
| 89 | if ( 'advanced ads ' . $addon_name === $target ) { |
| 90 | return (string) $row['id']; |
| 91 | } |
| 92 | |
| 93 | if ( str_ends_with( $target, ' ' . $addon_name ) ) { |
| 94 | return (string) $row['id']; |
| 95 | } |
| 96 | } |
| 97 | |
| 98 | return null; |
| 99 | } |
| 100 | } |
| 101 |