first commit

This commit is contained in:
2026-03-05 13:07:40 +01:00
commit 64ba0721ee
25709 changed files with 4691006 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
<?php
/**
* Functions for Popup Conditionals
*
* @package PUM
* @copyright Copyright (c) 2023, Code Atlantic LLC
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
/**
* Checks if the $popup is valid.
*
* @param mixed|PUM_Model_Popup $popup
*
* @return bool
*/
function pum_is_popup( $popup ) {
return pum_is_popup_object( $popup ) && $popup->is_valid();
}
/**
* Tests a given value to see if its a valid Popup model.
*
* @param PUM_Model_Popup|mixed $popup
*
* @return bool
*/
function pum_is_popup_object( $popup ) {
return is_a( $popup, 'PUM_Model_Popup' );
}
/**
* @param int $popup_id
*
* @return bool
*/
function pum_is_popup_loadable( $popup_id = null ) {
$popup = pum_get_popup( $popup_id );
if ( ! pum_is_popup_object( $popup ) ) {
return false;
}
return $popup->is_loadable();
}
/**
* Returns true if the close button should be shown.
*
* @param null|int $popup_id
*
* @return bool
*/
function pum_show_close_button( $popup_id = null ) {
$popup = pum_get_popup( $popup_id );
if ( ! pum_is_popup( $popup ) ) {
return true;
}
return $popup->show_close_button();
}

View File

@@ -0,0 +1,120 @@
<?php
/**
* Functions for Deprecated Popups
*
* @package PUM
* @copyright Copyright (c) 2023, Code Atlantic LLC
*/
/**
* Returns a popup object.
*
* @deprecated 1.7
*
* @param null $popup_id
*
* @return false|PUM_Model_Popup
*/
function pum_popup( $popup_id = null ) {
return pum_get_popup( $popup_id );
}
/**
* Returns the meta group of a popup or value if key is set.
*
* @since 1.3.0
* @deprecated 1.4
*
* @param $group
* @param int $popup_id ID number of the popup to retrieve a overlay meta for
* @param null $key
* @param null $default
*
* @return mixed array|string
*/
function popmake_get_popup_meta( $group, $popup_id = null, $key = null, $default = null ) {
if ( ! $popup_id ) {
$popup_id = pum_get_popup_id();
}
$values = get_post_meta( $popup_id, "popup_{$group}", true );
if ( ! $values ) {
$defaults = apply_filters( "popmake_popup_{$group}_defaults", [] );
$values = array_merge( $defaults, popmake_get_popup_meta_group( $group, $popup_id ) );
} else {
$values = array_merge( popmake_get_popup_meta_group( $group, $popup_id ), $values );
}
if ( $key ) {
// Check for dot notation key value.
$test = uniqid();
$value = popmake_resolve( $values, $key, $test );
if ( $value === $test ) {
$key = str_replace( '.', '_', $key );
if ( ! isset( $values[ $key ] ) ) {
$value = $default;
} else {
$value = $values[ $key ];
}
}
return apply_filters( "popmake_get_popup_{$group}_$key", $value, $popup_id );
} else {
return apply_filters( "popmake_get_popup_{$group}", $values, $popup_id );
}
}
/**
* Returns the meta group of a popup or value if key is set.
*
* @since 1.0
* @deprecated 1.3.0
*
* @param int $popup_id ID number of the popup to retrieve a overlay meta for
*
* @return mixed array|string
*/
function popmake_get_popup_meta_group( $group, $popup_id = null, $key = null, $default = null ) {
if ( ! $popup_id || 'secure_logout' === $group ) {
$popup_id = pum_get_popup_id();
}
$post_meta = get_post_custom( $popup_id );
if ( ! is_array( $post_meta ) ) {
$post_meta = [];
}
$default_check_key = 'popup_defaults_set';
if ( ! in_array( $group, [ 'auto_open', 'close', 'display', 'targeting_condition' ] ) ) {
$default_check_key = "popup_{$group}_defaults_set";
}
$group_values = array_key_exists( $default_check_key, $post_meta ) ? [] : apply_filters( "popmake_popup_{$group}_defaults", [] );
foreach ( $post_meta as $meta_key => $value ) {
if ( strpos( $meta_key, "popup_{$group}_" ) !== false ) {
$new_key = str_replace( "popup_{$group}_", '', $meta_key );
if ( count( $value ) === 1 ) {
$group_values[ $new_key ] = $value[0];
} else {
$group_values[ $new_key ] = $value;
}
}
}
if ( $key ) {
$key = str_replace( '.', '_', $key );
if ( ! isset( $group_values[ $key ] ) ) {
$value = $default;
} else {
$value = $group_values[ $key ];
}
return apply_filters( "popmake_get_popup_{$group}_$key", $value, $popup_id );
} else {
return apply_filters( "popmake_get_popup_{$group}", $group_values, $popup_id );
}
}

