1633 lines
60 KiB
PHP
1633 lines
60 KiB
PHP
<?php
|
||
/**
|
||
* Copy & Delete Posts – Post requests handler file.
|
||
*
|
||
* @package CDP
|
||
* @subpackage PostHandler
|
||
* @author CopyDeletePosts
|
||
* @since 1.0.0
|
||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
||
/** –– **\
|
||
* Main handler + It will also sanitize and verify that request a little bit.
|
||
* @since 1.0.0
|
||
*/
|
||
add_action('wp_ajax_cdp_action_handling', function () {
|
||
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
|
||
if (isset($_POST['token']) && $_POST['token'] == 'cdp' && isset($_POST['f']) && is_admin()) {
|
||
|
||
if (check_ajax_referer('copy-delete-posts-ajax', 'nonce', false) === false) {
|
||
return wp_send_json_error();
|
||
}
|
||
|
||
// Expand execution time
|
||
if (intval(ini_get('max_execution_time')) < 7200)
|
||
set_time_limit(0);
|
||
|
||
// Get WP-Plugin path
|
||
$premium_plugin = 'copy-delete-posts-premium/copy-delete-posts-premium.php';
|
||
$premium_dir = WP_PLUGIN_DIR . '/' . 'copy-delete-posts-premium';
|
||
$pplugin_path = $premium_dir . '/handler/premium.php';
|
||
|
||
// Load premium content if the plugin is here
|
||
if (is_dir($premium_dir) && is_plugin_active($premium_plugin))
|
||
require_once($pplugin_path);
|
||
|
||
// Is premium function
|
||
$areWePro = is_plugin_active($premium_plugin);
|
||
|
||
// Get user roles and check if the role is permmited to use plugin
|
||
$access = false;
|
||
$current_user = wp_get_current_user();
|
||
$access_roles = get_option('_cdp_globals');
|
||
if (!isset($access_roles['roles']))
|
||
$access_roles = array();
|
||
foreach ($current_user->roles as $role => $name)
|
||
if ($name == 'administrator' || (isset($access_roles['roles'][$name]) && $access_roles['roles'][$name] == 'true')) {
|
||
$access = true;
|
||
break;
|
||
}
|
||
|
||
// Check user permission
|
||
if ($access === true) {
|
||
|
||
// Pointers
|
||
if ($_POST['f'] == 'no_intro')
|
||
cdp_add_new_no_intro();
|
||
else if ($_POST['f'] == 'intro_again')
|
||
cdp_add_new_intro();
|
||
else if ($_POST['f'] == 'save_options')
|
||
cdp_save_plugin_options($areWePro);
|
||
else if ($_POST['f'] == 'copy_post')
|
||
cdp_insert_new_post($areWePro);
|
||
else if ($_POST['f'] == 'get_settings')
|
||
cdp_get_profile();
|
||
else if ($_POST['f'] == 'get_all_settings')
|
||
cdp_get_all_profiles();
|
||
else if ($_POST['f'] == 'save_profiles' && $areWePro)
|
||
cdp_save_profile_set();
|
||
else if ($_POST['f'] == 'get_all_posts')
|
||
cdp_get_all_posts();
|
||
else if ($_POST['f'] == 'delete_them')
|
||
cdp_delete_posts();
|
||
else if ($_POST['f'] == 'get_formatted_time' && $areWePro)
|
||
cdp_formatted_time();
|
||
else if ($_POST['f'] == 'set_default_profile')
|
||
cdp_set_default_profile();
|
||
else if ($_POST['f'] == 'get_default_profile')
|
||
cdp_get_default_profile();
|
||
else if ($_POST['f'] == 'clear_crons')
|
||
cdp_clear_all_crons();
|
||
else if ($_POST['f'] == 'i_saw_this_noti')
|
||
cdp_set_noti_as_seen();
|
||
else if ($_POST['f'] == 'try_to_hide_the_tasks')
|
||
cdp_just_hide_task();
|
||
else if ($_POST['f'] == 'try_to_kill_the_tasks')
|
||
cdp_just_kill_task();
|
||
else if ($_POST['f'] == 'give_me_current_tasks')
|
||
cdp_just_get_tasks();
|
||
else if ($_POST['f'] == 'hide_cron_notice')
|
||
cdp_hide_perf_notice();
|
||
else if ($_POST['f'] == 'review_dismiss')
|
||
cdp_review();
|
||
else if ($_POST['f'] == 'debug_function')
|
||
cdp_debug_function();
|
||
else if ($_POST['f'] == 'delete_success_img')
|
||
delete_option('_cdp_show_copy');
|
||
else if ($_POST['f'] == 'save_redi_state' && $areWePro)
|
||
cdpp_save_redi_state();
|
||
else if ($_POST['f'] == 'multi_redi_importer' && $areWePro)
|
||
cdpp_redis_importer();
|
||
else if ($_POST['f'] == 'save_redirections' && $areWePro)
|
||
cdpp_save_redirections();
|
||
else if ($_POST['f'] == 'delete_redirect' && $areWePro)
|
||
cdpp_delete_redirection();
|
||
else if ($_POST['f'] == 'switch_redirects' && $areWePro)
|
||
cdpp_switch_redirects();
|
||
else if ($_POST['f'] == 'get_authors' && $areWePro)
|
||
cdpp_get_authors();
|
||
else if ($_POST['f'] == 'get_curr_time' && $areWePro)
|
||
cdpp_get_curr_s_time();
|
||
else if ($_POST['f'] == 'get_post_export' && $areWePro)
|
||
cdpp_get_for_export();
|
||
else if ($_POST['f'] == 'import_posts' && $areWePro)
|
||
cdpp_take_for_import();
|
||
else if ($_POST['f'] == 'save_aci' && $areWePro)
|
||
cdpp_save_cleanup_settings();
|
||
else if ($_POST['f'] == 'get_aci' && $areWePro)
|
||
cdpp_get_cleanup_settings();
|
||
else if ($_POST['f'] == 'turn_off_aci' && $areWePro)
|
||
cdpp_turn_the_acii_off();
|
||
else if ($_POST['f'] == 'i_love_squirrels' && $areWePro)
|
||
cdpp_squirrel();
|
||
else
|
||
echo 'error';
|
||
} else
|
||
echo 'error';
|
||
} else
|
||
echo 'no_access';
|
||
} else
|
||
echo 'no_access';
|
||
|
||
wp_die();
|
||
});
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will be fired when user don't want to see intro – never again.
|
||
* @since 1.0.6
|
||
*/
|
||
function cdp_review() {
|
||
|
||
// Option
|
||
$method = sanitize_text_field($_POST['decision']);
|
||
|
||
// Get user id and array from db
|
||
$user_id = get_current_user_id();
|
||
$already = get_option('_cdp_review', false);
|
||
|
||
// Create if not exists
|
||
if ($already == false)
|
||
$already = array('installed' => time(), 'users' => array());
|
||
|
||
// Set dismiss
|
||
$already['users'][$user_id] = array();
|
||
$already['users'][$user_id]['dismiss'] = (($method == 'remind') ? time() : true);
|
||
|
||
// Add option to datbase if not exit.
|
||
$opt = update_option('_cdp_review', $already);
|
||
|
||
// Return success
|
||
echo json_encode(array('status' => 'success'));
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will be fired when user don't want to see intro – never again.
|
||
* @since 1.0.0
|
||
*/
|
||
function cdp_add_new_no_intro() {
|
||
|
||
// Get user id and array from db
|
||
$user_id = get_current_user_id();
|
||
$already = get_option('_cdp_no_intro');
|
||
|
||
// Check if it's first time that user checked this option.
|
||
if (!$already)
|
||
$already = array($user_id);
|
||
|
||
// If it already exists just add another user.
|
||
else if (!in_array($user_id, $already))
|
||
array_push($already, $user_id);
|
||
|
||
// If the user already exists exit.
|
||
else
|
||
exit;
|
||
|
||
// Add option to datbase if not exit.
|
||
$opt = update_option('_cdp_no_intro', $already);
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will be fired when user want to see intro – again.
|
||
* @since 1.0.0
|
||
*/
|
||
function cdp_add_new_intro() {
|
||
|
||
// Get user id and array from db
|
||
$user_id = get_current_user_id();
|
||
$already = get_option('_cdp_no_intro');
|
||
|
||
// Check if it's first time that user checked this option.
|
||
if ($already && in_array($user_id, $already))
|
||
unset($already[array_search($user_id, $already, true)]);
|
||
|
||
// If the user no exists exit.
|
||
else
|
||
exit;
|
||
|
||
// Add option to database if not exit.
|
||
$opt = update_option('_cdp_no_intro', $already);
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will be fired when user want to save plugin options – again.
|
||
* @since 1.0.0
|
||
*/
|
||
function cdp_save_plugin_options($areWePro) {
|
||
|
||
// Get the info about our professionalness
|
||
$areWePro = $areWePro;
|
||
|
||
// Get new options and current profile.
|
||
$options = ((isset($_POST['options'])) ? cdp_sanitize_array($_POST['options']) : false);
|
||
$entire = ((isset($_POST['entire'])) ? cdp_sanitize_array($_POST['entire']) : false);
|
||
$profile = ((isset($_POST['profile'])) ? sanitize_text_field($_POST['profile']) : false);
|
||
|
||
if (isset($entire['others']) && isset($entire['others']['cdp-tifm-enabled'])) {
|
||
$tifmoption = $entire['others']['cdp-tifm-enabled'];
|
||
unset($entire['others']['cdp-tifm-enabled']);
|
||
if ($tifmoption == 'true') {
|
||
update_option('_tifm_feature_enabled', 'enabled');
|
||
delete_option('_tifm_disable_feature_forever', true);
|
||
} else {
|
||
update_option('_tifm_feature_enabled', 'disabled');
|
||
update_option('_tifm_disable_feature_forever', true);
|
||
}
|
||
}
|
||
|
||
// Get current options and profiles.
|
||
$a_or = get_option('_cdp_profiles');
|
||
$already = get_option('_cdp_profiles');
|
||
$g_or = get_option('_cdp_globals');
|
||
$globals = get_option('_cdp_globals');
|
||
|
||
// Check if it's first time – create array.
|
||
if (!is_array($already))
|
||
$already = array();
|
||
if (!is_array($globals))
|
||
$globals = array();
|
||
|
||
// Add display name for this profile
|
||
$profile = preg_replace('/\s+/', '_', trim(strtolower($profile)));
|
||
|
||
// Write new settings for this profile.
|
||
$already[$profile] = $options;
|
||
$already[$profile]['usmplugin'] = 'false';
|
||
$already[$profile]['yoast'] = 'false';
|
||
$already[$profile]['woo'] = 'false';
|
||
$already[$profile]['all_metadata'] = 'false';
|
||
if ($areWePro)
|
||
$already[$profile] = cdpp_filter_premium_opts($already, $options, $profile);
|
||
|
||
if (!isset($already[$profile]['names']['display']) || (strlen(trim($already[$profile]['names']['display'])) <= 0))
|
||
$already[$profile]['names']['display'] = $profile;
|
||
$globals = $entire;
|
||
|
||
// Check if there is default profile
|
||
if (!isset($already['default']) || !isset($already['default']['title'])) {
|
||
$already['default'] = array();
|
||
|
||
if (function_exists('cdp_default_options'))
|
||
$already['default'] = cdp_default_options();
|
||
if (function_exists('cdp_default_global_options'))
|
||
$globals['others'] = cdp_default_global_options();
|
||
}
|
||
|
||
// Add new options to database.
|
||
$s1 = update_option('_cdp_globals', $globals);
|
||
$s2 = update_option('_cdp_profiles', $already);
|
||
|
||
// Check if success while uploading
|
||
if (($s1 || $s2) || ($globals == $g_or) || ($already == $a_or))
|
||
echo 'success';
|
||
else
|
||
echo 'error';
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will be fired when user want to save plugin options – again.
|
||
* @since 1.0.0
|
||
*/
|
||
function cdp_insert_new_post($areWePro = false) {
|
||
|
||
// Performance copy time start
|
||
$timein = microtime(true);
|
||
|
||
// Create output array which will be returned to requester
|
||
$output = array('status' => 'success');
|
||
|
||
// Get ID(s) of post(s)
|
||
$ids = ((isset($_POST['id'])) ? cdp_sanitize_array($_POST['id']) : false);
|
||
|
||
// Get all important pieces of information from requester
|
||
$data = ((isset($_POST['data'])) ? cdp_sanitize_array($_POST['data']) : false);
|
||
$times = isset($_POST['data']['times']) ? sanitize_text_field($_POST['data']['times']) : 1;
|
||
$swap = isset($_POST['data']['swap']) ? sanitize_text_field($_POST['data']['swap']) : false;
|
||
$profile = isset($_POST['data']['profile']) ? sanitize_text_field($_POST['data']['profile']) : 'default';
|
||
$origin = isset($_POST['origin']) ? sanitize_text_field($_POST['origin']) : false;
|
||
$custom = isset($_POST['data']['custom']) ? cdp_sanitize_array($_POST['data']['custom']) : false;
|
||
|
||
if (is_array($_POST['data']['site'])) {
|
||
$site = isset($_POST['data']['site']) ? cdp_sanitize_array($_POST['data']['site']) : false;
|
||
} else {
|
||
$site = isset($_POST['data']['site']) ? sanitize_text_field($_POST['data']['site']) : false;
|
||
$site = [$site];
|
||
}
|
||
|
||
// Load default options for selected profile
|
||
$defaults = get_option('_cdp_profiles')[$profile];
|
||
|
||
// Settings for this copy
|
||
$settings = (($data['type'] != 'copy-quick' && $custom != false) ? $custom : $defaults);
|
||
if (!isset($settings['names']))
|
||
$settings['names'] = $defaults['names'];
|
||
|
||
// Convert string to boolean – only for much less code later
|
||
foreach ($settings as $setting => $val)
|
||
if ($setting != 'names')
|
||
$settings[$setting] = (($val == 'true') ? true : false);
|
||
|
||
/**
|
||
* cdp_duplicate_categories - Makes sure that categories exist on new subsite
|
||
*
|
||
* @param array $origin [ids of categories in source website]
|
||
* @param int $site ID of the destination subsite
|
||
* @return array [ids of categories in subsite]
|
||
*/
|
||
function cdp_duplicate_categories($origin, $taxonomyName, $site, $areWePro = false, $previousType = 'post', $newType = 'post', $returnAsArray = false) {
|
||
|
||
if (($areWePro && $site != -1) || ($previousType != $newType)) {
|
||
|
||
$origin_ids = [];
|
||
$origin_names = [];
|
||
$newIds = [];
|
||
|
||
foreach ($origin as $i => $cat_id) {
|
||
$term = get_term($cat_id, $taxonomyName);
|
||
if (isset($term->name) && strlen($term->name) > 0) {
|
||
$origin_ids[] = $cat_id;
|
||
$origin_names[] = $term->name;
|
||
}
|
||
}
|
||
|
||
$names = [];
|
||
if ($newType == 'post' && $previousType != 'post') {
|
||
if (strpos($taxonomyName, 'tag') !== false) $taxonomyName = 'post_tag';
|
||
else if (strpos($taxonomyName, 'categ') !== false) $taxonomyName = 'category';
|
||
}
|
||
|
||
if (function_exists('cdpp_handle_multisite')) {
|
||
cdpp_handle_multisite($site);
|
||
}
|
||
|
||
foreach ($origin_names as $i => $cat_name) {
|
||
$cat_id = get_terms([
|
||
'fields' => 'ids',
|
||
'taxonomy' => $taxonomyName,
|
||
'name' => $cat_name,
|
||
'hide_empty' => false
|
||
]);
|
||
|
||
if (sizeof($cat_id) > 0) {
|
||
$newIds[] = $cat_id[0];
|
||
} else {
|
||
$createdId = wp_insert_term($cat_name, $taxonomyName);
|
||
$names[] = $cat_name;
|
||
if (isset($createdId['term_id']) && is_numeric($createdId['term_id'])) {
|
||
$newIds[] = $createdId['term_id'];
|
||
}
|
||
}
|
||
}
|
||
|
||
if (function_exists('cdpp_handle_multisite_after')) {
|
||
cdpp_handle_multisite_after($site);
|
||
}
|
||
|
||
if ($returnAsArray == true) {
|
||
return [ 'ids' => $newIds, 'taxonomy' => $taxonomyName, 'names' => $names ];
|
||
} else return $newIds;
|
||
|
||
} else {
|
||
if ($returnAsArray == true) {
|
||
return [ 'ids' => $origin ];
|
||
} else return $origin;
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* This local function filters post data by user settings
|
||
* @param $post (array of wordpress post/page data)
|
||
* @param $settings (array of preselected settings of profile or by user)
|
||
* @return array with insert ready values for wordpress post || false on wrong $post
|
||
*/
|
||
function cdp_filter_post($post, $swap, $opt, $settings, $site, $taxonomies = false, $areWePro = false, $globals = false) {
|
||
|
||
// If $post has wrong format return false
|
||
if (!(is_array($post) || is_object($post)))
|
||
return false;
|
||
|
||
// Array for formatted and prepared taxonomy
|
||
$ft = array();
|
||
$buin = array('link_category', 'nav_menu', 'post_tag', 'category', 'post_format');
|
||
|
||
// Loop thorugh all taxonomies from post
|
||
foreach ($taxonomies as $taxonomy) {
|
||
|
||
// Set the name to shorted variable
|
||
$tn = $taxonomy->taxonomy;
|
||
|
||
// Check if it's private taxonomy and if it's set in options
|
||
if ($tn == 'link_category' && !$settings['link_category'])
|
||
continue;
|
||
if ($tn == 'nav_menu' && !$settings['nav_menu'])
|
||
continue;
|
||
if ($tn == 'post_tag' && !$settings['post_tag'])
|
||
continue;
|
||
if ($tn == 'category' && !$settings['category'])
|
||
continue;
|
||
if ($tn == 'post_format' && !$settings['format'])
|
||
continue;
|
||
|
||
// Don't copy custom taxonomy if it's not checked
|
||
if (!in_array($tn, $buin) && !$settings['taxonomy'])
|
||
continue;
|
||
|
||
// Push next term of existing taxonomy
|
||
if (isset($ft[$tn]))
|
||
array_push($ft[$tn], $taxonomy->term_id);
|
||
|
||
// Create new taxonomy and push new term
|
||
else {
|
||
$ft[$tn] = array();
|
||
array_push($ft[$tn], $taxonomy->term_id);
|
||
}
|
||
}
|
||
$is_elementor = cdp_is_elementor_post($post['ID']);
|
||
$content_meta = $is_elementor ? get_post_meta($post['ID'], '_elementor_data', true) : addslashes($post['post_content']);
|
||
|
||
// Create array with required values and contant values
|
||
$new = array(
|
||
'post_title' => ($settings['title'] ? cdp_create_title($post['post_title'], $settings['names'], $post['ID'], $areWePro) : __('Untitled Copy', 'copy-delete-posts')),
|
||
'post_date' => ($settings['date'] ? $post['post_date'] : current_time('mysql')),
|
||
'post_status' => ($settings['status'] ? $post['post_status'] : 'draft'),
|
||
'post_author' => ($settings['author'] ? $post['post_author'] : wp_get_current_user()->ID),
|
||
'post_content' => ($settings['content'] ? $content_meta : ''),
|
||
'comment_status' => $post['comment_status'], // that's additional element which cannot be edited by user
|
||
'post_parent' => $post['post_parent'] // that's additional element which cannot be edited by user
|
||
);
|
||
|
||
// Converter
|
||
if ((($opt == '2' && $swap == 'true') || $swap == 'true') && $areWePro && function_exists('cdpp_post_converter')) {
|
||
$new['post_type'] = cdpp_post_converter($post['post_type']);
|
||
} else {
|
||
$new['post_type'] = $post['post_type'];
|
||
}
|
||
|
||
$ft_tags = [];
|
||
$ft_categories = [];
|
||
foreach ($ft as $taxonomyName => $ids) {
|
||
$fixed_categories = cdp_duplicate_categories($ids, $taxonomyName, $site, $areWePro, $post['post_type'], $new['post_type'], true);
|
||
$ft[$taxonomyName] = $fixed_categories['ids'];
|
||
if ($fixed_categories['taxonomy'] == 'post_tag') $ft_tags = $fixed_categories['ids'];
|
||
if ($fixed_categories['taxonomy'] == 'category') $ft_categories = $fixed_categories['ids'];
|
||
}
|
||
|
||
$new['multisite_taxonomy'] = $ft;
|
||
|
||
// For WooCommerce
|
||
if ($post['post_type'] == 'product_variation' || $post['post_type'] == 'acf-field') {
|
||
$new['post_status'] = 'publish';
|
||
}
|
||
|
||
// Add optional values of post – depending on settings
|
||
if ($settings['slug']){
|
||
$new['post_name'] = $post['post_name'];
|
||
if ($globals['others']['cdp-take-over-original-slug'] == 'true') {
|
||
$original_new_slug = $post['post_name'] . '-old';
|
||
wp_update_post(array(
|
||
'ID' => $post['ID'],
|
||
'post_name' => $original_new_slug
|
||
));
|
||
}
|
||
|
||
}
|
||
if ($settings['excerpt'])
|
||
$new['post_excerpt'] = $post['post_excerpt'];
|
||
if ($settings['template'])
|
||
$new['page_template'] = $post['page_template'];
|
||
if ($settings['password'])
|
||
$new['post_password'] = $post['post_password'];
|
||
if ($settings['menu_order'])
|
||
$new['menu_order'] = $post['menu_order'];
|
||
if ($settings['category']) {
|
||
$fixed_categories = cdp_duplicate_categories($post['post_category'], 'post_category', $site, $areWePro);
|
||
$fixed_categories = array_values(array_unique(array_merge($fixed_categories, $ft_categories)));
|
||
$new['post_category'] = $fixed_categories;
|
||
}
|
||
if ($settings['post_tag'])
|
||
$tags = array_values(array_unique(array_merge($post['tags_input'], $ft_tags)));
|
||
$new['tags_input'] = $tags;
|
||
if ($taxonomies != false)
|
||
$new['tax_input'] = $ft;
|
||
|
||
// For ACF Fields
|
||
if ($post['post_type'] == 'acf-field') {
|
||
// $new['post_name'] = 'group_' . md5(uniqid($post['post_name'], true));
|
||
$new['post_name'] = $post['post_name'];
|
||
$new['post_excerpt'] = $post['post_excerpt'];
|
||
$new['post_title'] = $post['post_title'];
|
||
}
|
||
if ($post['post_type'] == 'acf-field-group') {
|
||
// $new['post_name'] = 'field_' . md5(uniqid($post['post_name'], true));
|
||
$new['post_name'] = $post['post_name'];
|
||
$new['post_excerpt'] = $post['post_excerpt'];
|
||
}
|
||
|
||
// Return filtered data of current post
|
||
return $new;
|
||
}
|
||
|
||
/**
|
||
* This local function filters post data by user settings
|
||
* @param $metas (array of wordpress post/page meta data)
|
||
* @param $settings (array of preselected settings of profile or by user)
|
||
* @return array with metadata values for post || false on wrong $metas
|
||
*/
|
||
function cdp_filter_meta($metas, $settings, $id, $areWePro, $site, $title) {
|
||
|
||
// If $metas has wrong format return false
|
||
if (!(is_array($metas) || is_object($metas)))
|
||
return false;
|
||
|
||
// Create empty array for filtered meta data
|
||
$prepared = array(
|
||
// Add or replace ours copy tracker
|
||
array('_cdp_origin' => $id),
|
||
array('_cdp_origin_site' => $site),
|
||
array('_cdp_origin_title' => $title),
|
||
array('_cdp_counter' => '0')
|
||
);
|
||
|
||
if (isset($metas['_elementor_data']) && $settings['content'] !== true) { // Remove elementor content if content copy is disabled
|
||
$prepared[] = array('_elementor_data' => []);
|
||
unset($metas['_elementor_data']);
|
||
}
|
||
|
||
// Iterate through every meta index
|
||
foreach ($metas as $meta => $vals) {
|
||
|
||
// Conditions
|
||
$a = ($areWePro && function_exists('cdpp_check_yoast')) ? cdpp_check_yoast($settings, $meta) : false;
|
||
$b = ($areWePro && function_exists('cdpp_check_usm')) ? cdpp_check_usm($settings, $meta) : false;
|
||
$c = ($areWePro && function_exists('cdpp_check_woo')) ? cdpp_check_woo($settings, $meta, $id) : false;
|
||
$d = ($settings['f_image'] && $meta == '_thumbnail_id') ? true : false;
|
||
$e = (mb_substr($meta, 0, 4) == '_wp_') ? true : false;
|
||
$f = ($meta == '_thumbnail_id' && $settings['f_image']) ? true : false;
|
||
$g = ($meta == '_cdp_origin') ? true : false;
|
||
$h = (strpos($meta, 'elementor') === false) ? false : true;
|
||
$i = ($areWePro && function_exists('cdpp_check_all_meta')) ? cdpp_check_all_meta($settings, $meta) : false;
|
||
|
||
// Deny these meta tags (they may cause conflicts with the further post edit)
|
||
$j = (mb_substr($meta, 0, 5) == '_trp_') ? false : true;
|
||
|
||
// If any of above condition is true pass the meta tag
|
||
if (($a || $b || $c || $d || $e || $f || $g || $h || $i) && $j) {
|
||
|
||
// Prepare data and insert filtered to results
|
||
foreach ($vals as $val)
|
||
$prepared[] = array($meta => $val);
|
||
|
||
} else {
|
||
|
||
// error_log(print_r($vals, true));
|
||
|
||
}
|
||
}
|
||
|
||
// Return results
|
||
return $prepared;
|
||
}
|
||
|
||
/**
|
||
* This local function format title by user settings
|
||
* @param $title (string)
|
||
* @param $settings (array of name settings preselected in profile)
|
||
* @return string formated title
|
||
*/
|
||
function cdp_create_title($title, $settings, $id, $areWePro) {
|
||
|
||
// Date formats
|
||
$date_format = intval($settings['format']);
|
||
|
||
// Get right format
|
||
if ($date_format == 1)
|
||
$date_format = 'm/d/Y';
|
||
else if ($date_format == 2)
|
||
$date_format = 'd/m/Y';
|
||
else {
|
||
if ($areWePro && function_exists('cdpp_custom_date'))
|
||
$date_format = cdpp_custom_date($settings);
|
||
else
|
||
$date_format = 'd/m/Y';
|
||
}
|
||
|
||
// Create date and time replacements
|
||
$curr = current_time('timestamp', true);
|
||
$date = date($date_format, $curr);
|
||
$time = date('H:i:s', $curr);
|
||
|
||
// Concat whole title with prefix and suffix
|
||
$new_title = $settings['prefix'] . ' ' . $title . ' ' . $settings['suffix'];
|
||
|
||
// Make replace of placeholders
|
||
$new_title = str_replace('[CurrentDate]', $date, $new_title);
|
||
$new_title = str_replace('[CurrentTime]', $time, $new_title);
|
||
|
||
// Return formatted title
|
||
return $new_title;
|
||
}
|
||
|
||
function cdp_replace_url_in_content($content, $oldURL, $newURL) {
|
||
|
||
$wasSerialized = false;
|
||
|
||
if (is_serialized($content)) {
|
||
$wasSerialized = true;
|
||
$content = unserialize(stripslashes($content));
|
||
$content = json_encode($content);
|
||
}
|
||
|
||
$content = str_replace('http://' . $oldURL, $newURL, $content);
|
||
$content = str_replace('https://' . $oldURL, $newURL, $content);
|
||
$content = str_replace('http:\/\/' . $oldURL, $newURL, $content);
|
||
$content = str_replace('https:\/\/' . $oldURL, $newURL, $content);
|
||
$content = str_replace('http://www.' . $oldURL, $newURL, $content);
|
||
$content = str_replace('https://www.' . $oldURL, $newURL, $content);
|
||
$content = str_replace('http:\/\/www.' . $oldURL, $newURL, $content);
|
||
$content = str_replace('https:\/\/www.' . $oldURL, $newURL, $content);
|
||
$content = str_replace('http://' . $oldURL, $newURL, $content);
|
||
$content = str_replace('https://' . $oldURL, $newURL, $content);
|
||
$content = str_replace('http://www.' . $oldURL, $newURL, $content);
|
||
$content = str_replace('https://www.' . $oldURL, $newURL, $content);
|
||
|
||
if ($wasSerialized) {
|
||
$content = json_decode($content, true);
|
||
$content = serialize((array) $content);
|
||
}
|
||
|
||
return $content;
|
||
|
||
}
|
||
|
||
/**
|
||
* This local function inserts whole post into database
|
||
* @param $data (array prepared by cdp_filter_post function)
|
||
* @param $times (int how many times should this function copy post)
|
||
* @return array of new inserted post(s) and error status
|
||
* Structure of return array: { ids: [$ids], error: (count of errors) }
|
||
*/
|
||
function cdp_insert_post($id, $data, $times, $areWePro, $isChild = false, $p_ids = null, $site = -1) {
|
||
|
||
// Get Wordpress database
|
||
global $wpdb;
|
||
|
||
$multisite_taxonomy = $data['multisite_taxonomy'];
|
||
unset($data['multisite_taxonomy']);
|
||
|
||
|
||
// Global Settings
|
||
$gos = cdp_default_global_options();
|
||
$gosCurrent = get_option('_cdp_globals');
|
||
|
||
if (!is_array($gosCurrent) || !isset($gosCurrent['others'])) {
|
||
$gosCurrent = $gos;
|
||
} else {
|
||
$gosCurrent = $gosCurrent['others'];
|
||
}
|
||
|
||
if (!isset($gosCurrent['cdp-premium-replace-domain'])) {
|
||
$gosCurrent['cdp-premium-replace-domain'] = $gos['cdp-premium-replace-domain'];
|
||
}
|
||
|
||
// Create empty array for new id(s) and error(s)
|
||
$results = array('ids' => array(), 'error' => 0, 'counter' => 0);
|
||
|
||
// Prevent SQL injection
|
||
if (!is_numeric($id)) {
|
||
|
||
echo json_encode(array('status' => 'error', 'message' => __('Invalid ID argument.', 'copy-delete-posts')));
|
||
exit;
|
||
|
||
}
|
||
|
||
// And just in case
|
||
$id = esc_sql(intval($id));
|
||
|
||
// Get Counter value
|
||
$prefix = (($site != -1) ? $wpdb->get_blog_prefix($site) : $wpdb->get_blog_prefix());
|
||
$newestId = $wpdb->get_results("SELECT post_id FROM {$prefix}postmeta WHERE meta_key = '_cdp_origin' AND meta_value = {$id} ORDER BY post_id DESC LIMIT 1", ARRAY_A);
|
||
$newestId = ((isset($newestId[0])) ? (intval($newestId[0]['post_id'])) : false);
|
||
if (isset($newestId) && $newestId != false && $newestId > 0)
|
||
$counter = $wpdb->get_results("SELECT meta_value AS 'Counter' FROM {$prefix}postmeta WHERE meta_key = '_cdp_counter' AND post_id = {$newestId} ORDER BY post_id DESC", ARRAY_A)[0]['Counter'];
|
||
else
|
||
$counter = 1;
|
||
|
||
$base_title = $data['post_title'];
|
||
$counter = intval($counter) + 1;
|
||
|
||
$parsedPostHomeURL = parse_url(get_home_url());
|
||
$buildUrl = $parsedPostHomeURL['host'];
|
||
if (isset($parsedPostHomeURL['path'])) {
|
||
$buildUrl .= $parsedPostHomeURL['path'];
|
||
}
|
||
|
||
$uploadsDirOld = wp_upload_dir()['basedir'];
|
||
|
||
// Handle multisite for premium
|
||
if ($areWePro && function_exists('cdpp_handle_multisite'))
|
||
cdpp_handle_multisite($site);
|
||
|
||
$uploadsDirNew = wp_upload_dir()['basedir'];
|
||
$alreadyReplaced = false;
|
||
$originalPostName = isset($data['post_name']) ? $data['post_name'] : '';
|
||
// Loop for each post iteration
|
||
for ($i = 0; $i < $times; ++$i) {
|
||
|
||
// Change parent if it's child
|
||
if ($isChild)
|
||
$data['post_parent'] = $p_ids['posts'][$i];
|
||
|
||
// Replace title with Counter if multiple copies
|
||
$data['post_title'] = str_replace('[Counter]', ($counter + $i), $base_title);
|
||
if ($i > 0 && isset($data['post_name']) && strlen($data['post_name']) > 0) {
|
||
$data['post_name'] = $originalPostName . '-' . $i;
|
||
}
|
||
|
||
// Adjust URLs for new subsite
|
||
if ($alreadyReplaced == false && $areWePro && isset($gosCurrent['cdp-premium-replace-domain']) && $gosCurrent['cdp-premium-replace-domain'] == 'true') {
|
||
if (isset($data['post_content']) && !empty($data['post_content']) && strlen($data['post_content']) > strlen($buildUrl)) {
|
||
|
||
$adjustedUrl = get_home_url();
|
||
$data['post_content'] = cdp_replace_url_in_content($data['post_content'], $buildUrl, $adjustedUrl);
|
||
$alreadyReplaced = true;
|
||
|
||
}
|
||
}
|
||
|
||
// Insert post with filtered data
|
||
$new = wp_insert_post($data, true);
|
||
|
||
// Check if the post is inserted successfully and append array
|
||
if (is_numeric($new)) {
|
||
|
||
array_push($results['ids'], $new);
|
||
|
||
// SeedProd Premium CSS files
|
||
$oldCssFile = $uploadsDirOld . '/seedprod-css/style-' . $id . '.css';
|
||
$newCssFile = $uploadsDirNew . '/seedprod-css/style-' . $new . '.css';
|
||
|
||
if (file_exists($oldCssFile) && is_file($oldCssFile)) {
|
||
@copy($oldCssFile, $newCssFile);
|
||
}
|
||
|
||
// Elementor cached CSS
|
||
$oldCssFile = $uploadsDirOld . '/elementor/css/post-' . $id . '.css';
|
||
$newCssFile = $uploadsDirNew . '/elementor/css/post-' . $new . '.css';
|
||
if (file_exists($oldCssFile) && is_file($oldCssFile)) {
|
||
$customCssContent = file_get_contents($oldCssFile);
|
||
$customCssContent = str_replace('-' . $id, '-' . $new, $customCssContent);
|
||
if (!file_exists(dirname($newCssFile))) {
|
||
mkdir(dirname($newCssFile), 0755, true);
|
||
}
|
||
file_put_contents($newCssFile, $customCssContent);
|
||
unset($customCssContent);
|
||
}
|
||
|
||
} else {
|
||
|
||
$results['error']++;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
foreach ($results['ids'] as $post_id_index => $inserted_post_id) {
|
||
foreach ($multisite_taxonomy as $taxonomyName => $ids) {
|
||
wp_set_post_terms($inserted_post_id, $ids, $taxonomyName, true);
|
||
}
|
||
}
|
||
|
||
// Handle multisite for premium fix
|
||
if ($areWePro && function_exists('cdpp_handle_multisite_after'))
|
||
cdpp_handle_multisite_after($site);
|
||
|
||
// Set first counter number for future
|
||
$results['counter'] = $counter;
|
||
|
||
// Return array with results
|
||
return $results;
|
||
}
|
||
|
||
/**
|
||
* This local function filter and adds missing meta to added post
|
||
* @param $ids (array of post ids)
|
||
* @param $metas (filtered meta data with cdp_filter_meta function)
|
||
* @return array structure below
|
||
* { ids: { [id] => [failed times]}, error: { [id] => [failed times]} }
|
||
*/
|
||
function cdp_insert_post_meta($ids, $metas, $areWePro, $counter, $site) {
|
||
|
||
// Handle multisite for premium
|
||
if ($areWePro && function_exists('cdpp_handle_multisite'))
|
||
cdpp_handle_multisite($site);
|
||
|
||
// Create empty array for new id(s) and error(s)
|
||
$results = array('ids' => array(), 'error' => array());
|
||
|
||
// Iterate through every inserted post
|
||
foreach ($ids as $id) {
|
||
|
||
// Iterate through every meta tag
|
||
foreach ($metas as $meta_id => $meta) {
|
||
|
||
// Get individual data from metas array
|
||
foreach ($meta as $key => $val) {
|
||
|
||
// Replace the counter with dynamic value
|
||
if ($key == '_cdp_counter')
|
||
$val = $counter;
|
||
|
||
if (is_serialized($val)) {
|
||
$val = @maybe_unserialize($val);
|
||
} else {
|
||
$val = @wp_slash($val);
|
||
}
|
||
|
||
// Insert meta tag
|
||
$res = add_post_meta($id, $key, $val);
|
||
|
||
// Check if the insert was successfull
|
||
if ($res != false) {
|
||
if (!isset($results['ids'][$id]))
|
||
$results['ids'][$id] = [];
|
||
array_push($results['ids'][$id], array($key, $val));
|
||
} else {
|
||
if (!isset($results['error'][$id]))
|
||
$results['error'][$id] = [];
|
||
array_push($results['error'][$id], array($key, $val));
|
||
}
|
||
}
|
||
}
|
||
|
||
// Iterate the counter
|
||
$counter++;
|
||
}
|
||
|
||
// Fix multisite handler
|
||
if ($areWePro && function_exists('cdpp_handle_multisite_after'))
|
||
cdpp_handle_multisite_after($site);
|
||
|
||
// Return the results
|
||
return $results;
|
||
}
|
||
|
||
/**
|
||
* This local function search for childs and catch their IDs
|
||
* @param $id string/int (post id)
|
||
* @return array of child(s) ID(s)
|
||
*/
|
||
function cdp_check_childs($id, $areWePro) {
|
||
$childs = [];
|
||
$childrens = get_children(array(
|
||
'post_parent' => $id,
|
||
'post_type' => get_post_types(),
|
||
'suppress_filters' => true
|
||
));
|
||
|
||
foreach ($childrens as $i => $child) {
|
||
if ($child->post_type == 'acf-field' && !$areWePro) continue;
|
||
if ($child->post_type == 'attachment') continue;
|
||
array_push($childs, $child->ID);
|
||
}
|
||
|
||
return $childs;
|
||
}
|
||
|
||
/**
|
||
* This local function copies original attachments
|
||
* @param $path string (path to original file)
|
||
* @return string path to new file
|
||
*/
|
||
function cdp_copy_attachment($path = '', $destination = '') {
|
||
if ($path == '' || $destination == '')
|
||
return false;
|
||
|
||
$dirname = $destination;
|
||
$name = basename($path);
|
||
$actual_name = pathinfo($name, PATHINFO_FILENAME);
|
||
$original_name = $actual_name;
|
||
$extension = pathinfo($name, PATHINFO_EXTENSION);
|
||
|
||
if (file_exists($dirname . '/' . $actual_name . "." . $extension)) {
|
||
return $dirname . '/' . $actual_name . "." . $extension;
|
||
}
|
||
|
||
$i = 1;
|
||
while (file_exists($dirname . '/' . $actual_name . "." . $extension)) {
|
||
$actual_name = (string) $original_name . '-' . $i;
|
||
$name = $actual_name . '.' . $extension;
|
||
$i++;
|
||
}
|
||
|
||
copy($path, $dirname . '/' . $name);
|
||
return $dirname . '/' . $name;
|
||
}
|
||
|
||
/**
|
||
* This local function gets copy and insert attachments
|
||
* @param $id int/string of post
|
||
* @return array of inserted attachments
|
||
*/
|
||
function cdp_insert_attachments($id, $inserted_posts, $areWePro, $site, $featuredImageOnly = false) {
|
||
$inserts = array();
|
||
$media = get_attached_media('', $id);
|
||
|
||
if ($featuredImageOnly != false && (is_object($featuredImageOnly) || is_array($featuredImageOnly))) {
|
||
$media = $featuredImageOnly;
|
||
}
|
||
|
||
// Handle multisite for premium
|
||
if ($areWePro && function_exists('cdpp_handle_multisite'))
|
||
cdpp_handle_multisite($site);
|
||
|
||
// Fix wordpress multisite path
|
||
add_filter('upload_dir', 'cdp_fix_upload_paths');
|
||
$wp_upload_dir = wp_upload_dir();
|
||
remove_filter('upload_dir', 'cdp_fix_upload_paths');
|
||
|
||
// Handle multisite for premium fix
|
||
if ($areWePro && function_exists('cdpp_handle_multisite_after'))
|
||
cdpp_handle_multisite_after($site);
|
||
|
||
foreach ($media as $i => $m) {
|
||
if (get_attached_file($m->ID) == '')
|
||
continue;
|
||
|
||
if (!file_exists($wp_upload_dir['path']) && !is_dir($wp_upload_dir['path'])) {
|
||
mkdir($wp_upload_dir['path'], 0755, true);
|
||
}
|
||
|
||
$path = cdp_copy_attachment(get_attached_file($m->ID), $wp_upload_dir['path']);
|
||
|
||
$filename = $path;
|
||
$parent_post_id = $inserted_posts['ids'][0];
|
||
|
||
$filetype = wp_check_filetype(basename($filename), null);
|
||
|
||
// Handle multisite for premium
|
||
if ($areWePro && function_exists('cdpp_handle_multisite'))
|
||
cdpp_handle_multisite($site);
|
||
|
||
$attachment = array(
|
||
'guid' => $wp_upload_dir['url'] . '/' . basename($filename),
|
||
'post_mime_type' => $filetype['type'],
|
||
'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
|
||
'post_content' => '',
|
||
'post_status' => 'inherit'
|
||
);
|
||
|
||
$attach_id = wp_insert_attachment($attachment, $filename, $parent_post_id);
|
||
array_push($inserts, array('url' => wp_get_attachment_url($attach_id), 'id' => $attach_id));
|
||
|
||
$attach_data = wp_generate_attachment_metadata($attach_id, $filename);
|
||
wp_update_attachment_metadata($attach_id, $attach_data);
|
||
|
||
// Handle multisite for premium fix
|
||
if ($areWePro && function_exists('cdpp_handle_multisite_after'))
|
||
cdpp_handle_multisite_after($site);
|
||
}
|
||
|
||
return $inserts;
|
||
}
|
||
|
||
/**
|
||
* This local function gets comments and copy them
|
||
* @param $id int/string of base post
|
||
* @param $dests array of post ids where the comms from $id should be copied
|
||
* @return array of inserted comments
|
||
*/
|
||
function cdp_copy_comments($id, $dests) {
|
||
$comments = get_comments(array('post_id' => $id));
|
||
$curr = current_time('mysql');
|
||
$all_inserts = array();
|
||
$all_inserts['fix_try'] = array();
|
||
$all_inserts['olds'] = '';
|
||
|
||
foreach ($dests as $dest) {
|
||
$p = 0;
|
||
$olds = array();
|
||
|
||
$cm1 = $comments;
|
||
foreach ($cm1 as $i => $c) {
|
||
$c = $c->to_array();
|
||
$old_id = $c['comment_ID'];
|
||
$parent = $c['comment_parent'];
|
||
|
||
$c['comment_date'] = $curr;
|
||
$c['comment_date_gmt'] = $curr;
|
||
$c['comment_post_ID'] = $dest;
|
||
$c['comment_parent'] = 0;
|
||
if ($parent != "0")
|
||
$p++;
|
||
|
||
$new_id = @wp_insert_comment($c);
|
||
|
||
$olds[$old_id] = array('new' => $new_id, 'old_parent_id' => $parent);
|
||
array_push($all_inserts, array('old' => $old_id, 'new' => $new_id, 'parent' => $parent));
|
||
}
|
||
|
||
if ($p != 0) {
|
||
$cm2 = $comments;
|
||
foreach ($cm2 as $j => $m) {
|
||
if ($m->comment_parent != "0" && $olds[$m->comment_ID]['old_parent_id'] == $m->comment_parent) {
|
||
$post = get_comment($olds[$m->comment_ID]['new']);
|
||
$post = $post->to_array();
|
||
$post['comment_parent'] = $olds[$m->comment_parent]['new'];
|
||
wp_update_comment($post);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return $all_inserts;
|
||
}
|
||
|
||
/**
|
||
* cdp_clone_woocommerce_tables - Clones additional tables
|
||
*
|
||
* @return void
|
||
*/
|
||
function cdp_clone_woocommerce_tables($sourceID, $newID) {
|
||
|
||
global $wpdb;
|
||
$tables = $wpdb->get_results('SHOW TABLES;');
|
||
$parsedTables = [];
|
||
foreach ($tables as $names) {
|
||
foreach ($names as $table => $name) {
|
||
$parsedTables[] = $name;
|
||
}
|
||
}
|
||
|
||
$affectedTables = [
|
||
'wusp_group_product_price_mapping',
|
||
'wusp_role_pricing_mapping',
|
||
'wusp_user_pricing_mapping'
|
||
];
|
||
|
||
for ($i = 0; $i < sizeof($parsedTables); ++$i) {
|
||
$table = $parsedTables[$i];
|
||
|
||
for ($j = 0; $j < sizeof($affectedTables); ++$j) {
|
||
$affectTable = $affectedTables[$j];
|
||
if (substr($table, -strlen($affectTable)) == $affectTable) {
|
||
$results = $wpdb->get_results($wpdb->prepare(
|
||
"SELECT * FROM %i WHERE %i = %d",
|
||
array($table, 'product_id', $sourceID)
|
||
));
|
||
|
||
foreach($results as $result => $row) {
|
||
$columns = [];
|
||
$values = [];
|
||
|
||
foreach($row as $column => $value) {
|
||
if ($column == 'id') continue;
|
||
$columns[] = $column;
|
||
if ($column == 'product_id') $values[] = $newID;
|
||
else $values[] = $value;
|
||
}
|
||
|
||
$preparedValues = [];
|
||
$preparedValues = array_merge($preparedValues, [$table], $columns, $values);
|
||
|
||
$query = $wpdb->get_results($wpdb->prepare(
|
||
"INSERT INTO %i (" . implode(', ', array_fill(0, sizeof($columns), '%i')) . ") VALUES (" . implode(', ', array_fill(0, sizeof($values), '%s')) . ")",
|
||
$preparedValues
|
||
));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
// Main code for this duplication – for each id (post) do whole process
|
||
function cdp_process_ids($ids, $swap, $settings, $times, $site, $areWePro, $g, $isChild = false, $p_ids = null) {
|
||
|
||
// Make it clear
|
||
$globals = cdp_default_global_options();
|
||
if ($g != false)
|
||
$globals = $g;
|
||
$g = $globals['others'];
|
||
|
||
// Return data storage
|
||
$output = [];
|
||
$new_posts = array('parents' => array(), 'childs' => array(), 'ids' => array());
|
||
|
||
// Iterate each id
|
||
foreach ($ids as $id) {
|
||
|
||
// Get post data and meta data
|
||
$post = get_post($id)->to_array();
|
||
$meta = get_post_custom($id);
|
||
$taxonomies = wp_get_object_terms($id, get_taxonomies());
|
||
|
||
// Check if this post type is allowed to copy
|
||
$type = $post['post_type'];
|
||
if ((isset($g['cdp-content-pages']) && $g['cdp-content-pages'] == 'false') && $type == 'page')
|
||
continue;
|
||
if ((isset($g['cdp-content-posts']) && $g['cdp-content-posts'] == 'false') && $type == 'post')
|
||
continue;
|
||
if ((isset($g['cdp-content-custom']) && $g['cdp-content-custom'] == 'false') && ($type != 'page' && $type != 'post'))
|
||
continue;
|
||
|
||
// Post converting?
|
||
$pConv = false;
|
||
if (isset($globals['postConverter'])) {
|
||
$pConv = $globals['postConverter'];
|
||
}
|
||
|
||
// Run process and validate response
|
||
$childrens = cdp_check_childs($id, $areWePro); // if sizeof($this) == has childs
|
||
$post_data = cdp_filter_post($post, $swap, $pConv, $settings, $site, $taxonomies, $areWePro, $globals); // can be false
|
||
$meta_data = cdp_filter_meta($meta, $settings, $id, $areWePro, $site, $post_data['post_title']); // can be false
|
||
if (isset($meta['_elementor_template_type'])) { // Add Elementor template type to post data to prevent setting the type of template to 'page' by default in Elementor after creating the new post
|
||
$post_data['meta_input']['_elementor_template_type'] = $meta['_elementor_template_type'][0];
|
||
unset($meta['_elementor_template_type']);
|
||
}
|
||
$inserted_posts = cdp_insert_post($id, $post_data, $times, $areWePro, $isChild, $p_ids, $site); // $res['error'] must be == 0
|
||
$inserted_metas = cdp_insert_post_meta($inserted_posts['ids'], $meta_data, $areWePro, $inserted_posts['counter'], $site); // sizeof($res['error']) must be == 0
|
||
|
||
// Comments copy
|
||
if ($settings['comments'])
|
||
$inserted_comments = cdp_copy_comments($id, $inserted_posts['ids']);
|
||
$cms = get_comments(array('post_id' => $id));
|
||
|
||
// Post format
|
||
if ($settings['format'])
|
||
foreach ($inserted_posts['ids'] as $i => $tid)
|
||
$isReFormat = set_post_format($tid, get_post_format($id));
|
||
|
||
if ($areWePro && function_exists('cdpp_check_woo') && cdpp_check_woo($settings, $meta, $id)) {
|
||
foreach ($inserted_posts['ids'] as $i => $tid) {
|
||
cdp_clone_woocommerce_tables($id, $tid);
|
||
}
|
||
}
|
||
|
||
if ($settings['f_image']) {
|
||
$thumbnail_id = get_post_thumbnail_id($id);
|
||
if (!is_bool($thumbnail_id) && $thumbnail_id > 0) {
|
||
$thumbnail_file = get_attached_file($thumbnail_id);
|
||
if (!is_bool($thumbnail_file) && is_string($thumbnail_file)) {
|
||
|
||
if ($site != -1 && $areWePro) {
|
||
|
||
$thumbObj = [(object) ['ID' => $thumbnail_id]];
|
||
$thumbNewId = cdp_insert_attachments($id, $inserted_posts, $areWePro, $site, $thumbObj);
|
||
$thumbNewId = $thumbNewId[0]['id'];
|
||
|
||
if ($areWePro && function_exists('cdpp_handle_multisite')) {
|
||
cdpp_handle_multisite($site);
|
||
}
|
||
|
||
foreach ($inserted_posts['ids'] as $i_id) {
|
||
update_post_meta($i_id, '_thumbnail_id', $thumbNewId);
|
||
}
|
||
|
||
if ($areWePro && function_exists('cdpp_handle_multisite_after')) {
|
||
cdpp_handle_multisite_after($site);
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
// Featured image copy
|
||
if ($settings['attachments'])
|
||
$inserted_attachments = cdp_insert_attachments($id, $inserted_posts, $areWePro, $site);
|
||
else
|
||
$inserted_attachments = false;
|
||
|
||
// Copy childrens recursively if exist
|
||
if ($settings['children'] && sizeof($childrens) > 0) {
|
||
$child_helpers = array('posts' => $inserted_posts['ids']);
|
||
$inserted_childs = cdp_process_ids($childrens, $swap, $settings, $times, $site, $areWePro, $globals, true, $child_helpers);
|
||
array_push($new_posts['childs'], array($id => $inserted_childs['$new_posts']['ids']));
|
||
}
|
||
|
||
// Add new inserted IDs
|
||
foreach ($inserted_posts['ids'] as $i_id)
|
||
array_push($new_posts['parents'], $i_id);
|
||
|
||
// Merge for easier read
|
||
$new_posts['ids'] = array_merge($new_posts['ids'], $new_posts['parents'], $new_posts['childs']);
|
||
}
|
||
|
||
// Return all data to main request
|
||
return array('$output' => $output, '$new_posts' => $new_posts);
|
||
}
|
||
|
||
// Run the machine for selected post(s)
|
||
$g = get_option('_cdp_globals', array());
|
||
|
||
for ($i = 0; $i < sizeof($site); ++$i) {
|
||
$new_insertions = cdp_process_ids($ids, $swap, $settings, $times, $site[$i], $areWePro, $g);
|
||
}
|
||
|
||
// Handle multisite for premium
|
||
if ($areWePro && function_exists('cdpp_handle_multisite'))
|
||
cdpp_handle_multisite($site[0]);
|
||
|
||
$pConv = false;
|
||
if (isset($g['postConverter']) && $areWePro)
|
||
$pConv = (($g['postConverter'] === '2' || $g['postConverter'] === 2) ? true : false);
|
||
|
||
// Output link if it's edited post
|
||
$aCop = ((isset($g['afterCopy'])) ? $g['afterCopy'] : '1');
|
||
if (($data['type'] == 'copy-custom-link' || $aCop == '2'))
|
||
$output['link'] = get_edit_post_link($new_insertions['$new_posts']['parents'][0], 'x');
|
||
|
||
if ($pConv == true && !($data['type'] == 'copy-custom-link' || $aCop == '2'))
|
||
$output['link'] = 'pConv';
|
||
else
|
||
update_option('_cdp_show_copy', true);
|
||
|
||
// Regenerate Elementor cache if needed
|
||
if (is_plugin_active('elementor/elementor.php') && class_exists('\Elementor\Plugin')) {
|
||
try { \Elementor\Plugin::$instance->files_manager->clear_cache(); }
|
||
catch (\Throwable $e) {}
|
||
catch (\Exception $e) {}
|
||
}
|
||
|
||
// Handle multisite for premium fix
|
||
if ($areWePro && function_exists('cdpp_handle_multisite_after'))
|
||
cdpp_handle_multisite_after($site[0]);
|
||
|
||
// Check performance by time
|
||
$copyTime = microtime(true) - $timein;
|
||
$copyTimePerOne = $copyTime / $times;
|
||
|
||
// Set only if had good performance all the time
|
||
$isSlowPerf = false;
|
||
if (get_option('cdp_latest_slow_performance', false) == false) {
|
||
$isSlowPerf = false;
|
||
}
|
||
|
||
// Check if the copy time of one page was slower than 0.035 of second
|
||
if ($copyTimePerOne > 0.035) {
|
||
$isSlowPerf = true;
|
||
}
|
||
|
||
// Update history with logs
|
||
$logs = get_option('cdp_copy_logs_times', array());
|
||
if (sizeof($logs) >= 50) {
|
||
$logs = array_slice($logs, 0, 48);
|
||
}
|
||
$logs = array_values($logs);
|
||
|
||
if (sizeof($logs) < 2) {
|
||
$isSlowPerf = false;
|
||
}
|
||
|
||
// Set the performance status
|
||
update_option('cdp_latest_slow_performance', $isSlowPerf);
|
||
|
||
array_unshift($logs, array('amount' => $times, 'time' => $copyTime, 'perOne' => $copyTimePerOne, 'data' => time(), 'memory' => memory_get_usage(), 'peak' => memory_get_peak_usage(true)));
|
||
update_option('cdp_copy_logs_times', $logs);
|
||
|
||
echo json_encode(cdp_sanitize_array($output));
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will return profile information for presets.
|
||
* @return object of settings by requested profile
|
||
* @since 1.0.0
|
||
*/
|
||
function cdp_get_profile() {
|
||
|
||
if (function_exists('cdpp_get_all_profiles'))
|
||
cdpp_get_profile();
|
||
else {
|
||
|
||
// Search for the settings of profile
|
||
$settings = get_option('_cdp_profiles')['default'];
|
||
|
||
// Display those settings
|
||
echo json_encode(cdp_sanitize_array($settings));
|
||
}
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will return all profile information for manager.
|
||
* @return object of settings by requested profile
|
||
* @since 1.0.0
|
||
*/
|
||
function cdp_get_all_profiles() {
|
||
|
||
if (function_exists('cdpp_get_all_profiles'))
|
||
cdpp_get_all_profiles();
|
||
else
|
||
cdp_get_profile();
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will return all not trashed posts
|
||
* @return object of posts and success or fail message
|
||
*/
|
||
function cdp_get_all_posts() {
|
||
$output = array();
|
||
|
||
$args = array(
|
||
'numberposts' => -1,
|
||
'post_type' => 'post',
|
||
'post_status' => 'publish,private,draft,future,pending,inherit,sticky'
|
||
);
|
||
|
||
$output['posts'] = get_posts($args);
|
||
$args['post_type'] = 'page';
|
||
$output['pages'] = get_posts($args);
|
||
$output['custom'] = array();
|
||
|
||
$post_types = get_post_types(array('public' => true, '_builtin' => false));
|
||
|
||
if (sizeof($post_types) > 0)
|
||
$output['custom'] = get_posts(array(
|
||
'post_type' => $post_types,
|
||
'numberposts' => -1,
|
||
'post_status' => 'publish,private,draft,future,pending,inherit,sticky'
|
||
));
|
||
|
||
$output['meta'] = array();
|
||
foreach ($output['posts'] as $k => $p)
|
||
$output['meta'][$p->ID] = get_post_meta($p->ID);
|
||
foreach ($output['pages'] as $k => $p)
|
||
$output['meta'][$p->ID] = get_post_meta($p->ID);
|
||
foreach ($output['custom'] as $k => $p)
|
||
$output['meta'][$p->ID] = get_post_meta($p->ID);
|
||
|
||
echo json_encode(cdp_sanitize_array($output));
|
||
}
|
||
|
||
/** –– **\
|
||
* This function return either the given post id is elementor post or not
|
||
* @param int $post_id
|
||
* @return boolean
|
||
*/
|
||
function cdp_is_elementor_post($post_id) {
|
||
if (get_post_meta($post_id, '_elementor_edit_mode', true) === 'builder') {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will delete all posts in array PERMANENTLY!
|
||
* @return object of success message or error
|
||
*/
|
||
function cdp_delete_posts() {
|
||
$ids = ((isset($_POST['ids'])) ? cdp_sanitize_array($_POST['ids']) : false); // ids to delete
|
||
$throttling = sanitize_text_field($_POST['throttling']); // throttling if enabeld
|
||
$thc = sanitize_text_field($_POST['thc']); // throttling count if enabeld
|
||
$thrs = sanitize_text_field($_POST['thrs']) == 'true' ? true : false; // trash or not?
|
||
$redi = sanitize_text_field($_POST['redi']) == 'true' ? true : false; // redirect if enabled
|
||
$auit = sanitize_text_field($_POST['auit']) == 'true' ? true : false; // auit if enabled
|
||
$auitd = ((isset($_POST['auitd'])) ? cdp_sanitize_array($_POST['auitd']) : false); // auitd if auit enabled
|
||
|
||
$prepared_ids = array();
|
||
$inGroup = 0;
|
||
$curr = current_time('timestamp');
|
||
$token = uniqid($curr, true);
|
||
$cdp_cron = get_option('_cdp_crons');
|
||
$site = is_multisite() ? get_current_blog_id() : '-1';
|
||
if ($cdp_cron == false)
|
||
$cdp_cron = array();
|
||
$cdp_cron[$token] = array(
|
||
'start' => $curr,
|
||
'ids' => $ids,
|
||
'done' => false,
|
||
'shown' => false,
|
||
'f' => 'delete',
|
||
'del_size' => sizeof($ids),
|
||
'handler' => 'cdp_cron_delete',
|
||
'auit' => $auit,
|
||
'auitd' => $auitd
|
||
);
|
||
$cdp_cron[$token]['tasks'] = array();
|
||
$cdp_cron[$token]['args'] = array();
|
||
|
||
if ($throttling == '1' && $thc && intval($thc) >= 1 && intval($thc) <= 10240) {
|
||
|
||
$inGroup = ceil(intval($thc) / 30);
|
||
|
||
for ($i = 0, $k = 2; $i < sizeof($ids); $i = $i + $inGroup, $k++)
|
||
$cdp_cron[$token]['tasks']["-$k"] = false;
|
||
|
||
update_option('_cdp_crons', $cdp_cron);
|
||
for ($i = 0, $k = 2; $i < sizeof($ids); $i = $i + $inGroup, $k++) {
|
||
$tg = array();
|
||
$tt = array('tsk' => "-" . $k, 'token' => $token);
|
||
|
||
for ($j = $i; $j < ($i + $inGroup); $j++)
|
||
if (isset($ids[$j]))
|
||
array_push($tg, $ids[$j]);
|
||
|
||
array_push($prepared_ids, $tg);
|
||
$time = $k * 2;
|
||
$args = array(array('ids' => $tg, 'site' => $site, 'trash' => $thrs, 'token' => $tt));
|
||
wp_schedule_single_event(strtotime("+$time seconds"), 'cdp_cron_delete', $args);
|
||
array_push($cdp_cron[$token]['args'], $args);
|
||
}
|
||
} else {
|
||
|
||
$cdp_cron[$token]['tasks']["-0"] = false;
|
||
update_option('_cdp_crons', $cdp_cron);
|
||
$tt = array('tsk' => "-0", 'token' => $token);
|
||
$args = array(array('ids' => $ids, 'site' => $site, 'trash' => $thrs, 'token' => $tt));
|
||
wp_schedule_single_event(strtotime('+2 seconds'), 'cdp_cron_delete', $args);
|
||
array_push($cdp_cron[$token]['args'], $args);
|
||
}
|
||
|
||
echo json_encode(array('status' => 'success', 'token' => cdp_sanitize_array($token)));
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will delete all posts in array PERMANENTLY!
|
||
* @return object of success message or error
|
||
*/
|
||
function cdp_clear_all_crons() {
|
||
$cdp_cron = get_option('_cdp_crons');
|
||
|
||
foreach ($cdp_cron as $cron => $val) {
|
||
if (isset($val['done'])) {
|
||
if ($val['done'] != true) {
|
||
echo json_encode(array(
|
||
'status' => 'fail',
|
||
'type' => 'warning',
|
||
'msg' => __('You can\'t clear messages when tasks are in progress, please firstly kill tasks or wait till the end.', 'copy-delete-posts')
|
||
));
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
$cdp_cron = delete_option('_cdp_crons');
|
||
echo json_encode(array('status' => 'success'));
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* Local function which sets default profile for user
|
||
* @return Boolean
|
||
*/
|
||
function cdp_set_default_profile() {
|
||
$curr = get_option('_cdp_preselections');
|
||
$id = get_current_user_id();
|
||
$new = array();
|
||
$selection = ((isset($_POST['selection'])) ? cdp_sanitize_array($_POST['selection']) : false);
|
||
if ($curr && !is_object($curr) || $curr == false)
|
||
$new = array($id => $selection);
|
||
else {
|
||
$new = $curr;
|
||
$new[$id] = $selection;
|
||
}
|
||
$stat = update_option('_cdp_preselections', $new);
|
||
echo cdp_sanitize_array($stat);
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* Local function which gets default profile for user
|
||
* @return String
|
||
*/
|
||
function cdp_get_default_profile() {
|
||
echo(esc_html(get_option('_cdp_preselections')[get_current_user_id()]));
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will set as seen notification!
|
||
* @return object of success message — WARNING: ALWAYS
|
||
*/
|
||
function cdp_set_noti_as_seen() {
|
||
if (wp_doing_cron())
|
||
return;
|
||
|
||
$token = ((isset($_POST['noti_token'])) ? sanitize_text_field($_POST['noti_token']) : false);
|
||
$cdp_cron = get_option('_cdp_crons', array());
|
||
$cdp_cron[$token]['shown'] = true;
|
||
update_option('_cdp_crons', $cdp_cron);
|
||
|
||
echo json_encode(array('status' => 'success'));
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will delete task from the history!
|
||
* @return object of success message or fail
|
||
*/
|
||
function cdp_just_hide_task() {
|
||
$token = ((isset($_POST['task'])) ? sanitize_text_field($_POST['task']) : false);
|
||
$cdp_cron = get_option('_cdp_crons', array());
|
||
unset($cdp_cron[$token]);
|
||
$res = update_option('_cdp_crons', $cdp_cron);
|
||
|
||
if ($res)
|
||
echo json_encode(array('status' => 'success'));
|
||
else
|
||
echo json_encode(array('status' => 'fail', 'type' => 'error', 'msg' => __('We can\'t hide this task now, – maybe it\'t already hidden. Please try again later.', 'copy-delete-posts')));
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will kill task from the cron!
|
||
* @return object of success message or fail
|
||
*/
|
||
function cdp_just_kill_task() {
|
||
$token = ((isset($_POST['task'])) ? sanitize_text_field($_POST['task']) : false);
|
||
$cdp_cron = get_option('_cdp_crons', array());
|
||
$handler = $cdp_cron[$token]['handler'];
|
||
$args = (isset($cdp_cron[$token]['args']) ? $cdp_cron[$token]['args'] : array());
|
||
|
||
if ($cdp_cron[$token]['done'] != false) {
|
||
echo json_encode(array('status' => 'fail', 'type' => 'error', 'msg' => __('This task has already ended this work, please wait for list refresh and try again.', 'copy-delete-posts')));
|
||
return;
|
||
}
|
||
|
||
$status = true;
|
||
$res = false;
|
||
foreach ($args as $arg => $val) {
|
||
$sres = wp_clear_scheduled_hook($handler, $val);
|
||
if ($sres == false)
|
||
$status = false;
|
||
}
|
||
|
||
if ($cdp_cron[$token]['done'] != false)
|
||
$status = true;
|
||
|
||
if ($status == true) {
|
||
unset($cdp_cron[$token]);
|
||
$res = update_option('_cdp_crons', $cdp_cron);
|
||
}
|
||
|
||
if ($status || $res)
|
||
echo json_encode(array('status' => 'success'));
|
||
else
|
||
echo json_encode(array('status' => 'fail', 'type' => 'error', 'msg' => __('We can\'t confirm that we killed this task now, please try again later or check if it\'t killed.', 'copy-delete-posts')));
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will catch current cron tasks!
|
||
* @return object of tasks or fail
|
||
*/
|
||
function cdp_just_get_tasks() {
|
||
$cdp_cron = get_option('_cdp_crons', false);
|
||
|
||
if ($cdp_cron)
|
||
echo json_encode(array('status' => 'success', 'tasks' => cdp_sanitize_array($cdp_cron)));
|
||
else
|
||
echo json_encode(array('status' => 'fail', 'type' => 'error', 'msg' => __('We couldn\'t catch current tasks, please try again later.', 'copy-delete-posts')));
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function will remove performance notice
|
||
* @return void
|
||
*/
|
||
function cdp_hide_perf_notice() {
|
||
update_option('cdp_dismiss_perf_notice', true);
|
||
update_option('cdp_latest_slow_performance', false);
|
||
echo json_encode(array('status' => 'success'));
|
||
}
|
||
|
||
/** –– * */
|
||
|
||
/** –– **\
|
||
* This function is just for debug have fun with it!
|
||
* It can be fired by function cdp_totally_know_what_i_am_doing('really');
|
||
* It won't work in production mode so dont even try it, if you're not me ~ Mikołaj :P
|
||
* @return mixed
|
||
*/
|
||
function cdp_debug_function() {
|
||
|
||
}
|
||
|
||
/** –– **/
|