: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Fills default settings only when missing.
* Excludes checkbox type fields where a false value is represented by the field being unset.
public static function fill_missing_defaults( $settings = [] ) {
$excluded_field_types = [ 'checkbox', 'multicheck' ];
$defaults = self::defaults();
foreach ( $defaults as $field_id => $default_value ) {
$field = self::get_field( $field_id );
if ( isset( $settings[ $field_id ] ) || in_array( $field['type'], $excluded_field_types ) ) {
$settings[ $field_id ] = $default_value;
* Display analytics metabox
public static function render_analytics_meta_box() {
$popup = pum_get_popup( $post->ID );
<div id="pum-popup-analytics" class="pum-meta-box">
<?php do_action( 'pum_popup_analytics_metabox_before', $post->ID ); ?>
$opens = $popup->get_event_count( 'open' );
$conversions = $popup->get_event_count( 'conversion' );
$conversion_rate = $opens > 0 && $opens >= $conversions ? $conversions / $opens * 100 : 0;
<div id="pum-popup-analytics" class="pum-popup-analytics">
<table class="form-table">
<td><?php esc_html_e( 'Opens', 'popup-maker' ); ?></td>
<td><?php echo esc_html( $opens ); ?></td>
<td><?php esc_html_e( 'Conversions', 'popup-maker' ); ?></td>
<td><?php echo esc_html( $conversions ); ?></td>
<td><?php esc_html_e( 'Conversion Rate', 'popup-maker' ); ?></td>
<td><?php echo esc_html( round( $conversion_rate, 2 ) ); ?>%</td>
<label> <input type="checkbox" name="popup_reset_counts" id="popup_reset_counts" value="1" />
<?php esc_html_e( 'Reset Counts', 'popup-maker' ); ?>
if ( ( $reset = $popup->get_last_count_reset() ) ) :
<strong><?php esc_html_e( 'Last Reset', 'popup-maker' ); ?>:</strong> <?php echo esc_html( wp_date( 'm-d-Y H:i', $reset['timestamp'] ) ); ?>
<br /> <strong><?php esc_html_e( 'Previous Opens', 'popup-maker' ); ?>:</strong> <?php echo esc_html( $reset['opens'] ); ?>
<?php if ( $reset['conversions'] > 0 ) : ?>
<strong><?php esc_html_e( 'Previous Conversions', 'popup-maker' ); ?>:</strong> <?php echo esc_html( $reset['conversions'] ); ?>
<br /> <strong><?php esc_html_e( 'Lifetime Opens', 'popup-maker' ); ?>:</strong> <?php echo esc_html( $popup->get_event_count( 'open', 'total' ) ); ?>
<?php if ( $popup->get_event_count( 'conversion', 'total' ) > 0 ) : ?>
<strong><?php esc_html_e( 'Lifetime Conversions', 'popup-maker' ); ?>:</strong> <?php echo esc_html( $popup->get_event_count( 'conversion', 'total' ) ); ?>
<?php do_action( 'pum_popup_analytics_metabox_after', $post->ID ); ?>
public static function sanitize_meta( $meta = [] ) {
if ( ! empty( $meta ) ) {
foreach ( $meta as $key => $value ) {
if ( is_array( $value ) ) {
$meta[ $key ] = self::sanitize_meta( $value );
} elseif ( is_string( $value ) ) {
$value = json_decode( stripslashes( $value ) );
if ( is_object( $value ) || is_array( $value ) ) {
$meta[ $key ] = PUM_Admin_Helpers::object_to_array( $value );
} catch ( Exception $e ) {
* Ensures that the popups have unique slugs.
public static function set_slug( $data, $postarr ) {
if ( 'popup' === $data['post_type'] ) {
$data['post_name'] = wp_unique_post_slug( sanitize_title( popmake_post( 'popup_name' ) ), $postarr['ID'], $data['post_status'], $data['post_type'], $data['post_parent'] );
* Defines the custom columns and their order
* @param array $_columns Array of popup columns
* @return array $columns Updated array of popup columns for
public static function dashboard_columns( $_columns ) {
wp_enqueue_style( 'pum-admin-general' );
'cb' => '<input type="checkbox"/>',
'title' => __( 'Name', 'popup-maker' ),
'enabled' => __( 'Enabled', 'popup-maker' ),
'popup_title' => __( 'Title', 'popup-maker' ),
'class' => __( 'CSS Class', 'popup-maker' ),
'opens' => __( 'Opens', 'popup-maker' ),
'conversions' => __( 'Conversions', 'popup-maker' ),
'conversion_rate' => __( 'Conversion Rate', 'popup-maker' ),
// Add the date column preventing our own translation.
if ( ! empty( $_columns['date'] ) ) {
$columns['date'] = $_columns['date'];
if ( get_taxonomy( 'popup_tag' ) ) {
$columns['popup_tag'] = __( 'Tags', 'popup-maker' );
if ( get_taxonomy( 'popup_category' ) ) {
$columns['popup_category'] = __( 'Categories', 'popup-maker' );
$columns = apply_filters( 'popmake_popup_columns', $columns );
return apply_filters( 'pum_popup_columns', $columns );
* @param string $column_name Column name
* @param int $post_id (Post) ID
public static function render_columns( $column_name, $post_id ) {
$post = get_post( $post_id );
if ( 'popup' === $post->post_type ) {
$popup = pum_get_popup( $post_id );
* Uncomment if need to check for permissions on certain columns.
* $post_type_object = get_post_type_object( $popup->post_type );
* $can_edit_post = current_user_can( $post_type_object->cap->edit_post, $popup->ID );
switch ( $column_name ) {
echo esc_html( $popup->get_title() );
if ( 'publish' === $post->post_status ) {
$enabled = $popup->is_enabled();
$nonce = wp_create_nonce( "pum_save_enabled_state_{$popup->ID}" );
<div class="pum-toggle-button">
<input id="pum-enabled-toggle-<?php echo esc_attr( $popup->ID ); ?>" type="checkbox" <?php checked( true, $enabled ); ?> class="pum-enabled-toggle-button" data-nonce="<?php echo esc_attr( $nonce ); ?>" data-popup-id="<?php echo esc_attr( $popup->ID ); ?>">
<label for="pum-enabled-toggle-<?php echo esc_attr( $popup->ID ); ?>" aria-label="Switch to enable popup"></label>
<p>Popup not published</p>
echo get_the_term_list( $post_id, 'popup_category', '', ', ', '' );
echo get_the_term_list( $post_id, 'popup_tag', '', ', ', '' );
echo '<pre style="display:inline-block;margin:0;"><code>popmake-' . absint( $post_id ) . '</code></pre>';
if ( ! pum_extension_enabled( 'popup-analytics' ) ) {
echo esc_html( $popup->get_event_count( 'open' ) );
if ( ! pum_extension_enabled( 'popup-analytics' ) ) {
echo esc_html( $popup->get_event_count( 'conversion' ) );
if ( ! pum_extension_enabled( 'popup-analytics' ) ) {
$opens = $popup->get_event_count( 'open' );
$conversions = $popup->get_event_count( 'conversion' );
if ( $opens > 0 && $opens >= $conversions ) {
$conversion_rate = round( $conversions / $opens * 100, 2 );
echo esc_html( $conversion_rate . '%' );
* Hide some of our columns by default
* @param array $hidden Array of IDs of columns hidden by default.
* @param WP_Screen $screen WP_Screen object of the current screen.
* @return array Updated $hidden
public static function hide_columns( $hidden, $screen ) {
if ( isset( $screen->id ) && 'edit-popup' === $screen->id ) {
$hidden[] = 'popup_title';
* Registers the sortable columns in the list table
* @param array $columns Array of the columns
* @return array $columns Array of sortable columns
public static function sortable_columns( $columns ) {
$columns['popup_title'] = 'popup_title';
$columns['opens'] = 'opens';
$columns['conversions'] = 'conversions';
* Sorts Columns in the List Table
* @param array $vars Array of all the sort variables
* @return array $vars Array of all the sort variables
public static function sort_columns( $vars ) {
// Check if we're viewing the "popup" post type
if ( isset( $vars['post_type'] ) && 'popup' === $vars['post_type'] ) {
// Check if 'orderby' is set to "name"
if ( isset( $vars['orderby'] ) ) {
switch ( $vars['orderby'] ) {
'meta_key' => 'popup_title',
'orderby' => 'meta_value',
if ( ! pum_extension_enabled( 'popup-analytics' ) ) {
'meta_key' => 'popup_open_count',
'orderby' => 'meta_value_num',
if ( ! pum_extension_enabled( 'popup-analytics' ) ) {
'meta_key' => 'popup_conversion_count',
'orderby' => 'meta_value_num',
public static function load() {
add_filter( 'request', [ __CLASS__, 'sort_columns' ] );
* Adds taxonomy drop down filters for popups.
public static function add_popup_filters() {
// Checks if the current post type is 'popup'
if ( 'popup' === $typenow ) {
if ( get_taxonomy( 'popup_category' ) ) {
$terms = get_terms( 'popup_category' );
if ( count( $terms ) > 0 ) {
echo "<select name='popup_category' id='popup_category' class='postform'>";
echo "<option value=''>" . __( 'Show all categories', 'popup-maker' ) . '</option>';
foreach ( $terms as $term ) {
$selected = isset( $_GET['popup_category'] ) && $_GET['popup_category'] === $term->slug ? 'selected="selected"' : '';
echo '<option value="' . esc_attr( $term->slug ) . '" ' . $selected . '>' . esc_html( $term->name ) . ' (' . $term->count . ')</option>';
if ( get_taxonomy( 'popup_tag' ) ) {
$terms = get_terms( 'popup_tag' );
if ( count( $terms ) > 0 ) {
echo "<select name='popup_tag' id='popup_tag' class='postform'>";
echo "<option value=''>" . __( 'Show all tags', 'popup-maker' ) . '</option>';
foreach ( $terms as $term ) {
$selected = isset( $_GET['popup_tag'] ) && $_GET['popup_tag'] === $term->slug ? 'selected="selected"' : '';
echo '<option value="' . esc_attr( $term->slug ) . '" ' . $selected . '>' . esc_html( $term->name ) . ' (' . $term->count . ')</option>';
* Prepends Popup ID to the action row on All Popups
* @param array $actions The row actions.
* @return array The new actions.
public static function add_id_row_actions( $actions, $post ) {
// Only adjust if we are dealing with our popups.
if ( 'popup' === $post->post_type ) {
return array_merge( [ 'id' => 'ID: ' . $post->ID ], $actions );