← All changes
|
vendor/codeinwp/themeisle-sdk/src/Modules/About_us.php
+92
-1
4.2.8
→
trunk
View file →
| @@ -40,8 +40,42 @@ | ||
| 40 | 40 | * Promotions module for ThemeIsle SDK. |
| 41 | 41 | */ |
| 42 | 42 | class About_Us extends Abstract_Module { |
| 43 | 43 | /** |
| 44 | + * Sort weight for products that are not explicitly ranked. | |
| 45 | + * | |
| 46 | + * @var int | |
| 47 | + */ | |
| 48 | + const SORT_WEIGHT_UNRANKED = 99; | |
| 49 | + | |
| 50 | + /** | |
| 51 | + * Hand-picked display order for featured products, keyed by WP.org slug. | |
| 52 | + * | |
| 53 | + * @var array | |
| 54 | + */ | |
| 55 | + const COMMON_PRODUCTS_PRIORITY = [ | |
| 56 | + 'neve' => 0, | |
| 57 | + 'otter-blocks' => 1, | |
| 58 | + 'wp-cloudflare-page-cache' => 2, | |
| 59 | + 'optimole-wp' => 3, | |
| 60 | + 'hyve-lite' => 4, | |
| 61 | + 'wp-full-stripe-free' => 5, | |
| 62 | + 'insert-php' => 6, // Woody plugin slug on WP.org. | |
| 63 | + 'anti-spam' => 7, // Titan Anti-spam & Security plugin slug on WP.org. | |
| 64 | + ]; | |
| 65 | + | |
| 66 | + /** | |
| 67 | + * Sort weight per install status, lowest shows first. | |
| 68 | + * | |
| 69 | + * @var array | |
| 70 | + */ | |
| 71 | + const STATUS_PRIORITY = [ | |
| 72 | + 'not-installed' => 0, | |
| 73 | + 'installed' => 1, | |
| 74 | + 'active' => 2, | |
| 75 | + ]; | |
| 76 | + | |
| 77 | + /** | |
| 44 | 78 | * About data. |
| 45 | 79 | * |
| 46 | 80 | * @var array $about_data About page data, received from the filter. |
| 47 | 81 | * |
| @@ -202,8 +236,9 @@ | ||
| 202 | 236 | */ |
| 203 | 237 | private function get_about_localization_data() { |
| 204 | 238 | $links = isset( $this->about_data['page_menu'] ) ? $this->about_data['page_menu'] : []; |
| 205 | 239 | $product_pages = isset( $this->about_data['product_pages'] ) ? $this->about_data['product_pages'] : []; |
| 240 | + $page_slug = $this->get_about_page_slug(); | |
| 206 | 241 | |
| 207 | 242 | return [ |
| 208 | 243 | 'links' => $links, |
| 209 | 244 | 'logoUrl' => $this->about_data['logo'], |
| @@ -208,10 +243,19 @@ | ||
| 208 | 243 | 'links' => $links, |
| 209 | 244 | 'logoUrl' => $this->about_data['logo'], |
| 210 | 245 | 'productPages' => $this->get_product_pages_data( $product_pages ), |
| 211 | 246 | 'products' => $this->get_other_products_data(), |
| 247 | + 'services' => [ | |
| 248 | + 'websiteDesignUrl' => tsdk_utmify( 'https://themeisle.com/wordpress-website-design/', 'services-website-design', $page_slug ), | |
| 249 | + 'supportUrl' => tsdk_utmify( 'https://themeisle.com/wordpress-support/', 'services-support', $page_slug ), | |
| 250 | + 'speedUrl' => tsdk_utmify( 'https://themeisle.com/wordpress-speed-optimization/', 'services-speed-optimization', $page_slug ), | |
| 251 | + 'seoFoundationUrl' => tsdk_utmify( 'https://themeisle.com/wordpress-seo-foundation/', 'services-seo-foundation', $page_slug ), | |
| 252 | + 'maintenanceUrl' => tsdk_utmify( 'https://themeisle.com/wordpress-maintenance/', 'services-maintenance', $page_slug ), | |
| 253 | + 'hackedRepairUrl' => tsdk_utmify( 'https://themeisle.com/wordpress-hacked-site-repair/', 'services-hacked-site-repair', $page_slug ), | |
| 254 | + 'exploreAllUrl' => tsdk_utmify( 'https://themeisle.com/services/', 'services-explore-all', $page_slug ), | |
| 255 | + ], | |
| 212 | 256 | 'homeUrl' => esc_url( home_url() ), |
| 213 | - 'pageSlug' => $this->get_about_page_slug(), | |
| 257 | + 'pageSlug' => $page_slug, | |
| 214 | 258 | 'currentProduct' => [ |
| 215 | 259 | 'slug' => $this->product->get_key(), |
| 216 | 260 | 'name' => $this->product->get_name(), |
| 217 | 261 | ], |
| @@ -353,8 +397,17 @@ | ||
| 353 | 397 | ], |
| 354 | 398 | 'feedzy-rss-feeds' => [ |
| 355 | 399 | 'name' => 'Feedzy', |
| 356 | 400 | ], |
| 401 | + 'insert-php' => [ | |
| 402 | + 'name' => 'Woody Code Snippets', | |
| 403 | + ], | |
| 404 | + 'wpcf7-redirect' => [ | |
| 405 | + 'name' => 'Redirection for Contact Form 7', | |
| 406 | + ], | |
| 407 | + 'anti-spam' => [ | |
| 408 | + 'name' => 'Titan Anti-spam & Security', | |
| 409 | + ], | |
| 357 | 410 | 'woocommerce-product-addon' => [ |
| 358 | 411 | 'name' => 'PPOM', |
| 359 | 412 | 'condition' => class_exists( 'WooCommerce', false ), |
| 360 | 413 | ], |
| @@ -391,8 +444,11 @@ | ||
| 391 | 444 | ], |
| 392 | 445 | 'wp-full-stripe-free' => [ |
| 393 | 446 | 'name' => 'WP Full Pay', |
| 394 | 447 | ], |
| 448 | + 'easy-mcp-ai' => [ | |
| 449 | + 'name' => 'Easy MCP AI', | |
| 450 | + ], | |
| 395 | 451 | ]; |
| 396 | 452 | |
| 397 | 453 | foreach ( $products as $slug => $product ) { |
| 398 | 454 | if ( isset( $product['condition'] ) && ! $product['condition'] ) { |
| @@ -422,9 +478,14 @@ | ||
| 422 | 478 | $products[ $slug ]['status'] = $this->is_plugin_installed( $slug ) ? 'installed' : 'not-installed'; |
| 423 | 479 | $products[ $slug ]['status'] = $this->is_plugin_active( $slug ) ? 'active' : $products[ $slug ]['status']; |
| 424 | 480 | $products[ $slug ]['activationLink'] = $this->get_plugin_activation_link( $slug ); |
| 425 | 481 | |
| 482 | + if ( 'easy-mcp-ai' === $slug ) { | |
| 483 | + // The shared builder stamps optimole_reference_key on every non-Otter slug; carry Easy MCP attribution instead. | |
| 484 | + $products[ $slug ]['activationLink'] = add_query_arg( 'easy_mcp_reference_key', 'a-' . $this->product->get_key(), remove_query_arg( 'optimole_reference_key', $products[ $slug ]['activationLink'] ) ); | |
| 485 | + } | |
| 426 | 486 | |
| 487 | + | |
| 427 | 488 | if ( isset( $product['skip_api'] ) ) { |
| 428 | 489 | continue; |
| 429 | 490 | } |
| 430 | 491 | |
| @@ -439,9 +500,39 @@ | ||
| 439 | 500 | $products[ $slug ]['name'] = $api_data->name; |
| 440 | 501 | } |
| 441 | 502 | } |
| 442 | 503 | |
| 504 | + uksort( | |
| 505 | + $products, | |
| 506 | + function ( $left_slug, $right_slug ) use ( $products ) { | |
| 507 | + return $this->get_product_sort_key( $left_slug, $products ) | |
| 508 | + <=> $this->get_product_sort_key( $right_slug, $products ); | |
| 509 | + } | |
| 510 | + ); | |
| 511 | + | |
| 443 | 512 | return $products; |
| 513 | + } | |
| 514 | + | |
| 515 | + /** | |
| 516 | + * Build a comparable sort key tuple for a product slug. | |
| 517 | + * | |
| 518 | + * @param string $slug Product slug. | |
| 519 | + * @param array $products All products keyed by slug. | |
| 520 | + * | |
| 521 | + * @return array | |
| 522 | + */ | |
| 523 | + private function get_product_sort_key( $slug, $products ) { | |
| 524 | + $status = isset( $products[ $slug ]['status'] ) ? $products[ $slug ]['status'] : 'not-installed'; | |
| 525 | + $is_active = 'active' === $status ? 1 : 0; | |
| 526 | + $common_weight = isset( self::COMMON_PRODUCTS_PRIORITY[ $slug ] ) ? self::COMMON_PRODUCTS_PRIORITY[ $slug ] : self::SORT_WEIGHT_UNRANKED; | |
| 527 | + | |
| 528 | + // Install status only breaks ties between unranked products. | |
| 529 | + $status_weight = self::SORT_WEIGHT_UNRANKED === $common_weight | |
| 530 | + ? ( isset( self::STATUS_PRIORITY[ $status ] ) ? self::STATUS_PRIORITY[ $status ] : self::SORT_WEIGHT_UNRANKED ) | |
| 531 | + : 0; | |
| 532 | + | |
| 533 | + // Tuple order = sort precedence: active last, featured rank, status, then slug. | |
| 534 | + return array( $is_active, $common_weight, $status_weight, $slug ); | |
| 444 | 535 | } |
| 445 | 536 | |
| 446 | 537 | /** |
| 447 | 538 | * Get the page slug. |