WC_REST_System_Status_Tools_Controller::execute_tool PHP Method

execute_tool() public method

Actually executes a a tool.
public execute_tool ( string $tool ) : array
$tool string
return array
    public function execute_tool($tool)
    {
        global $wpdb;
        $ran = true;
        switch ($tool) {
            case 'clear_transients':
                wc_delete_product_transients();
                wc_delete_shop_order_transients();
                WC_Cache_Helper::get_transient_version('shipping', true);
                $message = __('Product transients cleared', 'woocommerce');
                break;
            case 'clear_expired_transients':
                /*
                 * Deletes all expired transients. The multi-table delete syntax is used.
                 * to delete the transient record from table a, and the corresponding.
                 * transient_timeout record from table b.
                 *
                 * Based on code inside core's upgrade_network() function.
                 */
                $sql = "DELETE a, b FROM {$wpdb->options} a, {$wpdb->options} b\n\t\t\t\t\tWHERE a.option_name LIKE %s\n\t\t\t\t\tAND a.option_name NOT LIKE %s\n\t\t\t\t\tAND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) )\n\t\t\t\t\tAND b.option_value < %d";
                $rows = $wpdb->query($wpdb->prepare($sql, $wpdb->esc_like('_transient_') . '%', $wpdb->esc_like('_transient_timeout_') . '%', time()));
                $sql = "DELETE a, b FROM {$wpdb->options} a, {$wpdb->options} b\n\t\t\t\t\tWHERE a.option_name LIKE %s\n\t\t\t\t\tAND a.option_name NOT LIKE %s\n\t\t\t\t\tAND b.option_name = CONCAT( '_site_transient_timeout_', SUBSTRING( a.option_name, 17 ) )\n\t\t\t\t\tAND b.option_value < %d";
                $rows2 = $wpdb->query($wpdb->prepare($sql, $wpdb->esc_like('_site_transient_') . '%', $wpdb->esc_like('_site_transient_timeout_') . '%', time()));
                $message = sprintf(__('%d transients rows cleared', 'woocommerce'), $rows + $rows2);
                break;
            case 'delete_orphaned_variations':
                /**
                 * Delete orphans
                 */
                $result = absint($wpdb->query("DELETE products\n\t\t\t\t\tFROM {$wpdb->posts} products\n\t\t\t\t\tLEFT JOIN {$wpdb->posts} wp ON wp.ID = products.post_parent\n\t\t\t\t\tWHERE wp.ID IS NULL AND products.post_type = 'product_variation';"));
                $message = sprintf(__('%d orphaned variations deleted', 'woocommerce'), $result);
                break;
            case 'reset_roles':
                // Remove then re-add caps and roles
                WC_Install::remove_roles();
                WC_Install::create_roles();
                $message = __('Roles successfully reset', 'woocommerce');
                break;
            case 'recount_terms':
                $product_cats = get_terms('product_cat', array('hide_empty' => false, 'fields' => 'id=>parent'));
                _wc_term_recount($product_cats, get_taxonomy('product_cat'), true, false);
                $product_tags = get_terms('product_tag', array('hide_empty' => false, 'fields' => 'id=>parent'));
                _wc_term_recount($product_tags, get_taxonomy('product_tag'), true, false);
                $message = __('Terms successfully recounted', 'woocommerce');
                break;
            case 'clear_sessions':
                $wpdb->query("TRUNCATE {$wpdb->prefix}woocommerce_sessions");
                wp_cache_flush();
                $message = __('Sessions successfully cleared', 'woocommerce');
                break;
            case 'install_pages':
                WC_Install::create_pages();
                return __('All missing WooCommerce pages was installed successfully.', 'woocommerce');
                break;
            case 'delete_taxes':
                $wpdb->query("TRUNCATE TABLE {$wpdb->prefix}woocommerce_tax_rates;");
                $wpdb->query("TRUNCATE TABLE {$wpdb->prefix}woocommerce_tax_rate_locations;");
                WC_Cache_Helper::incr_cache_prefix('taxes');
                $message = __('Tax rates successfully deleted', 'woocommerce');
                break;
            case 'reset_tracking':
                delete_option('woocommerce_allow_tracking');
                WC_Admin_Notices::add_notice('tracking');
                $message = __('Usage tracking settings successfully reset.', 'woocommerce');
                break;
            default:
                $tools = $this->get_tools();
                if (isset($tools[$tool]['callback'])) {
                    $callback = $tools[$tool]['callback'];
                    $return = call_user_func($callback);
                    if (false === $return) {
                        $callback_string = is_array($callback) ? get_class($callback[0]) . '::' . $callback[1] : $callback;
                        $ran = false;
                        $message = sprintf(__('There was an error calling %s', 'woocommerce'), $callback_string);
                    } else {
                        $message = __('Tool ran.', 'woocommerce');
                    }
                } else {
                    $ran = false;
                    $message = __('There was an error calling this tool. There is no callback present.', 'woocommerce');
                }
                break;
        }
        return array('success' => $ran, 'message' => $message);
    }

Usage Example

Ejemplo n.º 1
0
 /**
  * Handles output of tools.
  */
 public static function status_tools()
 {
     global $wpdb;
     $tools = self::get_tools();
     if (!empty($_GET['action']) && !empty($_REQUEST['_wpnonce']) && wp_verify_nonce($_REQUEST['_wpnonce'], 'debug_action')) {
         $tools_controller = new WC_REST_System_Status_Tools_Controller();
         $action = wc_clean($_GET['action']);
         if (array_key_exists($action, $tools)) {
             $response = $tools_controller->execute_tool($action);
         } else {
             $response = array('success' => false, 'message' => __('Tool does not exist.', 'woocommerce'));
         }
         if ($response['success']) {
             echo '<div class="updated inline"><p>' . esc_html($response['message']) . '</p></div>';
         } else {
             echo '<div class="error inline"><p>' . esc_html($response['message']) . '</p></div>';
         }
     }
     // Display message if settings settings have been saved
     if (isset($_REQUEST['settings-updated'])) {
         echo '<div class="updated inline"><p>' . __('Your changes have been saved.', 'woocommerce') . '</p></div>';
     }
     include_once dirname(__FILE__) . '/views/html-admin-page-status-tools.php';
 }