View File

@@ -0,0 +1,59 @@
<?php
/**
* Functions for Popup Getters
*
* @package PUM
* @copyright Copyright (c) 2023, Code Atlantic LLC
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
/**
* Return the popup id.
*
* @param int $popup_id
*
* @return int
*/
function pum_get_popup_id( $popup_id = null ) {
if ( ( is_null( $popup_id ) || 0 === $popup_id ) && pum_is_popup( pum()->current_popup ) ) {
$_popup_id = pum()->current_popup->ID;
} else {
$_popup_id = ! empty( $popup_id ) && is_numeric( $popup_id ) ? $popup_id : 0;
}
return (int) apply_filters( 'pum_get_popup_id', (int) $_popup_id, $popup_id );
}
/**
* @param int $popup_id
*
* @return string
*/
function pum_get_popup_title( $popup_id = null ) {
$popup = pum_get_popup( $popup_id );
if ( ! pum_is_popup_object( $popup ) ) {
return '';
}
return $popup->get_title();
}
/**
* @param int $popup_id
*
* @return array
* @deprecated 1.8.0
*/
function pum_get_popup_triggers( $popup_id = null ) {
$popup = pum_get_popup( $popup_id );
if ( ! pum_is_popup_object( $popup ) ) {
return [];
}
return $popup->get_triggers();
}

View File

