File: /var/www/html/ielts-store/wp-content/plugins/automatewoo/includes/DatabaseUpdates/3.0.0.php
<?php
// phpcs:ignoreFile
/**
* Update to 3.0.0
* - migrate user data type to customer data type
*/
namespace AutomateWoo\DatabaseUpdates;
use AutomateWoo\Replace_Helper;
use AutomateWoo\Variables_Processor;
use AutomateWoo\Workflow;
use AutomateWoo\Workflows\Factory;
use AutomateWoo\Workflows\VariableParsing\ParsedVariable;
if ( ! defined( 'ABSPATH' ) ) exit;
class Database_Update_3_0_0 extends AbstractDatabaseUpdate {
protected $version = '3.0.0';
protected function start() {
parent::start();
$workflows = get_posts([
'post_type' => 'aw_workflow',
'post_status' => 'any',
'posts_per_page' => -1,
'fields' => 'ids',
]);
update_option( 'automatewoo_update_items', $workflows );
}
protected function finish() {
parent::finish();
delete_option( 'automatewoo_update_items' );
}
/**
* @return bool
*/
protected function process() {
$items = get_option( 'automatewoo_update_items' );
if ( empty( $items ) ) {
// no more items to process return complete...
return true;
}
$batch = array_splice( $items, 0, 5 );
foreach ( $batch as $item ) {
$workflow = Factory::get( $item );
$this->convert_workflow_from_user_to_customer_data_type( $workflow );
$this->convert_legacy_abandoned_cart_workflow( $workflow );
$this->items_processed++;
}
update_option( 'automatewoo_update_items', $items );
return false;
}
/**
* @param Workflow $workflow
*/
function convert_workflow_from_user_to_customer_data_type( $workflow ) {
$rules_to_convert = [
'user_role' => 'customer_role',
'user_tags' => 'customer_tags',
'user_total_spent' => 'customer_total_spent',
'user_order_count' => 'customer_order_count',
'user_email' => 'customer_email',
'user_meta' => 'customer_meta',
'user_purchased_products' => 'customer_purchased_products',
'user_order_statuses' => 'customer_order_statuses',
'user_is_active_subscriber' => 'customer_has_active_subscription',
'user_run_count' => 'customer_run_count',
];
$actions_to_convert = [
'change_user_type' => 'customer_change_role',
'update_user_meta' => 'customer_update_meta',
'user_add_tags' => 'customer_add_tags',
'user_remove_tag' => 'customer_remove_tags',
];
$rules = $workflow->get_rule_data();
foreach ( $rules as &$rule_group ) {
foreach ( $rule_group as &$rule ) {
if ( array_key_exists( $rule['name'], $rules_to_convert ) ) {
$rule['name'] = $rules_to_convert[ $rule['name'] ];
}
}
}
$actions = $workflow->get_meta( 'actions' );
if ( $actions ) {
foreach ( $actions as &$action ) {
if ( array_key_exists( $action['action_name'], $actions_to_convert ) ) {
$action['action_name'] = $actions_to_convert[ $action['action_name'] ];
}
}
// convert variables
foreach ( $actions as &$action ) {
foreach ( $action as $field_name => &$field_value ) {
if ( $field_name == 'action_name' ) {
continue;
}
$replacer = new Replace_Helper( $field_value, function( $value ) {
$user_variables_to_convert = [
'id' => 'user_id',
'firstname' => 'first_name',
'lastname' => 'last_name',
'billing_phone' => 'phone',
'billing_country' => 'country',
];
$variable = Variables_Processor::parse_variable( $value );
if ( ! $variable instanceof ParsedVariable ) {
return false;
}
$value = aw_str_replace_first_match( $value, 'user.', 'customer.' );
if ( $variable->type == 'user' && array_key_exists( $variable->field, $user_variables_to_convert ) ) {
$value = aw_str_replace_first_match( $value, ".$variable->field", ".{$user_variables_to_convert[$variable->field]}" );
}
return "{{ $value }}";
}, 'variables' );
$field_value = $replacer->process();
}
}
}
$workflow->update_meta( 'rule_options', $rules );
$workflow->update_meta( 'actions', $actions );
}
/**
* @param Workflow $workflow
*/
function convert_legacy_abandoned_cart_workflow( $workflow ) {
$triggers = [ 'abandoned_cart', 'guest_abandoned_cart' ];
$trigger = $workflow->get_trigger();
if ( ! $trigger || ! in_array( $trigger->get_name(), $triggers ) ) {
return;
}
$options = $workflow->get_meta( 'workflow_options' );
$delay = $workflow->get_trigger_option('delay' );
$options['when_to_run'] = 'delayed';
$options['run_delay_value'] = $delay;
$options['run_delay_unit'] = 'h';
$workflow->update_meta( 'workflow_options', $options );
}
}
return new Database_Update_3_0_0();