$item ) { if ( ! is_array( $item ) || ! isset( $item[2] ) ) { continue; } if ( 'kconv-more-plugins' === $item[2] ) { $own_index = $index; } if ( 'kconv-pro-discovery' === $item[2] ) { $anchor_index = $index; } } if ( null === $own_index || null === $anchor_index || $own_index === $anchor_index + 1 ) { return; } $own_item = $items[ $own_index ]; array_splice( $items, $own_index, 1 ); if ( $own_index < $anchor_index ) { --$anchor_index; } array_splice( $items, $anchor_index + 1, 0, array( $own_item ) ); $submenu['killerconversions'] = $items; } public static function assets() { if ( ! current_user_can( 'manage_options' ) || ! KCONV_Admin_Scope::plugin( array( 'kconv-more-plugins' ) ) ) { return; } wp_enqueue_style( 'kconv-more-plugins', KCONV_URL . 'assets/more-plugins.css', array( 'kconv-admin' ), KCONV_VERSION ); } /** Bundled, reviewed content. Opening this page never contacts a catalog service. */ public static function catalog() { return array( 'clickclue' => array( 'name' => __( 'ClickClue', 'killerconversions' ), 'category' => __( 'Session replay', 'killerconversions' ), 'description' => __( 'Review consenting visitors’ recorded journeys and investigate where they get stuck.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/clickclue/', 'tone' => 'moss', 'logo' => 'clickclue.svg', 'requires_woocommerce' => false, 'recommended' => true, 'preview' => false, 'why_fit' => __( 'Review consented visits to pages containing your forms to see where people get stuck.', 'killerconversions' ), ), 'newsletterplatform' => array( 'name' => __( 'Newsletter Platform', 'killerconversions' ), 'category' => __( 'Newsletters & welcome emails', 'killerconversions' ), 'description' => __( 'Create newsletters and welcome emails in WordPress using your own mail provider.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/newsletterplatform/', 'tone' => 'sand', 'logo' => 'newsletterplatform.svg', 'requires_woocommerce' => false, 'recommended' => true, 'preview' => false, 'why_fit' => __( 'Send newsletters to people who have separately opted in to hear from you.', 'killerconversions' ), ), 'redirectnest' => array( 'name' => __( 'RedirectNest', 'killerconversions' ), 'category' => __( 'Links & navigation', 'killerconversions' ), 'description' => __( 'Manage redirects and review broken-link problems.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/redirectnest/', 'tone' => 'sand', 'logo' => 'redirectnest.svg', 'requires_woocommerce' => false, 'recommended' => true, 'preview' => false, 'why_fit' => __( 'Give visitors a useful destination when an old enquiry-page link changes.', 'killerconversions' ), ), 'antivirus' => array( 'name' => __( 'Antivirus.ai', 'killerconversions' ), 'category' => __( 'WordPress security', 'killerconversions' ), 'description' => __( 'Review local security findings and decide what to investigate or repair.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/antivirus/', 'tone' => 'moss', 'logo' => 'antivirus.svg', 'requires_woocommerce' => false, 'recommended' => false, 'preview' => false, ), 'campaignbars' => array( 'name' => __( 'CampaignBars', 'killerconversions' ), 'category' => __( 'Announcements & offers', 'killerconversions' ), 'description' => __( 'Publish targeted announcements, countdowns and copyable coupons without editing your theme.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/campaignbars/', 'tone' => 'slate', 'logo' => 'campaignbars.svg', 'requires_woocommerce' => false, 'recommended' => false, 'preview' => false, ), 'catalogfaq' => array( 'name' => __( 'Catalog FAQ', 'killerconversions' ), 'category' => __( 'Reusable answers', 'killerconversions' ), 'description' => __( 'Write answers once and reuse them across pages, products and FAQ groups.', 'killerconversions' ), 'availability' => __( 'Preview', 'killerconversions' ), 'url' => 'https://plugins.shop/catalogfaq/', 'tone' => 'lavender', 'logo' => 'catalogfaq.svg', 'requires_woocommerce' => false, 'recommended' => false, 'preview' => true, 'availability_note' => __( 'Free available · paid plans closed', 'killerconversions' ), ), 'customfields' => array( 'name' => __( 'CustomFields', 'killerconversions' ), 'category' => __( 'Structured content', 'killerconversions' ), 'description' => __( 'Structure your content with reusable fields, repeaters and display tools.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/customfields/', 'tone' => 'moss', 'logo' => 'customfields.svg', 'requires_woocommerce' => false, 'recommended' => false, 'preview' => false, ), 'logged' => array( 'name' => __( 'Logged.ai', 'killerconversions' ), 'category' => __( 'Site activity', 'killerconversions' ), 'description' => __( 'Review what changed on your WordPress website.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/logged/', 'tone' => 'slate', 'logo' => 'logged.svg', 'requires_woocommerce' => false, 'recommended' => false, 'preview' => false, ), 'tocgenius' => array( 'name' => __( 'TOC Genius', 'killerconversions' ), 'category' => __( 'Article navigation', 'killerconversions' ), 'description' => __( 'Help readers navigate long articles with clear contents and stable section links.', 'killerconversions' ), 'availability' => __( 'Preview', 'killerconversions' ), 'url' => 'https://plugins.shop/tocgenius/', 'tone' => 'slate', 'logo' => 'tocgenius.svg', 'requires_woocommerce' => false, 'recommended' => false, 'preview' => true, 'availability_note' => __( 'Free available · directory review pending', 'killerconversions' ), ), 'cartdini' => array( 'name' => __( 'Cartdini', 'killerconversions' ), 'category' => __( 'Checkout fields', 'killerconversions' ), 'description' => __( 'Ask checkout questions and keep the answers with each order.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/cartdini/', 'tone' => 'moss', 'logo' => 'cartdini.svg', 'requires_woocommerce' => true, 'recommended' => false, 'preview' => false, ), 'frictions' => array( 'name' => __( 'Frictions', 'killerconversions' ), 'category' => __( 'Checkout investigations', 'killerconversions' ), 'description' => __( 'Investigate WooCommerce checkout errors with privacy-conscious replay.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/frictions/', 'tone' => 'sand', 'logo' => 'frictions.svg', 'requires_woocommerce' => true, 'recommended' => false, 'preview' => false, ), 'orderfloor' => array( 'name' => __( 'OrderFloor', 'killerconversions' ), 'category' => __( 'Order rules', 'killerconversions' ), 'description' => __( 'Set order minimums, quantity limits and pack sizes.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/orderfloor/', 'tone' => 'sand', 'logo' => 'orderfloor.svg', 'requires_woocommerce' => true, 'recommended' => false, 'preview' => false, ), 'orderworth' => array( 'name' => __( 'OrderWorth', 'killerconversions' ), 'category' => __( 'Costs & contribution', 'killerconversions' ), 'description' => __( 'Review order contribution after recorded costs, expenses and refunds.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/orderworth/', 'tone' => 'slate', 'logo' => 'orderworth.svg', 'requires_woocommerce' => true, 'recommended' => false, 'preview' => false, ), 'stockcontrols' => array( 'name' => __( 'StockControls', 'killerconversions' ), 'category' => __( 'Inventory & purchasing', 'killerconversions' ), 'description' => __( 'Review stock changes, receive purchase orders and plan replenishment.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/stockcontrols/', 'tone' => 'moss', 'logo' => 'stockcontrols.svg', 'requires_woocommerce' => true, 'recommended' => false, 'preview' => false, ), 'wakemycart' => array( 'name' => __( 'WakeMyCart', 'killerconversions' ), 'category' => __( 'Cart follow-up', 'killerconversions' ), 'description' => __( 'Remind consenting shoppers about unfinished carts.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/wakemycart/', 'tone' => 'lavender', 'logo' => 'wakemycart.svg', 'requires_woocommerce' => true, 'recommended' => false, 'preview' => false, ), 'wishlistgenius' => array( 'name' => __( 'WishlistGenius', 'killerconversions' ), 'category' => __( 'Wishlists & saved products', 'killerconversions' ), 'description' => __( 'Let shoppers save products, share a wishlist and return when they are ready.', 'killerconversions' ), 'availability' => __( 'Free edition available', 'killerconversions' ), 'url' => 'https://plugins.shop/wishlistgenius/', 'tone' => 'slate', 'logo' => 'wishlistgenius.svg', 'requires_woocommerce' => true, 'recommended' => false, 'preview' => false, ), ); } public static function screen() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'Site administrator access is required.', 'killerconversions' ), '', array( 'response' => 403 ) ); } $catalog = self::catalog(); $recommended = array_filter( $catalog, static function( $item ) { return $item['recommended']; } ); $other = array_diff_key( $catalog, $recommended ); echo '
'; KCONV_Admin::navigation( 'more' ); echo '

' . esc_html__( 'The Plugins.shop collection', 'killerconversions' ) . '

' . esc_html__( 'More from Plugins.shop', 'killerconversions' ) . '

'; /* translators: %s: number of other plugins in the bundled collection. */ echo esc_html( sprintf( _n( 'Explore %s other plugin, with useful companions first.', 'Explore all %s other plugins, with useful companions first.', count( $catalog ), 'killerconversions' ), number_format_i18n( count( $catalog ) ) ) ); echo '

' . esc_html__( 'Visit Plugins.shop', 'killerconversions' ) . ' ' . esc_html__( ' (opens in a new tab)', 'killerconversions' ) . '
'; echo '

' . esc_html__( 'Useful alongside KillerConversions', 'killerconversions' ) . '

' . esc_html__( 'For understanding visits, permission-based newsletters and useful links.', 'killerconversions' ) . '

'; foreach ( $recommended as $id => $item ) { self::card( $id, $item ); } echo '

' . esc_html__( 'Explore more tools', 'killerconversions' ) . '

' . esc_html__( 'For the other jobs your website needs to do.', 'killerconversions' ) . '

'; /* translators: %s: number of additional plugins after the recommended companions. */ echo esc_html( sprintf( _n( '%s more plugin', '%s more plugins', count( $other ), 'killerconversions' ), number_format_i18n( count( $other ) ) ) ); echo '
'; foreach ( $other as $id => $item ) { self::card( $id, $item ); } echo '
'; } private static function card( $id, $item ) { echo '

' . esc_html( $item['name'] ) . '

' . esc_html( $item['category'] ) . '

' . esc_html( $item['description'] ) . '

'; if ( isset( $item['why_fit'] ) ) { echo '

' . esc_html__( 'Why it fits', 'killerconversions' ) . '

' . esc_html( $item['why_fit'] ) . '

'; } echo '
' . ( $item['preview'] ? '' : ' ' ) . esc_html( $item['availability'] ) . ''; if ( $item['requires_woocommerce'] ) { echo '' . esc_html__( 'Requires WooCommerce', 'killerconversions' ) . ''; } if ( isset( $item['availability_note'] ) ) { echo '' . esc_html( $item['availability_note'] ) . ''; } echo '
' . esc_html__( 'Explore plugin', 'killerconversions' ) . '' . esc_html( ': ' . $item['name'] ) . '' . esc_html__( ' (opens in a new tab)', 'killerconversions' ) . '
'; } }