@@ -0,0 +1,272 @@
<?php
/**
* Functions for Popup Migrations
*
* @package PUM
* @copyright Copyright (c) 2023, Code Atlantic LLC
*/
/**
* Checks if passive migration for popups should be enabled.
*
* This determines if the query load may be potentially too high to run passive migrations on live servers.
*
* @return bool
*/
function pum_passive_popup_upgrades_enabled() {
/** @var int $popup_count */
static $popup_count;
if ( defined( 'PUM_DISABLE_PASSIVE_UPGRADES' ) && PUM_DISABLE_PASSIVE_UPGRADES ) {
return false;
}
if ( ! $popup_count ) {
$popup_count = get_transient( 'pum_popup_count' );
if ( false === $popup_count ) {
$popup_count = pum_count_popups(
[
'post_status' => [ 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ],
]
);
set_transient( 'pum_popup_count', $popup_count, HOUR_IN_SECONDS * 24 );
}
}
return $popup_count > apply_filters( 'pum_passive_popups_enabled_max_count', 5 );
}
/**
* Upgrade popup data to model v3.
*
* @since 1.7.0
*
* @param $popup PUM_Model_Popup
*/
function pum_popup_migration_2( &$popup ) {
$changed = false;
$delete_meta = [];
/**
* Update pum_sub_form shortcode args
*/
if ( has_shortcode( $popup->post_content, 'pum_sub_form' ) ) {
$new_content = preg_replace( '/\[pum_sub_form(.*)provider="none"(.*)\]/', '[pum_sub_form$1 provider=""$2]', $popup->post_content );
if ( $popup->post_content !== $new_content ) {
$popup->post_content = $new_content;
$changed = true;
$popup->save( false );
}
}
$settings = $popup->get_settings();
/**
* Migrate popup theme selection.
*/
$theme = $popup->get_meta( 'popup_theme' );
if ( ! empty( $theme ) && is_numeric( $theme ) ) {
$settings['theme_id'] = absint( $theme );
$changed = true;
$delete_meta[] = 'popup_theme';
}
/**
* Migrate popup_display meta data.
*/
$display = $popup->get_meta( 'popup_display' );
if ( ! empty( $display ) && is_array( $display ) ) {
$keys = $popup->remapped_meta_settings_keys( 'display' );
// Foreach old key, save the value under popup settings for the new key.
foreach ( $keys as $old_key => $new_key ) {
if ( isset( $display[ $old_key ] ) && ! empty( $display[ $old_key ] ) ) {
$settings[ $new_key ] = $display[ $old_key ];
$changed = true;
unset( $display[ $old_key ] );
if ( in_array(
$old_key,
[
'responsive_min_width',
'responsive_max_width',
'custom_width',
'custom_height',
]
) && isset( $display[ $old_key . '_unit' ] ) ) {
$settings[ $new_key ] .= $display[ $old_key . '_unit' ];
unset( $display[ $old_key . '_unit' ] );
}
}
}
if ( empty( $display ) ) {
$delete_meta[] = 'popup_display';
} else {
// Update the saved popup display data with any remaining keys from extensions.
$popup->update_meta( 'popup_display', $display );
}
}
/**
* Migrate popup_close meta data
*/
$close = $popup->get_meta( 'popup_close' );
if ( ! empty( $close ) && is_array( $close ) ) {
$keys = $popup->remapped_meta_settings_keys( 'close' );
// Foreach old key, save the value under popup settings for the new key.
foreach ( $keys as $old_key => $new_key ) {
if ( isset( $close[ $old_key ] ) ) {
$settings[ $new_key ] = $close[ $old_key ];
$changed = true;
unset( $close[ $old_key ] );
}
}
if ( empty( $close ) ) {
$delete_meta[] = 'popup_close';
} else {
// Update the saved popup close data with any remaining keys from extensions.
$popup->update_meta( 'popup_close', $close );
}
}
/**
* Migrate triggers.
*/
$triggers = $popup->get_meta( 'popup_triggers' );
if ( ! empty( $triggers ) && is_array( $triggers ) ) {
$triggers = ! empty( $settings['triggers'] ) && is_array( $settings['triggers'] ) ? array_merge( $settings['triggers'], $triggers ) : $triggers;
foreach ( $triggers as $key => $trigger ) {
if ( isset( $trigger['settings']['cookie']['name'] ) ) {
$triggers[ $key ]['settings']['cookie_name'] = $trigger['settings']['cookie']['name'];
unset( $triggers[ $key ]['settings']['cookie'] );
}
}
$settings['triggers'] = $triggers;
$changed = true;
$delete_meta[] = 'popup_triggers';
}
/**
* Migrate cookies.
*/
$cookies = $popup->get_meta( 'popup_cookies' );
if ( ! empty( $cookies ) && is_array( $cookies ) ) {
$cookies = ! empty( $settings['cookies'] ) && is_array( $settings['cookies'] ) ? array_merge( $settings['cookies'], $cookies ) : $cookies;
$settings['cookies'] = $cookies;
$changed = true;
$delete_meta[] = 'popup_cookies';
}
/**
* Migrate conditions.
*/
$conditions = $popup->get_meta( 'popup_conditions' );
if ( ! empty( $conditions ) && is_array( $conditions ) ) {
$conditions = ! empty( $settings['conditions'] ) && is_array( $settings['conditions'] ) ? array_merge( $settings['conditions'], $conditions ) : $conditions;
foreach ( $conditions as $cg_key => $group ) {
if ( ! empty( $group ) ) {
foreach ( $group as $c_key => $condition ) {
// Clean empty conditions.
if ( ! empty( $condition['target'] ) ) {
$fixed_condition = [
'target' => $condition['target'],
'not_operand' => isset( $condition['not_operand'] ) ? (bool) $condition['not_operand'] : false,
'settings' => isset( $condition['settings'] ) ? $condition['settings'] : [],
];
foreach ( $condition as $key => $val ) {
if ( ! in_array( $key, [ 'target', 'not_operand', 'settings' ] ) ) {
$fixed_condition['settings'][ $key ] = $val;
}
}
$conditions[ $cg_key ][ $c_key ] = $fixed_condition;
} else {
unset( $conditions[ $cg_key ][ $c_key ] );
}
}
// Clean empty groups.
if ( empty( $conditions[ $cg_key ] ) ) {
unset( $conditions[ $cg_key ] );
}
}
}
$settings['conditions'] = $conditions;
$changed = true;
$delete_meta[] = 'popup_conditions';
}
/**
* Migrate popup_mobile_disabled.
*/
$mobile_disabled = $popup->get_meta( 'popup_mobile_disabled' );
if ( ! empty( $mobile_disabled ) ) {
$settings['disable_on_mobile'] = (bool) ( $mobile_disabled );
$changed = true;
$delete_meta[] = 'popup_mobile_disabled';
}
/**
* Migrate popup_tablet_disabled.
*/
$tablet_disabled = $popup->get_meta( 'popup_tablet_disabled' );
if ( ! empty( $tablet_disabled ) ) {
$settings['disable_on_tablet'] = (bool) ( $tablet_disabled );
$changed = true;
$delete_meta[] = 'popup_tablet_disabled';
}
/**
* Migrate analytics reset keys.
*/
$open_count_reset = $popup->get_meta( 'popup_open_count_reset', false );
if ( ! empty( $open_count_reset ) && is_array( $open_count_reset ) ) {
foreach ( $open_count_reset as $key => $reset ) {
if ( is_array( $reset ) ) {
add_post_meta(
$popup->ID,
'popup_count_reset',
[
'timestamp' => ! empty( $reset['timestamp'] ) ? $reset['timestamp'] : '',
'opens' => ! empty( $reset['count'] ) ? absint( $reset['count'] ) : 0,
'conversions' => 0,
]
);
}
}
$delete_meta[] = 'popup_open_count_reset';
}
/**
* Save only if something changed.
*/
if ( $changed ) {
$popup->update_meta( 'popup_settings', $settings );
}
/**
* Clean up automatically.
*/
if ( ! empty( $delete_meta ) ) {
foreach ( $delete_meta as $key ) {
$popup->delete_meta( $key );
}
}
}
add_action( 'pum_popup_passive_migration_2', 'pum_popup_migration_2' );

