File "class-pum-admin-upgrade-routine-4.php"
Full Path: /home/tekvhqgl/public_html/wp-content/plugins/popup-maker/includes/admin/upgrades/class-pum-admin-upgrade-routine-4.php
File size: 8.47 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Upgrade Routine 4
*
* @package PUM
* @subpackage Admin/Upgrades
* @copyright Copyright (c) 2023, Code Atlantic LLC
* @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
* @since 1.4
*/
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'PUM_Admin_Upgrade_Routine' ) ) {
require_once POPMAKE_DIR . 'includes/admin/upgrades/class-pum-admin-upgrade-routine.php';
}
/**
* Class PUM_Admin_Upgrade_Routine_4
*/
final class PUM_Admin_Upgrade_Routine_4 extends PUM_Admin_Upgrade_Routine {
/**
* Returns a description.
*
* @return mixed|void
*/
public static function description() {
return __( 'Upgrade popup targeting conditions.', 'popup-maker' );
}
/**
* Upgrade popup targeting conditions.
*
* - Convert Conditions
* - Default popups with no conditions to draft
*/
public static function run() {
if ( ! current_user_can( PUM_Admin_Upgrades::instance()->required_cap ) ) {
wp_die( __( 'You do not have permission to do upgrades', 'popup-maker' ), __( 'Error', 'popup-maker' ), [ 'response' => 403 ] );
}
ignore_user_abort( true );
if ( ! pum_is_func_disabled( 'set_time_limit' ) ) {
@set_time_limit( 0 );
}
$upgrades = PUM_Admin_Upgrades::instance();
$completed = $upgrades->get_arg( 'completed' );
$total = $upgrades->get_arg( 'total' );
// Set the correct total.
if ( $total <= 1 ) {
$popups = wp_count_posts( 'popup' );
$total = 0;
foreach ( $popups as $status ) {
$total += $status;
}
$upgrades->set_arg( 'total', $total );
}
$popups = pum_get_popups(
[
'number' => $upgrades->get_arg( 'number' ),
'page' => $upgrades->get_arg( 'step' ),
'status' => [ 'any', 'trash', 'auto-draft' ],
'order' => 'ASC',
]
);
if ( $popups ) {
foreach ( $popups as $popup ) {
$_conditions = $conditions = [];
// Convert Conditions
$targeting_conditions = popmake_get_popup_meta_group( 'targeting_condition', $popup->ID );
if ( empty( $targeting_conditions ) ) {
if ( 'publish' === $popup->post_status ) {
// Default popups with no conditions to draft
self::change_post_status( $popup->ID, 'draft' );
}
update_post_meta( $popup->ID, 'popup_conditions', $conditions );
$completed ++;
continue;
}
$sitewide = false;
if ( array_key_exists( 'on_entire_site', $targeting_conditions ) ) {
$sitewide = true;
$targeting_conditions = self::filter_excludes( $targeting_conditions );
} else {
$targeting_conditions = self::filter_includes( $targeting_conditions );
}
$targeting_conditions = self::parse_conditions( $targeting_conditions );
$_group = [];
foreach ( $targeting_conditions as $condition ) {
// If sitewide is enabled then all conditions use the not_operand.
$condition['not_operand'] = $sitewide ? 1 : 0;
// Add a new AND condition group.
if ( $sitewide ) {
$_conditions[] = [ $condition ];
} // Add a new OR condition to the group.
else {
$_group[] = $condition;
}
}
if ( ! $sitewide && ! empty( $_group ) ) {
$_conditions[] = $_group;
}
foreach ( $_conditions as $group_key => $group ) {
foreach ( $group as $condition_key => $condition ) {
$validated = PUM_Conditions::instance()->validate_condition( $condition );
if ( ! is_wp_error( $validated ) ) {
$conditions[ $group_key ][ $condition_key ] = $validated;
}
}
}
update_post_meta( $popup->ID, 'popup_conditions', $conditions );
$completed ++;
}
if ( $completed < $total ) {
$upgrades->set_arg( 'completed', $completed );
self::next_step();
}
}
self::done();
}
/**
* Converts old condition keys into new condition arrays.
*
* @param array $targeting_conditions
*
* @return array
*/
public static function parse_conditions( $targeting_conditions = [] ) {
$conditions = [];
$targeting_conditions = array_keys( $targeting_conditions );
foreach ( $targeting_conditions as $index => $key ) {
$condition = null;
// Front Page
if ( strpos( $key, 'on_home' ) !== false ) {
$condition = [
'target' => 'is_front_page',
];
} // Blog Index
elseif ( strpos( $key, 'on_blog' ) !== false ) {
$condition = [
'target' => 'is_home',
];
} // Search Pages
elseif ( strpos( $key, 'on_search' ) !== false ) {
$condition = [
'target' => 'is_search',
];
} // 404 Pages
elseif ( strpos( $key, 'on_404' ) !== false ) {
$condition = [
'target' => 'is_404',
];
} // WooCommerce Pages
elseif ( strpos( $key, 'on_woocommerce' ) !== false ) {
$condition = [
'target' => 'is_woocommerce',
];
} // WooCommerce Shop Pages
elseif ( strpos( $key, 'on_shop' ) !== false ) {
$condition = [
'target' => 'is_shop',
];
}
if ( $condition ) {
unset( $targeting_conditions[ $index ] );
$conditions[] = $condition;
}
}
foreach ( get_post_types( [ 'public' => true ], 'objects' ) as $name => $post_type ) {
$pt_conditions = self::filter_conditions( $targeting_conditions, '_' . $name );
if ( empty( $pt_conditions ) ) {
continue;
}
if ( in_array( "on_{$name}s", $pt_conditions ) && ! in_array( "on_specific_{$name}s", $pt_conditions ) ) {
$conditions[] = [
'target' => $name . '_all',
];
continue;
}
// Remove non ID keys
unset( $pt_conditions[ "on_{$name}s" ] );
unset( $pt_conditions[ "on_specific_{$name}s" ] );
$ids = [];
// Convert the rest of the keys to post IDs.
foreach ( $pt_conditions as $key ) {
$id = intval( preg_replace( '/[^0-9]+/', '', $key ), 10 );
if ( $id > 0 ) {
$ids[] = $id;
}
}
// Create a new post_type_selected condition with the ids.
$conditions[] = [
'target' => $name . '_selected',
'selected' => $ids,
];
}
foreach ( get_taxonomies( [ 'public' => true ], 'objects' ) as $tax_name => $taxonomy ) {
$tax_conditions = self::filter_conditions( $targeting_conditions, '_' . $tax_name );
if ( empty( $tax_conditions ) ) {
continue;
}
if ( in_array( "on_{$tax_name}s", $tax_conditions ) && ! in_array( "on_specific_{$tax_name}s", $tax_conditions ) ) {
$conditions[] = [
'target' => 'tax_' . $tax_name . '_all',
];
continue;
}
// Remove non ID keys
unset( $tax_conditions[ "on_{$tax_name}s" ] );
unset( $tax_conditions[ "on_specific_{$tax_name}s" ] );
$ids = [];
// Convert the rest of the keys to post IDs.
foreach ( $tax_conditions as $key ) {
$id = intval( preg_replace( '/[^0-9]+/', '', $key ), 10 );
if ( $id > 0 ) {
$ids[] = $id;
}
}
// Create a new post_type_selected condition with the ids.
$conditions[] = [
'target' => 'tax_' . $tax_name . '_selected',
'selected' => $ids,
];
}
return $conditions;
}
/**
* Filters conditions for substrings and removes keys from original array.
*
* @param $targeting_conditions
* @param $string
*
* @return array
*/
public static function filter_conditions( &$targeting_conditions, $string ) {
$conditions = [];
foreach ( $targeting_conditions as $index => $key ) {
if ( $string === '_post' && strpos( $key, '_post_tag' ) !== false ) {
continue;
}
if ( strpos( $key, $string ) !== false ) {
$key = str_replace( 'exclude_', '', $key );
$conditions[ $key ] = $key;
unset( $targeting_conditions[ $index ] );
}
}
return $conditions;
}
/**
* Change a post status for a specified post_id.
*
* @param $post_id
* @param $status
*/
public static function change_post_status( $post_id, $status ) {
$current_post = get_post( $post_id, 'ARRAY_A' );
$current_post['post_status'] = $status;
wp_update_post( $current_post );
}
/**
* Filters out only inclusionary conditions.
*
* @param array $conditions
*
* @return array
*/
public static function filter_includes( $conditions = [] ) {
$includes = [];
foreach ( $conditions as $condition => $value ) {
if ( strpos( $condition, 'on_' ) === 0 ) {
$includes[ $condition ] = $condition;
}
}
return $includes;
}
/**
* Filters out only exclusionary conditions.
*
* @param array $conditions
*
* @return array
*/
public static function filter_excludes( $conditions = [] ) {
$excludes = [];
foreach ( $conditions as $condition => $value ) {
if ( strpos( $condition, 'exclude_on_' ) === 0 ) {
$excludes[ $condition ] = $condition;
}
}
return $excludes;
}
}