File: /var/www/html/portal.sumar.com.py/wp-content/plugins/popup-maker/classes/Upsell.php
<?php
/**
* Class for Upsell
*
* @package PopupMaker
* @copyright Copyright (c) 2024, Code Atlantic LLC
*/
use function PopupMaker\plugin;
/**
* Handles displaying promotional text throughout plugin UI
*/
class PUM_Upsell {
/**
* Hooks any needed methods
*/
public static function init() {
add_filter( 'views_edit-popup', [ __CLASS__, 'addon_tabs' ], 10, 1 );
add_filter( 'views_edit-popup_theme', [ __CLASS__, 'addon_tabs' ], 10, 1 );
add_filter( 'pum_popup_settings_fields', [ __CLASS__, 'popup_promotional_fields' ] );
add_filter( 'pum_theme_settings_fields', [ __CLASS__, 'theme_promotional_fields' ] );
add_action( 'in_admin_header', [ __CLASS__, 'notice_bar_display' ] );
}
/**
* Adds a small notice bar in PM admin areas when not using any extensions
*
* @since 1.14.0
*/
public static function notice_bar_display() {
if ( pum_is_admin_page() ) {
// Temporarily disable for CTA post type screens.
if ( isset( $_GET['page'] ) && 'popup-maker-call-to-actions' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
return;
}
// Disable it on post.php edit screens for popup editor & popup theme editor. post.php?post=850&action=edit | post-new.php?post_type=popup
$screen = get_current_screen();
if ( 'post' === $screen->base && ( 'popup' === $screen->post_type || 'popup_theme' === $screen->post_type ) ) {
return;
}
// Generate appropriate upsell message.
$message = self::generate_upgrade_message();
if ( empty( $message ) ) {
return;
}
wp_enqueue_style( 'pum-admin-general' );
?>
<div class="pum-notice-bar-wrapper">
<div class="pum-notice-bar">
<span class="pum-notice-bar-message">
<?php
echo wp_kses(
$message,
[
'a' => [
'href' => [],
'rel' => [],
'target' => [],
],
]
);
?>
</span>
</div>
</div>
<?php
}
}
/**
* Detect installed plugins that can be integrated with Popup Maker.
*
* @return array<string, array<string, string[]>>
*/
private static function detect_integrations() {
$detection_map = [
// Pro+ integrations (from Pro to Pro+).
'pro_plus' => [
'ecommerce' => [
'WooCommerce' => class_exists( 'WooCommerce' ),
'Easy Digital Downloads' => class_exists( 'Easy_Digital_Downloads' ),
],
'lms' => [
'LifterLMS' => class_exists( 'LifterLMS' ),
],
],
// Pro integrations (from Free to Pro).
'pro' => [
'crm' => [
'FluentCRM' => defined( 'FLUENTCRM' ),
],
],
];
$integrations = [
'pro_plus' => [
'ecommerce' => [],
'lms' => [],
],
'pro' => [
'crm' => [],
],
];
foreach ( $detection_map as $tier => $categories ) {
foreach ( $categories as $category => $plugins ) {
foreach ( $plugins as $label => $is_detected ) {
if ( $is_detected ) {
$integrations[ $tier ][ $category ][] = $label;
}
}
}
}
// Remove empty categories.
foreach ( $integrations as $tier => $categories ) {
$integrations[ $tier ] = array_filter( $categories );
}
return array_filter( $integrations );
}
/**
* Generate appropriate upgrade message based on current license and plugin status.
*
* @return string Upgrade message or empty string if no message should be shown.
*/
private static function generate_upgrade_message() {
$license_service = \PopupMaker\plugin( 'license' );
$license_tier = $license_service->get_license_tier();
$license_status = $license_service->get_license_status();
$pro_is_active = \PopupMaker\plugin()->is_pro_active();
$active_extensions = pum_enabled_extensions();
$has_active_add_ons = ! empty( $active_extensions );
/**
* 1. Pro Plus users with valid license see nothing.
* 2. Pro users with valid license get targeted integration messaging.
* 3. Pro users with invalid license get general upgrade messaging.
* 4. Free users or users with invalid license get general upgrade messaging.
* 5. Extension users get no message for now.
* 6. Extension users without valid license get no message for now.
*/
// 1. Pro Plus users with valid license see nothing.
if ( 'valid' === $license_status && 'pro_plus' === $license_tier ) {
return '';
}
// 2. Pro users with valid license get targeted integration messaging.
if ( 'valid' === $license_status && 'pro' === $license_tier ) {
return self::get_pro_integration_message();
}
// 3. Pro users with invalid license get general upgrade messaging.
if ( $pro_is_active && 'valid' !== $license_status ) {
return self::get_free_upgrade_message();
}
// 4. Free users get general upgrade messaging.
if ( ! $pro_is_active && ! $has_active_add_ons ) {
return self::get_free_upgrade_message();
}
// 5 & 6. Extension users get no message for now (regardless of license status).
if ( $has_active_add_ons ) {
return '';
}
// Fallback (should not reach here).
return '';
}
/**
* Generate targeted upgrade messages based on detected integrations.
*
* @param string $user_tier Current user tier ('free', 'pro', 'pro_plus').
* @return string Targeted upgrade message or empty string.
*/
private static function get_integration_messages( $user_tier ) {
$upgrade_link = admin_url( 'edit.php?post_type=popup&page=pum-settings#go-pro' );
$integrations = self::detect_integrations();
$messages = [];
// For Pro users, show Pro+ integration opportunities.
if ( in_array( $user_tier, [ 'free', 'pro' ], true ) && ! empty( $integrations['pro_plus'] ) ) {
foreach ( $integrations['pro_plus'] as $category => $platforms ) {
if ( ! empty( $platforms ) ) {
$platform_list = self::format_integration_list( $platforms );
switch ( $category ) {
case 'ecommerce':
$messages[] = sprintf(
/* translators: 1: Detected ecommerce platforms, 2: Opening link tag, 3: Closing link tag. */
esc_html__( 'Automate %1$s campaigns with %2$sPopup Maker Pro+ Ecommerce%3$s - unlock cart actions, revenue attribution, and precision targeting.', 'popup-maker' ),
$platform_list,
'<a href="' . esc_url( $upgrade_link ) . '">',
'</a>'
);
break;
case 'lms':
$messages[] = sprintf(
/* translators: 1: Detected LMS platforms, 2: Opening link tag, 3: Closing link tag. */
esc_html__( 'Deliver targeted funnels for %1$s with %2$sPopup Maker Pro+ LMS%3$s - track enrollments, issue rewards, and automate course journeys.', 'popup-maker' ),
$platform_list,
'<a href="' . esc_url( $upgrade_link ) . '">',
'</a>'
);
break;
}
}
}
}
// For Free users, show Pro integration opportunities.
if ( 'free' === $user_tier && ! empty( $integrations['pro'] ) ) {
foreach ( $integrations['pro'] as $category => $platforms ) {
if ( ! empty( $platforms ) ) {
$platform_list = self::format_integration_list( $platforms );
switch ( $category ) {
case 'crm':
$messages[] = sprintf(
/* translators: 1: Detected CRM platforms, 2: Opening link tag, 3: Closing link tag. */
esc_html__( 'Unlock %1$s integration with %2$sPopup Maker Pro%3$s - connect popups to your CRM workflows and automate lead capture.', 'popup-maker' ),
$platform_list,
'<a href="' . esc_url( $upgrade_link ) . '">',
'</a>'
);
break;
}
}
}
}
// Randomly select one message if available.
if ( ! empty( $messages ) ) {
$random_index = array_rand( $messages );
return $messages[ $random_index ];
}
return '';
}
/**
* Get upgrade message for Pro users based on detected integrations.
*
* @return string Targeted upgrade message.
*/
private static function get_pro_integration_message() {
$integration_message = self::get_integration_messages( 'pro' );
if ( ! empty( $integration_message ) ) {
return $integration_message;
}
// Generic Pro+ upgrade message fallback.
$upgrade_link = admin_url( 'edit.php?post_type=popup&page=pum-settings#go-pro' );
return sprintf(
/* translators: %s - Wraps ending in link to pro settings page. */
esc_html__( 'Level up with %1$sPopup Maker Pro+%2$s - unlock ecommerce automation, revenue attribution, and enhanced targeting.', 'popup-maker' ),
'<a href="' . esc_url( $upgrade_link ) . '">',
'</a>'
);
}
/**
* Get upgrade message for free users.
*
* @return string General upgrade message.
*/
private static function get_free_upgrade_message() {
// Try to get an integration-specific message first.
$integration_message = self::get_integration_messages( 'free' );
if ( ! empty( $integration_message ) ) {
return $integration_message;
}
// Generic upgrade message fallback.
$upgrade_link = admin_url( 'edit.php?post_type=popup&page=pum-settings#go-pro' );
return sprintf(
/* translators: %s - Wraps ending in link to pro settings page. */
esc_html__( 'Unlock advanced features with %1$sPopup Maker Pro & Pro+%2$s - Enhanced targeting, revenue tracking, live analytics, and more.', 'popup-maker' ),
'<a href="' . esc_url( $upgrade_link ) . '">',
'</a>'
);
}
/**
* Convert detected platform names into a readable list.
*
* @param string[] $items List of platform names.
* @return string
*/
private static function format_integration_list( array $items ) {
$items = array_values( array_filter( $items ) );
if ( empty( $items ) ) {
return '';
}
if ( function_exists( 'wp_sprintf_l' ) ) {
return wp_sprintf_l( '%l', $items );
}
$count = count( $items );
if ( 1 === $count ) {
return $items[0];
}
$last = array_pop( $items );
return sprintf(
/* translators: 1: List of platforms, 2: Last platform. */
esc_html__( '%1$s and %2$s', 'popup-maker' ),
implode( esc_html__( ', ', 'popup-maker' ), $items ),
$last
);
}
/**
* Adds messages throughout Popup Settings UI
*
* @param array $tabs The tabs/fields for popup settings.
* @return array
*/
public static function popup_promotional_fields( $tabs = [] ) {
if ( ! pum_extension_enabled( 'forced-interaction' ) && ! pum_extension_enabled( 'pro' ) ) {
/* translators: %s url to product page. */
$message = sprintf( __( 'Want to disable the close button? Check out <a href="%s" target="_blank">Popup Maker Pro</a>!', 'popup-maker' ), 'https://wppopupmaker.com/pricing/?utm_source=plugin-theme-editor&utm_medium=text-link&utm_campaign=upsell&utm_content=close-button-settings' );
// TODO Rewrite this for PM Pro instead of extension.
$promotion = [
'type' => 'html',
'content' => '<img src="' . pum_asset_url( 'images/upsell-icon-forced-interaction.png' ) . '" />' . $message,
'priority' => 999,
'class' => 'pum-upgrade-tip',
];
$tabs['close']['button']['fi_promotion'] = $promotion;
$tabs['close']['forms']['fi_promotion'] = $promotion;
$tabs['close']['alternate_methods']['fi_promotion'] = $promotion;
}
if ( ! pum_extension_enabled( 'advanced-targeting-conditions' ) ) {
/* translators: %s url to product page. */
$message = sprintf( __( 'Need more <a href="%s" target="_blank">advanced targeting</a> options?', 'popup-maker' ), 'https://wppopupmaker.com/extensions/advanced-targeting-conditions/?utm_campaign=upsell&utm_source=plugin-popup-editor&utm_medium=text-link&utm_content=conditions-editor' );
$tabs['targeting']['main']['atc_promotion'] = [
'type' => 'html',
'content' => '<img class="pum-upgrade-icon" src="' . pum_asset_url( 'images/mark.svg' ) . '" />' . $message,
'priority' => 999,
'class' => 'pum-upgrade-tip',
];
}
return $tabs;
}
/**
* Adds messages throughout Popup Theme UI
*
* @param array $tabs The tabs/fields for popup theme.
* @return array
*/
public static function theme_promotional_fields( $tabs = [] ) {
if ( ! pum_extension_enabled( 'advanced-theme-builder' ) && ! class_exists( 'PUM_ATB' ) ) {
foreach ( [ 'overlay', 'container', 'close' ] as $tab ) {
/* translators: %s url to product page. */
$message = __( 'Want to use <a href="%s" target="_blank">background images</a>?', 'popup-maker' );
$tabs[ $tab ]['background']['atc_promotion'] = [
'type' => 'html',
'content' => '<img src="' . pum_asset_url( 'images/upsell-icon-advanted-theme-builder.png' ) . '" height="28" />' . sprintf( $message, 'https://wppopupmaker.com/extensions/advanced-theme-builder/?utm_campaign=upsell&utm_source=plugin-theme-editor&utm_medium=text-link&utm_content=' . $tab . '-settings' ),
'priority' => 999,
'class' => 'pum-upgrade-tip',
];
}
}
return $tabs;
}
/**
* When the Popup or Popup Theme list table loads, call the function to view our tabs.
*
* @since 1.8.0
* @param array $views An array of available list table views.
* @return mixed
*/
public static function addon_tabs( $views ) {
self::display_addon_tabs();
return $views;
}
/**
* Displays the tabs for 'Popups', 'Popup Themes' and 'Extensions and Integrations'
*
* @since 1.8.0
*/
public static function display_addon_tabs() {
// Get labels for the Popup and Popup Theme post types.
$popup_labels = (array) get_post_type_labels( get_post_type_object( plugin( 'PostTypes' )->get_type_key( 'popup' ) ) );
$theme_labels = (array) get_post_type_labels( get_post_type_object( plugin( 'PostTypes' )->get_type_key( 'popup_theme' ) ) );
?>
<style>
.wrap h1.wp-heading-inline + a.page-title-action {
display: none;
}
.edit-php.post-type-popup .wrap .nav-tab-wrapper .page-title-action, .edit-php.post-type-popup_theme .wrap .nav-tab-wrapper .page-title-action, .popup_page_pum-extensions .wrap .nav-tab-wrapper .page-title-action {
top: 7px;
margin-left: 5px
}
@media only screen and (min-width: 0px) and (max-width: 783px) {
.edit-php.post-type-popup .wrap .nav-tab-wrapper .page-title-action, .edit-php.post-type-popup_theme .wrap .nav-tab-wrapper .page-title-action, .popup_page_pum-extensions .wrap .nav-tab-wrapper .page-title-action {
display: none !important
}
}
</style>
<nav class="nav-tab-wrapper">
<?php
// Default upgrade tab configuration.
$upgrade_tab = [
'name' => esc_html__( 'Go Pro', 'popup-maker' ),
'url' => admin_url( 'edit.php?post_type=popup&page=pum-settings#go-pro' ),
'class' => 'pum-upgrade-tab pum-upgrade-tab-pro',
];
// Adjust based on license status.
try {
$license_service = \PopupMaker\plugin( 'license' );
$license_status = $license_service->get_license_status();
$license_tier = $license_service->get_license_tier();
if ( 'valid' === $license_status ) {
if ( 'pro_plus' === $license_tier ) {
$upgrade_tab = null; // Pro Plus - hide upgrade tab.
} elseif ( 'pro' === $license_tier ) {
$upgrade_tab['name'] = esc_html__( 'Go Pro+', 'popup-maker' );
$upgrade_tab['class'] = 'pum-upgrade-tab pum-upgrade-tab-pro-plus';
}
}
} catch ( \Exception $e ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch
// Use default configuration if license service unavailable.
unset( $e ); // Prevent unused variable warning.
}
$tabs = [
'popups' => [
'name' => esc_html( $popup_labels['name'] ),
'url' => admin_url( 'edit.php?post_type=popup' ),
],
'themes' => [
'name' => esc_html( $theme_labels['name'] ),
'url' => admin_url( 'edit.php?post_type=popup_theme' ),
],
];
// Only add upgrade tab if not Pro Plus.
if ( $upgrade_tab ) {
$tabs['integrations'] = $upgrade_tab;
}
$tabs = apply_filters( 'pum_add_ons_tabs', $tabs );
$active_tab = false;
// Calculate which tab is currently active.
// phpcs:disable WordPress.Security.NonceVerification.Recommended
if ( isset( $_GET['page'] ) && 'pum-extensions' === $_GET['page'] ) {
$active_tab = 'integrations';
} elseif ( ! isset( $_GET['page'] ) && isset( $_GET['post_type'] ) ) {
switch ( $_GET['post_type'] ) {
case 'popup':
$active_tab = 'popups';
break;
case 'popup_theme':
$active_tab = 'themes';
break;
}
}
// phpcs:enable WordPress.Security.NonceVerification.Recommended
// Add each tab, marking the current one as active.
foreach ( $tabs as $tab_id => $tab ) {
$active = $active_tab === $tab_id ? ' nav-tab-active' : '';
$extra_class = isset( $tab['class'] ) ? ' ' . esc_attr( $tab['class'] ) : '';
?>
<a href="<?php echo esc_url( $tab['url'] ); ?>" class="nav-tab<?php echo esc_attr( $active . $extra_class ); ?>">
<?php echo esc_html( $tab['name'] ); ?>
</a>
<?php
}
?>
<a href="<?php echo esc_url( admin_url( 'post-new.php?post_type=popup' ) ); ?>" class="page-title-action">
<?php echo esc_html( $popup_labels['add_new_item'] ); ?>
</a>
<a href="<?php echo esc_url( admin_url( 'post-new.php?post_type=popup_theme' ) ); ?>" class="page-title-action">
<?php echo esc_html( $theme_labels['add_new_item'] ); ?>
</a>
</nav>
<?php
}
}