: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Class for Admin Templates
* @copyright Copyright (c) 2023, Code Atlantic LLC
if ( ! defined( 'ABSPATH' ) ) {
* Class PUM_Admin_Templates
class PUM_Admin_Templates {
public static function init() {
if ( did_action( 'admin_footer' ) || doing_action( 'admin_footer' ) ) {
add_action( 'admin_footer', [ __CLASS__, 'render' ] );
public static function render() {
self::conditions_editor();
if ( class_exists( 'PUM_MCI' ) && version_compare( PUM_MCI::$VER, '1.3.0', '<' ) ) {
<script type="text/html" id="tmpl-pum-field-mc_api_key">
<# var valid = data.value !== '' && <?php echo PUM_Utils_Array::safe_json_encode( pum_get_option( 'mci_api_key_is_valid', false ) ); ?>; #>
<input type="{{valid ? 'password' : 'text'}}" placeholder="{{data.placeholder}}" class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<button type="button" class="pum-mci-check-api-key">
<?php _e( 'Check', 'popup-maker' ); ?>
<i class="dashicons dashicons-{{valid ? 'yes' : 'no'}}" style="display: {{valid ? 'inline-block' : 'none'}};"></i>
<?php wp_nonce_field( 'pum-mci-check-api-key', null ); ?>
public static function general_fields() {
<script type="text/html" id="tmpl-pum-field-text">
<input type="text" placeholder="{{data.placeholder}}" class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<script type="text/html" id="tmpl-pum-field-password">
<input type="password" placeholder="{{data.placeholder}}" class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<script type="text/html" id="tmpl-pum-field-select">
<select id="{{data.id}}" name="{{data.name}}" data-allow-clear="true" {{{data.meta}}}>
<# _.each(data.options, function(option, key) {
if (option.options !== undefined && option.options.length) { #>
<optgroup label="{{option.label}}">
<# _.each(option.options, function(option, key) { #>
<option value="{{option.value}}" {{{option.meta}}}>{{option.label}}</option>
<option value="{{option.value}}" {{{option.meta}}}>{{option.label}}</option>
<script type="text/html" id="tmpl-pum-field-radio">
<ul class="pum-field-radio-list">
<# _.each(data.options, function(option, key) { #>
<# print(option.value === data.value ? 'class="pum-selected"' : ''); #>>
<input type="radio" id="{{data.id}}_{{key}}" name="{{data.name}}" value="{{option.value}}" {{{option.meta}}}/>
<label for="{{data.id}}_{{key}}">{{option.label}}</label>
<script type="text/html" id="tmpl-pum-field-checkbox">
<input type="checkbox" id="{{data.id}}" name="{{data.name}}" value="1" {{{data.meta}}}/>
<script type="text/html" id="tmpl-pum-field-multicheck">
<ul class="pum-field-mulitcheck-list">
<# _.each(data.options, function(option, key) { #>
<input type="checkbox" id="{{data.id}}_{{key}}" name="{{data.name}}[{{option.value}}]" value="{{option.value}}" {{{option.meta}}}/>
<label for="{{data.id}}_{{key}}">{{{option.label}}}</label>
<script type="text/html" id="tmpl-pum-field-textarea">
<textarea name="{{data.name}}" id="{{data.id}}" class="{{data.size}}-text" {{{data.meta}}}>{{data.value}}</textarea>
<script type="text/html" id="tmpl-pum-field-hidden">
<input type="hidden" class="{{data.classes}}" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
public static function html5_fields() {
<script type="text/html" id="tmpl-pum-field-range">
<input type="range" placeholder="{{data.placeholder}}" class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<script type="text/html" id="tmpl-pum-field-search">
<input type="search" placeholder="{{data.placeholder}}" class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<script type="text/html" id="tmpl-pum-field-number">
<input type="number" placeholder="{{data.placeholder}}" class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<script type="text/html" id="tmpl-pum-field-email">
<input type="email" placeholder="{{data.placeholder}}" class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<script type="text/html" id="tmpl-pum-field-url">
<input type="url" placeholder="{{data.placeholder}}" class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<script type="text/html" id="tmpl-pum-field-tel">
<input type="tel" placeholder="{{data.placeholder}}" class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
public static function custom_fields() {
<script type="text/html" id="tmpl-pum-field-editor">
<textarea name="{{data.name}}" id="{{data.id}}" class="pum-wpeditor {{data.size}}-text" {{{data.meta}}}>{{data.value}}</textarea>
<script type="text/html" id="tmpl-pum-field-link">
<button type="button" class="dashicons dashicons-admin-generic button"></button>
<input type="text" placeholder="{{data.placeholder}}" class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<script type="text/html" id="tmpl-pum-field-rangeslider">
<input type="text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" class="pum-range-manual" {{{data.meta}}}/>
<span class="pum-range-value-unit regular-text">{{data.unit}}</span>
<script type="text/html" id="tmpl-pum-field-color">
<input type="text" class="pum-color-picker color-picker" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" data-default-color="{{data.std}}" {{{data.meta}}}/>
<script type="text/html" id="tmpl-pum-field-measure">
<input type="number" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" size="5" {{{data.meta}}}/>
<select id="{{data.id}}_unit" name="<# print(data.name.replace(data.id, data.id + '_unit')); #>">
<# _.each(data.units, function(option, key) { #>
<option value="{{option.value}}" {{{option.meta}}}>{{option.label}}</option>
<script type="text/html" id="tmpl-pum-field-license_key">
<input class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value.key}}" autocomplete="off" {{{data.meta}}}/>
<# if (data.value.key !== '') { #>
<?php wp_nonce_field( 'pum_license_activation', 'pum_license_activation_nonce' ); ?>
<# if (data.value.status === 'valid') { #>
<span class="pum-license-status"><?php _e( 'Active', 'popup-maker' ); ?></span>
<input type="submit" class="button-secondary pum-license-deactivate" id="{{data.id}}_deactivate" name="pum_license_deactivate[{{data.id}}]" value="<?php _e( 'Deactivate License', 'popup-maker' ); ?>"/>
<span class="pum-license-status"><?php _e( 'Inactive', 'popup-maker' ); ?></span>
<input type="submit" class="button-secondary pum-license-activate" id="{{data.id}}_activate" name="pum_license_activate[{{data.id}}]" value="<?php _e( 'Activate License', 'popup-maker' ); ?>"/>
<# if (data.value.messages && data.value.messages.length) { #>
<div class="pum-license-messages">
<# for(var i=0; i < data.value.messages.length; i++) { #>
<p>{{{data.value.messages[i]}}}</p>
<script type="text/html" id="tmpl-pum-field-datetime">
<div class="pum-datetime">
<input placeholder="{{data.placeholder}}" data-input class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<a class="input-button" data-toggle><i class="dashicons dashicons-calendar-alt"></i></a>
<script type="text/html" id="tmpl-pum-field-datetimerange">
<div class="pum-datetime-range">
<input placeholder="{{data.placeholder}}" data-input class="{{data.size}}-text" id="{{data.id}}" name="{{data.name}}" value="{{data.value}}" {{{data.meta}}}/>
<a class="input-button" data-toggle><i class="dashicons dashicons-calendar-alt"></i></a>
<script type="text/html" id="tmpl-pum-field-ga_event_labels">
<# data.value = _.extend({
<label for="{{data.id}}_category" style="padding-left: 3px;"><?php _e( 'Category', 'popup-maker' ); ?></label>
<input type="text" style="width:100%;" id="{{data.id}}_category" name="{{data.name}}[category]" value="{{data.value.category}}"/>
<label for="{{data.id}}_action" style="padding-left: 3px;"><?php _e( 'Action', 'popup-maker' ); ?></label>
<input type="text" style="width:100%;" id="{{data.id}}_action" name="{{data.name}}[action]" value="{{data.value.action}}"/>
<label for="{{data.id}}_label" style="padding-left: 3px;"><?php _e( 'Label', 'popup-maker' ); ?></label>
<input type="text" style="width:100%;" id="{{data.id}}_label" name="{{data.name}}[label]" value="{{data.value.label}}"/>
<label for="{{data.id}}_value" style="padding-left: 3px;"><?php _e( 'Value', 'popup-maker' ); ?></label>
<input type="number" style="width:100%;height: auto;" id="{{data.id}}_value" name="{{data.name}}[value]" value="{{data.value.value}}" step="0.01" max="999999" min="0"/>
public static function misc_fields() {
<script type="text/html" id="tmpl-pum-field-section">
<div class="pum-field-section {{data.classes}}">
<# _.each(data.fields, function(field) { #>
<script type="text/html" id="tmpl-pum-field-wrapper">
<div class="pum-field pum-field-{{data.type}} {{data.id}}-wrapper {{data.classes}}"
data-id="{{data.id}}" <# print( data.dependencies !== '' ? "data-pum-dependencies='" + data.dependencies + "'" : ''); #> <# print( data.dynamic_desc !== '' ? "data-pum-dynamic-desc='" + data.dynamic_desc + "'" : ''); #>>
<# if (typeof data.label === 'string' && data.label.length > 0) { #>
<label for="{{data.id}}">
<# if (typeof data.doclink === 'string' && data.doclink !== '') { #>
<a href="{{data.doclink}}" title="<?php _e( 'Documentation', 'popup-maker' ); ?>: {{data.label}}" target="_blank" class="pum-doclink dashicons dashicons-editor-help"></a>
<# if (typeof data.doclink === 'string' && data.doclink !== '') { #>
<a href="{{data.doclink}}" title="<?php _e( 'Documentation', 'popup-maker' ); ?>: {{data.label}}" target="_blank" class="pum-doclink dashicons dashicons-editor-help"></a>
<# if (typeof data.desc === 'string' && data.desc.length > 0) { #>
<span class="pum-desc desc">{{{data.desc}}}</span>
<script type="text/html" id="tmpl-pum-field-html">
<script type="text/html" id="tmpl-pum-field-heading">
<h3 class="pum-field-heading">{{data.desc}}</h3>
<script type="text/html" id="tmpl-pum-field-separator">
<# if (typeof data.desc === 'string' && data.desc.length > 0 && data.desc_position === 'top') { #>
<h3 class="pum-field-heading">{{data.desc}}</h3>
<# if (typeof data.desc === 'string' && data.desc.length > 0 && data.desc_position === 'bottom') { #>
<h3 class="pum-field-heading">{{data.desc}}</h3>
public static function helpers() {
<script type="text/html" id="tmpl-pum-modal">
<div id="{{data.id}}" class="pum-modal-background {{data.classes}}" role="dialog" aria-modal="false" aria-labelledby="{{data.id}}-title" aria-describedby="{{data.id}}-description" {{{data.meta}}}>
<div class="pum-modal-wrap">
<div class="pum-modal-header">
<# if (data.title.length) { #>
<span id="{{data.id}}-title" class="pum-modal-title">{{data.title}}</span>
<button type="button" class="pum-modal-close" aria-label="<?php _e( 'Close', 'popup-maker' ); ?>"></button>
<# if (data.description.length) { #>
<span id="{{data.id}}-description" class="screen-reader-text">{{data.description}}</span>
<div class="pum-modal-content">
<# if (data.save_button || data.cancel_button) { #>
<div class="pum-modal-footer submitbox">
<# if (data.cancel_button) { #>
<button type="button" class="submitdelete no-button" href="#">{{data.cancel_button}}</button>
<# if (data.save_button) { #>
<span class="spinner"></span>
<button class="button button-primary">{{data.save_button}}</button>
<script type="text/html" id="tmpl-pum-tabs">
<div class="pum-tabs-container {{data.classes}}" {{{data.meta}}}>
<# _.each(data.tabs, function(tab, key) { #>
<a href="#{{data.id + '_' + key}}">{{tab.label}}</a>
<# _.each(data.tabs, function(tab, key) { #>
<div id="{{data.id + '_' + key}}" class="tab-content">
<script type="text/html" id="tmpl-pum-shortcode">
[{{{data.tag}}} {{{data.meta}}}]
<script type="text/html" id="tmpl-pum-shortcode-w-content">
[{{{data.tag}}} {{{data.meta}}}]{{{data.content}}}[/{{{data.tag}}}]
public static function triggers_editor() {
<script type="text/html" id="tmpl-pum-field-triggers">
<# print(PUM_Admin.triggers.template.editor({triggers: data.value, name: data.name})); #>
<script type="text/html" id="tmpl-pum-trigger-editor">
<div class="pum-popup-trigger-editor <# if (data.triggers && data.triggers.length) { print('has-list-items'); } #>" data-field_name="{{data.name}}">
<button type="button" class="button button-primary pum-add-new no-button"><?php _e( 'Add New Trigger', 'popup-maker' ); ?></button>
<?php _e( 'Triggers cause a popup to open.', 'popup-maker' ); ?>
<a href="<?php echo esc_url( 'https://docs.wppopupmaker.com/article/141-triggers?utm_campaign=contextual-help&utm_medium=inline-doclink&utm_source=plugin-popup-editor&utm_content=triggers-option-settings' ); ?>" target="_blank"
class="pum-doclink dashicons dashicons-editor-help" title="<?php esc_attr_e( sprintf( __( 'Learn more about %s', 'popup-maker' ), __( 'Triggers', 'popup-maker' ) ) ); ?>"></a>
<table class="list-table form-table">
<th><?php _e( 'Type', 'popup-maker' ); ?></th>
<th><?php _e( 'Cookie', 'popup-maker' ); ?></th>
<th><?php _e( 'Settings', 'popup-maker' ); ?></th>
<th><?php _e( 'Actions', 'popup-maker' ); ?></th>
_.each(data.triggers, function (trigger, index) {
print(PUM_Admin.triggers.template.row({
settings: trigger.settings || {}
<!-- <div class="no-triggers no-list-items">-->
<!-- <div class="pum-field pum-field-select pum-field-select2">-->
<!-- <label for="pum-first-trigger">--><?php // _e( 'Choose a type of trigger to get started.', 'popup-maker' ); ?><!--</label>-->
<!-- <# print(PUM_Admin.triggers.template.selectbox({id: 'pum-first-trigger', name: "", placeholder: "--><?php // _e( 'Select a trigger type.', 'popup-maker' ); ?><!--"})); #>-->
<script type="text/html" id="tmpl-pum-trigger-row">
<tr data-index="{{data.index}}">
<button type="button" class="edit no-button link-button" aria-label="<?php _e( 'Edit this trigger', 'popup-maker' ); ?>">{{PUM_Admin.triggers.getLabel(data.type)}}</button>
<input class="popup_triggers_field_type" type="hidden" name="{{data.name}}[{{data.index}}][type]" value="{{data.type}}"/>
<input class="popup_triggers_field_settings" type="hidden" name="{{data.name}}[{{data.index}}][settings]" value="{{JSON.stringify(data.settings)}}"/>
<td class="cookie-column">
<code>{{PUM_Admin.triggers.cookie_column_value(data.settings.cookie_name)}}</code>
<td class="settings-column">{{{PUM_Admin.triggers.getSettingsDesc(data.type, data.settings)}}}</td>
<td class="list-item-actions">
<button type="button" class="edit dashicons dashicons-edit no-button" aria-label="<?php _e( 'Edit this trigger', 'popup-maker' ); ?>"></button>
<button type="button" class="remove dashicons dashicons-no no-button" aria-label="<?php _e( 'Delete this trigger', 'popup-maker' ); ?>"></button>
$presets = apply_filters(
'pum_click_selector_presets',
'a[href="exact_url"]' => __( 'Link: Exact Match', 'popup-maker' ),
'a[href*="contains"]' => __( 'Link: Containing', 'popup-maker' ),
'a[href^="begins_with"]' => __( 'Link: Begins With', 'popup-maker' ),
'a[href$="ends_with"]' => __( 'Link: Ends With', 'popup-maker' ),
<script type="text/html" id="tmpl-pum-click-selector-presets">
<div class="pum-click-selector-presets">
<span class="dashicons dashicons-arrow-left" title="<?php _e( 'Insert Preset', 'popup-maker' ); ?>"></span>
<?php foreach ( $presets as $preset => $label ) : ?>
<li data-preset='<?php echo $preset; ?>'>
<span><?php echo $label; ?></span>
<script type="text/html" id="tmpl-pum-trigger-add-type">
echo PUM_Utils_Array::safe_json_encode(
'id' => 'pum-add-trigger',
'popup_trigger_add_type' => [
'id' => 'popup_trigger_add_type',
'label' => __( 'What kind of trigger do you want?', 'popup-maker' ),