2013-07-18 14:22:05 +00:00
< ? php
/**
* Debug / Status page
*
* @ author WooThemes
* @ category Admin
* @ package WooCommerce / Admin / System Status
* @ version 2.1 . 0
*/
if ( ! defined ( 'ABSPATH' ) ) exit ; // Exit if accessed directly
if ( ! class_exists ( 'WC_Admin_Status' ) ) :
/**
2013-07-24 16:01:36 +00:00
* WC_Admin_Status Class
2013-07-18 14:22:05 +00:00
*/
class WC_Admin_Status {
/**
* Handles output of the reports page in admin .
*/
public function output () {
$current_tab = ! empty ( $_REQUEST [ 'tab' ] ) ? sanitize_title ( $_REQUEST [ 'tab' ] ) : 'status' ;
include_once ( 'views/html-admin-page-status.php' );
}
/**
* Handles output of report
*/
public function status_report () {
global $woocommerce , $wpdb ;
include_once ( 'views/html-admin-page-status-report.php' );
}
/**
* Handles output of tools
*/
public function status_tools () {
global $woocommerce , $wpdb ;
$tools = $this -> get_tools ();
if ( ! empty ( $_GET [ 'action' ] ) && ! empty ( $_REQUEST [ '_wpnonce' ] ) && wp_verify_nonce ( $_REQUEST [ '_wpnonce' ], 'debug_action' ) ) {
switch ( $_GET [ 'action' ] ) {
case " clear_transients " :
2013-08-09 16:11:15 +00:00
wc_delete_product_transients ();
2013-07-18 14:22:05 +00:00
echo '<div class="updated"><p>' . __ ( 'Product Transients Cleared' , 'woocommerce' ) . '</p></div>' ;
break ;
case " clear_expired_transients " :
// http://w-shadow.com/blog/2012/04/17/delete-stale-transients/
$rows = $wpdb -> query ( "
DELETE
a , b
FROM
{ $wpdb -> options } a , { $wpdb -> options } b
WHERE
a . option_name LIKE '_transient_%' AND
a . option_name NOT LIKE '_transient_timeout_%' AND
b . option_name = CONCAT (
'_transient_timeout_' ,
SUBSTRING (
a . option_name ,
CHAR_LENGTH ( '_transient_' ) + 1
)
)
AND b . option_value < UNIX_TIMESTAMP ()
" );
$rows2 = $wpdb -> query ( "
DELETE
a , b
FROM
{ $wpdb -> options } a , { $wpdb -> options } b
WHERE
a . option_name LIKE '_site_transient_%' AND
a . option_name NOT LIKE '_site_transient_timeout_%' AND
b . option_name = CONCAT (
'_site_transient_timeout_' ,
SUBSTRING (
a . option_name ,
CHAR_LENGTH ( '_site_transient_' ) + 1
)
)
AND b . option_value < UNIX_TIMESTAMP ()
" );
echo '<div class="updated"><p>' . sprintf ( __ ( '%d Transients Rows Cleared' , 'woocommerce' ), $rows + $rows2 ) . '</p></div>' ;
break ;
case " reset_roles " :
// Remove then re-add caps and roles
2013-08-09 16:11:15 +00:00
$installer = include ( WC () -> plugin_path () . '/includes/class-wc-install.php' );
$installer -> remove_roles ();
$installer -> create_roles ();
2013-07-18 14:22:05 +00:00
echo '<div class="updated"><p>' . __ ( 'Roles successfully reset' , 'woocommerce' ) . '</p></div>' ;
break ;
case " recount_terms " :
$product_cats = get_terms ( 'product_cat' , array ( 'hide_empty' => false , 'fields' => 'id=>parent' ) );
2013-11-25 13:30:20 +00:00
_wc_term_recount ( $product_cats , get_taxonomy ( 'product_cat' ), false , false );
2013-07-18 14:22:05 +00:00
$product_tags = get_terms ( 'product_tag' , array ( 'hide_empty' => false , 'fields' => 'id=>parent' ) );
2013-11-25 13:30:20 +00:00
_wc_term_recount ( $product_tags , get_taxonomy ( 'product_tag' ), false , false );
2013-07-18 14:22:05 +00:00
echo '<div class="updated"><p>' . __ ( 'Terms successfully recounted' , 'woocommerce' ) . '</p></div>' ;
break ;
case " clear_sessions " :
$wpdb -> query ( "
DELETE FROM { $wpdb -> options }
WHERE option_name LIKE '_wc_session_%' OR option_name LIKE '_wc_session_expires_%'
" );
wp_cache_flush ();
2013-11-14 19:20:18 +00:00
2013-11-11 18:48:36 +00:00
echo '<div class="updated"><p>' . __ ( 'Sessions successfully cleared' , 'woocommerce' ) . '</p></div>' ;
2013-07-18 14:22:05 +00:00
break ;
2013-11-14 19:20:18 +00:00
case " install_pages " :
WC_Install :: create_pages ();
echo '<div class="updated"><p>' . __ ( 'All missing WooCommerce pages was installed successfully.' , 'woocommerce' ) . '</p></div>' ;
break ;
2014-01-06 14:42:54 +00:00
case " delete_taxes " :
$wpdb -> query ( " TRUNCATE " . $wpdb -> prefix . " woocommerce_tax_rates " );
$wpdb -> query ( " TRUNCATE " . $wpdb -> prefix . " woocommerce_tax_rate_locations " );
echo '<div class="updated"><p>' . __ ( 'Tax rates successfully deleted' , 'woocommerce' ) . '</p></div>' ;
break ;
2013-07-18 14:22:05 +00:00
default :
$action = esc_attr ( $_GET [ 'action' ] );
if ( isset ( $tools [ $action ][ 'callback' ] ) ) {
$callback = $tools [ $action ][ 'callback' ];
$return = call_user_func ( $callback );
if ( $return === false ) {
if ( is_array ( $callback ) ) {
echo '<div class="error"><p>' . sprintf ( __ ( 'There was an error calling %s::%s' , 'woocommerce' ), get_class ( $callback [ 0 ] ), $callback [ 1 ] ) . '</p></div>' ;
} else {
echo '<div class="error"><p>' . sprintf ( __ ( 'There was an error calling %s' , 'woocommerce' ), $callback ) . '</p></div>' ;
}
}
}
break ;
}
}
2013-11-14 01:36:27 +00:00
// Display message if settings settings have been saved
2013-11-14 19:31:08 +00:00
if ( isset ( $_REQUEST [ 'settings-updated' ] ) ) {
2013-11-14 01:36:27 +00:00
echo '<div class="updated"><p>' . __ ( 'Your changes have been saved.' , 'woocommerce' ) . '</p></div>' ;
2013-11-14 19:31:08 +00:00
}
2013-07-18 14:22:05 +00:00
include_once ( 'views/html-admin-page-status-tools.php' );
}
/**
* Get tools
*
* @ return array of tools
*/
public function get_tools () {
return apply_filters ( 'woocommerce_debug_tools' , array (
'clear_transients' => array (
'name' => __ ( 'WC Transients' , 'woocommerce' ),
'button' => __ ( 'Clear transients' , 'woocommerce' ),
'desc' => __ ( 'This tool will clear the product/shop transients cache.' , 'woocommerce' ),
),
'clear_expired_transients' => array (
'name' => __ ( 'Expired Transients' , 'woocommerce' ),
'button' => __ ( 'Clear expired transients' , 'woocommerce' ),
2014-02-21 08:47:42 +00:00
'desc' => __ ( 'This tool will clear ALL expired transients from WordPress.' , 'woocommerce' ),
2013-07-18 14:22:05 +00:00
),
'recount_terms' => array (
'name' => __ ( 'Term counts' , 'woocommerce' ),
'button' => __ ( 'Recount terms' , 'woocommerce' ),
'desc' => __ ( 'This tool will recount product terms - useful when changing your settings in a way which hides products from the catalog.' , 'woocommerce' ),
),
'reset_roles' => array (
'name' => __ ( 'Capabilities' , 'woocommerce' ),
'button' => __ ( 'Reset capabilities' , 'woocommerce' ),
'desc' => __ ( 'This tool will reset the admin, customer and shop_manager roles to default. Use this if your users cannot access all of the WooCommerce admin pages.' , 'woocommerce' ),
),
'clear_sessions' => array (
'name' => __ ( 'Customer Sessions' , 'woocommerce' ),
'button' => __ ( 'Clear all sessions' , 'woocommerce' ),
2014-01-08 18:03:36 +00:00
'desc' => __ ( '<strong class="red">Warning:</strong> This tool will delete all customer session data from the database, including any current live carts.' , 'woocommerce' ),
2013-07-18 14:22:05 +00:00
),
2013-11-14 19:20:18 +00:00
'install_pages' => array (
'name' => __ ( 'Install WooCommerce Pages' , 'woocommerce' ),
'button' => __ ( 'Install pages' , 'woocommerce' ),
2014-01-08 18:03:36 +00:00
'desc' => __ ( '<strong class="red">Note:</strong> This tool will install all the missing WooCommerce pages. Pages already defined and set up will not be replaced.' , 'woocommerce' ),
2013-11-14 19:20:18 +00:00
),
2014-01-06 14:42:54 +00:00
'delete_taxes' => array (
'name' => __ ( 'Delete all WooCommerce tax rates' , 'woocommerce' ),
'button' => __ ( 'Delete ALL tax rates' , 'woocommerce' ),
2014-01-08 18:03:36 +00:00
'desc' => __ ( '<strong class="red">Note:</strong> This option will delete ALL of your tax rates, use with caution.' , 'woocommerce' ),
2014-01-06 14:42:54 +00:00
),
2013-07-18 14:22:05 +00:00
) );
}
2014-02-11 13:33:56 +00:00
/**
* Retrieve metadata from a file . Based on WP Core ' s get_file_data function
*
* @ since 2.1 . 1
* @ param string $file Path to the file
* @ param array $all_headers List of headers , in the format array ( 'HeaderKey' => 'Header Name' )
*/
public function get_file_version ( $file ) {
// We don't need to write to the file, so just open for reading.
$fp = fopen ( $file , 'r' );
// Pull only the first 8kiB of the file in.
$file_data = fread ( $fp , 8192 );
// PHP will close file handle, but we are good citizens.
fclose ( $fp );
// Make sure we catch CR-only line endings.
$file_data = str_replace ( " \r " , " \n " , $file_data );
$version = '' ;
if ( preg_match ( '/^[ \t\/*#@]*' . preg_quote ( '@version' , '/' ) . '(.*)$/mi' , $file_data , $match ) && $match [ 1 ] )
$version = _cleanup_header_comment ( $match [ 1 ] );
return $version ;
}
2013-07-18 14:22:05 +00:00
/**
* Scan the template files
*
* @ access public
2013-11-27 09:03:47 +00:00
* @ param string $template_path
* @ return array
2013-07-18 14:22:05 +00:00
*/
public function scan_template_files ( $template_path ) {
$files = scandir ( $template_path );
$result = array ();
if ( $files ) {
foreach ( $files as $key => $value ) {
if ( ! in_array ( $value , array ( " . " , " .. " ) ) ) {
if ( is_dir ( $template_path . DIRECTORY_SEPARATOR . $value ) ) {
$sub_files = $this -> scan_template_files ( $template_path . DIRECTORY_SEPARATOR . $value );
foreach ( $sub_files as $sub_file ) {
$result [] = $value . DIRECTORY_SEPARATOR . $sub_file ;
}
} else {
$result [] = $value ;
}
}
}
}
return $result ;
}
}
endif ;
2014-01-08 18:03:36 +00:00
return new WC_Admin_Status ();