<?php
namespace WPForms\Migrations;
use WPForms\Tasks\Meta;
use WPForms\Tasks\Tasks;
/**
* Class v1.7.5 upgrade.
*
* @since 1.7.5
*
* @noinspection PhpUnused
*/
class Upgrade175 extends UpgradeBase {
/**
* Delete all task meta of not active tasks.
*
* @since 1.7.5
*
* @noinspection ElvisOperatorCanBeUsedInspection
*
* @return bool|null Upgrade result:
* true - the upgrade completed successfully,
* false - in the case of failure,
* null - upgrade started but not yet finished (background task).
*/
public function run() {
global $wpdb;
if ( ! $this->as_tables_exist() ) {
return true;
}
$group = Tasks::GROUP;
$sql = "SELECT DISTINCT a.args FROM {$wpdb->prefix}actionscheduler_actions a
JOIN {$wpdb->prefix}actionscheduler_groups g ON g.group_id = a.group_id
WHERE g.slug = '$group' AND a.status IN ( 'pending', 'in-progress' )";
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared
$results = $wpdb->get_results( $sql, 'ARRAY_A' );
// phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared
$results = $results ? $results : [];
$meta_ids = [];
foreach ( $results as $result ) {
$args = isset( $result['args'] ) ? json_decode( $result['args'], true ) : null;
if ( $args && ! empty( $args['tasks_meta_id'] ) ) {
$meta_ids[] = $args['tasks_meta_id'];
}
}
$table_name = Meta::get_table_name();
$not_in = $meta_ids ? wpforms_wpdb_prepare_in( $meta_ids ) : '0';
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching
$wpdb->query( "DELETE FROM $table_name WHERE id NOT IN ( $not_in )" );
// phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching
return true;
}
/**
* Check whether AS tables exist.
*
* @since 1.7.6
*
* @return bool
*/
private function as_tables_exist() {
global $wpdb;
$required_tables = [
$wpdb->prefix . 'actionscheduler_actions',
$wpdb->prefix . 'actionscheduler_groups',
];
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$tables = $wpdb->get_col( "SHOW TABLES LIKE '{$wpdb->prefix}actionscheduler%'" );
$intersect = array_values( array_intersect( $tables, $required_tables ) );
sort( $intersect );
sort( $required_tables );
return $intersect === $required_tables;
}
}