View File

@@ -0,0 +1,76 @@
<?php
/**
* Functions for Popup Queries
*
* @package PUM
* @copyright Copyright (c) 2023, Code Atlantic LLC
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
/**
* Get a popup model instance.
*
* @param int $popup_id
*
* @return PUM_Model_Popup
*/
function pum_get_popup( $popup_id = null ) {
if ( ( is_null( $popup_id ) || 0 === $popup_id ) && pum_is_popup( pum()->current_popup ) ) {
return pum()->current_popup;
}
/** @var int $popup_id filtered $popup_id */
$popup_id = pum_get_popup_id( $popup_id );
try {
return pum()->popups->get_item( $popup_id );
} catch ( InvalidArgumentException $e ) {
// Return empty object
return new PUM_Model_Popup( $popup_id );
}
}
/**
* Queries popups and returns them in a specific format.
*
* @param array $args
*
* @return PUM_Model_Popup[]
*/
function pum_get_popups( $args = [] ) {
return pum()->popups->get_items( $args );
}
/**
* Queries popups and returns them in a specific format.
*
* @param array $args
*
* @return PUM_Model_Popup[]
*/
function pum_get_all_popups( $args = [] ) {
$args['posts_per_page'] = -1;
return pum_get_popups( $args );
}
/**
* Gets a count popups with specified args.
*
* @param array $args
*
* @return int
*/
function pum_count_popups( $args = [] ) {
$args = wp_parse_args(
$args,
[
'post_status' => 'publish',
]
);
return pum()->popups->count_items( $args );
}

View File

@@ -0,0 +1,116 @@
<?php
/**
* Functions for Popups Template
*
* @package PUM
* @copyright Copyright (c) 2023, Code Atlantic LLC
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
/**
* Render the popup ID
*
* @param null|int|string $popup_id Popup ID.
*/
function pum_popup_ID( $popup_id = null ) {
echo pum_get_popup_id( $popup_id );
}
/**
* Render the popup title.
*
* @param null|int $popup_id Popup ID.
*/
function pum_popup_title( $popup_id = null ) {
echo esc_html( pum_get_popup_title( $popup_id ) );
}
/**
* Render the popup content.
*
* @param null|int $popup_id Popup ID.
*/
function pum_popup_content( $popup_id = null ) {
$popup = pum_get_popup( $popup_id );
if ( ! pum_is_popup( $popup ) ) {
return;
}
$cached_content = PUM_Site_Popups::get_cache_content( $popup->ID );
echo false !== $cached_content ? $cached_content : $popup->get_content();
}
/**
* Render the chose popup elements classes.
*
* @param null $popup_id Popup ID.
* @param string $element Element to get classes for.
*/
function pum_popup_classes( $popup_id = null, $element = 'overlay' ) {
$popup = pum_get_popup( $popup_id );
if ( ! pum_is_popup( $popup ) ) {
return;
}
echo esc_attr( implode( ' ', $popup->get_classes( $element ) ) );
}
/**
* Render the popups data attribute.
*
* @param null|int $popup_id Popup ID.
*/
function pum_popup_data_attr( $popup_id = null ) {
$popup = pum_get_popup( $popup_id );
if ( ! pum_is_popup( $popup ) ) {
return;
}
echo 'data-popmake="' . esc_attr( wp_json_encode( $popup->get_data_attr() ) ) . '"';
}
/**
* Render the popup's content tabindex attribute to make focusable
* if needed.
*
* @param null|int $popup_id Popup ID.
*/
function pum_popup_content_tabindex_attr( $popup_id = null ) {
$popup = pum_get_popup( $popup_id );
if ( ! pum_is_popup( $popup ) ) {
return;
}
// Greater or equal to 0 makes it focusable.
echo 'tabindex="0"';
}
/**
* Render the popup close button text.
*
* @param null|int $popup_id Popup ID.
*/
function pum_popup_close_text( $popup_id = null ) {
$popup = pum_get_popup( $popup_id );
if ( ! pum_is_popup( $popup ) ) {
return;
}
$close_text = $popup->close_text();
// If the close text is a font awesome icon (E.g. "fas fa-camera"), add the icon instead of the text.
if ( preg_match( '/^fa[srldb]?\s.+/i', $close_text ) || preg_match( '/^fa-((solid)|(regular)|(light)|(thin)|(duotone))?\sfa[-]?.+/i', $close_text ) ) {
echo '<i class="' . esc_attr( $close_text ) . '"></i>';
} else {
echo esc_html( $close_text );
}
}