$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 '
';
foreach ( $recommended as $id => $item ) { self::card( $id, $item ); }
echo '
';
foreach ( $other as $id => $item ) { self::card( $id, $item ); }
echo '
';
}
private static function card( $id, $item ) {
echo '' . 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' ) . '';
}
}