431 lines
12 KiB
PHP
431 lines
12 KiB
PHP
|
<?php
|
||
|
namespace W3TC;
|
||
|
|
||
|
/**
|
||
|
* The W3 Total Cache plugin integration
|
||
|
*
|
||
|
* @package wp-cli
|
||
|
* @subpackage commands/third-party
|
||
|
*/
|
||
|
class W3TotalCache_Command extends \WP_CLI_Command {
|
||
|
/**
|
||
|
* Creates missing files, writes apache/nginx rules.
|
||
|
*
|
||
|
* ## OPTIONS
|
||
|
* [<server>]
|
||
|
* : Subcommand defines server type:
|
||
|
* apache create rules for apache server
|
||
|
* nginx create rules for nginx server
|
||
|
*/
|
||
|
function fix_environment( $args = array(), $vars = array() ) {
|
||
|
$server_type = array_shift( $args );
|
||
|
switch ( $server_type ) {
|
||
|
case 'apache':
|
||
|
$_SERVER['SERVER_SOFTWARE'] = 'Apache';
|
||
|
break;
|
||
|
case 'nginx':
|
||
|
$_SERVER['SERVER_SOFTWARE'] = 'nginx';
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
$config = Dispatcher::config();
|
||
|
$environment = Dispatcher::component( 'Root_Environment' );
|
||
|
$environment->fix_in_wpadmin( $config, true );
|
||
|
} catch ( Util_Environment_Exceptions $e ) {
|
||
|
\WP_CLI::error( __( 'Environment adjustment failed with error', 'w3-total-cache' ),
|
||
|
$e->getCombinedMessage() );
|
||
|
}
|
||
|
|
||
|
\WP_CLI::success( __( 'Environment adjusted.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Clear something from the cache.
|
||
|
*
|
||
|
* ## OPTIONS
|
||
|
* <cache>
|
||
|
* : Cache to flush
|
||
|
* all flush all caches
|
||
|
* posts flush posts (pagecache and further)
|
||
|
* post flush the page cache
|
||
|
* database flush the database cache
|
||
|
* object flush the object cache
|
||
|
* minify flush the minify cache
|
||
|
*
|
||
|
* [--post_id=<id>]
|
||
|
* : flush a specific post ID
|
||
|
*
|
||
|
* [--permalink=<post-permalink>]
|
||
|
* : flush a specific permalink
|
||
|
*
|
||
|
* ## EXAMPLES
|
||
|
* # Flush all
|
||
|
* $ wp w3-total-cache flush all
|
||
|
*
|
||
|
* # Flush pagecache and reverse proxies
|
||
|
* $ wp w3-total-cache flush posts
|
||
|
*/
|
||
|
function flush( $args = array(), $vars = array() ) {
|
||
|
$args = array_unique( $args );
|
||
|
|
||
|
do {
|
||
|
$cache_type = array_shift( $args );
|
||
|
|
||
|
switch ( $cache_type ) {
|
||
|
case 'all':
|
||
|
try {
|
||
|
w3tc_flush_all();
|
||
|
}
|
||
|
catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Flushing all failed.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
\WP_CLI::success( __( 'Everything flushed successfully.', 'w3-total-cache' ) );
|
||
|
break;
|
||
|
|
||
|
case 'posts':
|
||
|
try {
|
||
|
w3tc_flush_posts();
|
||
|
}
|
||
|
catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Flushing posts/pages failed.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
\WP_CLI::success( __( 'Posts/pages flushed successfully.', 'w3-total-cache' ) );
|
||
|
break;
|
||
|
|
||
|
case 'db':
|
||
|
case 'database':
|
||
|
try {
|
||
|
$w3_db = Dispatcher::component( 'CacheFlush' );
|
||
|
$w3_db->dbcache_flush();
|
||
|
}
|
||
|
catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Flushing the DB cache failed.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
\WP_CLI::success( __( 'The DB cache is flushed successfully.', 'w3-total-cache' ) );
|
||
|
break;
|
||
|
|
||
|
case 'minify':
|
||
|
try {
|
||
|
$w3_minify = Dispatcher::component( 'CacheFlush' );
|
||
|
$w3_minify->minifycache_flush();
|
||
|
}
|
||
|
catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Flushing the minify cache failed.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
\WP_CLI::success( __( 'The minify cache is flushed successfully.', 'w3-total-cache' ) );
|
||
|
break;
|
||
|
|
||
|
case 'object':
|
||
|
try {
|
||
|
$w3_objectcache = Dispatcher::component( 'CacheFlush' );
|
||
|
$w3_objectcache->objectcache_flush();
|
||
|
}
|
||
|
catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Flushing the object cache failed.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
\WP_CLI::success( __( 'The object cache is flushed successfully.', 'w3-total-cache' ) );
|
||
|
break;
|
||
|
|
||
|
case 'post':
|
||
|
if ( isset( $vars['post_id'] ) ) {
|
||
|
if ( is_numeric( $vars['post_id'] ) ) {
|
||
|
try {
|
||
|
w3tc_flush_post( $vars['post_id'], true );
|
||
|
}
|
||
|
catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Flushing the page from cache failed.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
\WP_CLI::success( __( 'The page is flushed from cache successfully.', 'w3-total-cache' ) );
|
||
|
} else {
|
||
|
\WP_CLI::error( __( 'This is not a valid post id.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
}
|
||
|
elseif ( isset( $vars['permalink'] ) ) {
|
||
|
try {
|
||
|
w3tc_flush_url( $vars['permalink'] );
|
||
|
}
|
||
|
catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Flushing the page from cache failed.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
\WP_CLI::success( __( 'The page is flushed from cache successfully.', 'w3-total-cache' ) );
|
||
|
} else {
|
||
|
if ( isset( $flushed_page_cache ) && $flushed_page_cache )
|
||
|
break;
|
||
|
|
||
|
try {
|
||
|
w3tc_flush_posts();
|
||
|
}
|
||
|
catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Flushing the page cache failed.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
\WP_CLI::success( __( 'The page cache is flushed successfully.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
\WP_CLI::error( __( 'Not specified what to flush', 'w3-total-cache' ) );
|
||
|
}
|
||
|
} while ( !empty( $args ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get or set option.
|
||
|
*
|
||
|
* Options modifications don't update your .htaccess automatically.
|
||
|
* Use fix_environment command afterwards to do it.
|
||
|
*
|
||
|
* ## OPTIONS
|
||
|
* <operation>
|
||
|
* : operation to do
|
||
|
* get get option value
|
||
|
* set set option value
|
||
|
* <name>
|
||
|
* : option name
|
||
|
*
|
||
|
* [<value>]
|
||
|
* : (for set operation) Value to set
|
||
|
*
|
||
|
* [--state]
|
||
|
* : use state, not config
|
||
|
* state is used for backend notifications
|
||
|
*
|
||
|
* [--master]
|
||
|
* : use master config/state
|
||
|
*
|
||
|
* [--type=<type>]
|
||
|
* : type of data used boolean/string/integer/array. Default string
|
||
|
*
|
||
|
* [--delimiter=<delimiter>]
|
||
|
* : delimiter to use for array type values
|
||
|
*
|
||
|
* ## EXAMPLES
|
||
|
* # get if pagecache enabled
|
||
|
* $ wp w3-total-cache option get pgcache.enabled --type=boolean
|
||
|
*
|
||
|
* # enable pagecache
|
||
|
* $ wp w3-total-cache option set pgcache.enabled true --type=boolean
|
||
|
*
|
||
|
* # don't show wp-content permissions notification
|
||
|
* $ wp w3-total-cache option set common.hide_note_wp_content_permissions true --state --type=boolean
|
||
|
*/
|
||
|
function option( $args = array(), $vars = array() ) {
|
||
|
$op = array_shift( $args );
|
||
|
$name = array_shift( $args );
|
||
|
|
||
|
if ( empty( $name ) ) {
|
||
|
\WP_CLI::error( __( '<name> parameter is not specified', 'w3-total-cache' ) );
|
||
|
return;
|
||
|
}
|
||
|
if ( strpos( $name, '::' ) !== FALSE ) {
|
||
|
$name = explode('::', $name);
|
||
|
}
|
||
|
|
||
|
$c = null;
|
||
|
if ( isset( $vars['state'] ) ) {
|
||
|
if ( isset( $vars['master'] ) )
|
||
|
$c = Dispatcher::config_state_master();
|
||
|
else
|
||
|
$c = Dispatcher::config_state();
|
||
|
} else {
|
||
|
if ( isset( $vars['master'] ) )
|
||
|
$c = Dispatcher::config_master();
|
||
|
else
|
||
|
$c = Dispatcher::config();
|
||
|
}
|
||
|
|
||
|
if ( $op == 'get') {
|
||
|
$type =( isset( $vars['type'] ) ? $vars['type'] : 'string' );
|
||
|
|
||
|
if ( $type == 'boolean' )
|
||
|
$v = $c->get_boolean( $name ) ? 'true' : 'false';
|
||
|
elseif ( $type == 'integer' )
|
||
|
$v = $c->get_integer( $name );
|
||
|
elseif ( $type == 'string' )
|
||
|
$v = $c->get_string( $name );
|
||
|
elseif ( $type == 'array' )
|
||
|
$v = json_encode( $c->get_array( $name ), JSON_PRETTY_PRINT );
|
||
|
else {
|
||
|
\WP_CLI::error( __( 'Unknown type ' . $type, 'w3-total-cache' ) );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
echo esc_html( $v ) . "\n";
|
||
|
} elseif ( $op == 'set' ) {
|
||
|
$type =( isset( $vars['type'] ) ? $vars['type'] : 'string' );
|
||
|
|
||
|
if ( count( $args ) <= 0 ) {
|
||
|
\WP_CLI::error( __( '<value> parameter is not specified', 'w3-total-cache' ) );
|
||
|
return;
|
||
|
}
|
||
|
$value = array_shift( $args );
|
||
|
|
||
|
if ( $type == 'boolean' ) {
|
||
|
if ( $value == 'true' || $value == '1' || $value == 'on' )
|
||
|
$v = true;
|
||
|
elseif ( $value == 'false' || $value == '0' || $value == 'off' )
|
||
|
$v = false;
|
||
|
else {
|
||
|
\WP_CLI::error( __( '<value> parameter ' . $value . ' is not boolean', 'w3-total-cache' ) );
|
||
|
return;
|
||
|
}
|
||
|
} elseif ( $type == 'integer' )
|
||
|
$v = (integer)$value;
|
||
|
elseif ( $type == 'string' )
|
||
|
$v = $value;
|
||
|
elseif ( $type == 'array' ) {
|
||
|
$delimiter =( isset( $vars['delimiter'] ) ? $vars['delimiter'] : ',' );
|
||
|
$v = explode($delimiter, $value );
|
||
|
} else {
|
||
|
\WP_CLI::error( __( 'Unknown type ' . $type, 'w3-total-cache' ) );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
$c->set( $name, $v );
|
||
|
$c->save();
|
||
|
\WP_CLI::success( __( 'Option updated successfully.', 'w3-total-cache' ) );
|
||
|
} catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Option value update failed.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
\WP_CLI::error( __( '<operation> parameter is not specified', 'w3-total-cache' ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Imports configuration file
|
||
|
*
|
||
|
* ## OPTIONS
|
||
|
* <filename>
|
||
|
* : Filename to import
|
||
|
*/
|
||
|
function import( $args = array(), $vars = array() ) {
|
||
|
$filename = array_shift( $args );
|
||
|
|
||
|
try {
|
||
|
$config = new Config();
|
||
|
if ( !file_exists( $filename ) || !is_readable( $filename ) ) {
|
||
|
throw new \Exception( 'Cant read file: ' . $filename );
|
||
|
}
|
||
|
if ( !$config->import( $filename ) ) {
|
||
|
throw new \Exception( 'import failed' );
|
||
|
}
|
||
|
$config->save();
|
||
|
} catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Config import failed: ' . $e->getMessage(), 'w3-total-cache' ) );
|
||
|
}
|
||
|
|
||
|
\WP_CLI::success( __( 'Configuration successfully imported.', 'w3-total-cache' ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update query string for all static files
|
||
|
*/
|
||
|
function querystring() {
|
||
|
try {
|
||
|
$w3_querystring = Dispatcher::component( 'CacheFlush' );
|
||
|
$w3_querystring->browsercache_flush();
|
||
|
}
|
||
|
catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( sprintf(
|
||
|
__( 'updating the query string failed. with error %s', 'w3-total-cache' ),
|
||
|
$e ) );
|
||
|
}
|
||
|
|
||
|
\WP_CLI::success( __( 'The query string was updated successfully.', 'w3-total-cache' ) );
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Purges URL's from cdn and varnish if enabled
|
||
|
*
|
||
|
* @param array $args List if files to be purged, absolute path or relative to wordpress installation path
|
||
|
*/
|
||
|
function cdn_purge( $args = array() ) {
|
||
|
$purgeitems = array();
|
||
|
foreach ( $args as $file ) {
|
||
|
$cdncommon = Dispatcher::component( 'Cdn_Core' );
|
||
|
if (file_exists($file)) {
|
||
|
$local_path = $file;
|
||
|
} else {
|
||
|
$local_path = ABSPATH . $file;
|
||
|
}
|
||
|
$remote_path = $file;
|
||
|
$purgeitems[] = $cdncommon->build_file_descriptor( $local_path, $remote_path );
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
$w3_cdn_purge = Dispatcher::component( 'CacheFlush' );
|
||
|
$w3_cdn_purge->cdn_purge_files( $purgeitems );
|
||
|
}
|
||
|
catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'Files did not successfully purge with error %s', 'w3-total-cache' ), $e );
|
||
|
}
|
||
|
\WP_CLI::success( __( 'Files purged successfully.', 'w3-total-cache' ) );
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generally triggered from a cronjob, performs manual page cache Garbage collection
|
||
|
*/
|
||
|
function pgcache_cleanup() {
|
||
|
try {
|
||
|
$o = Dispatcher::component( 'PgCache_Plugin_Admin' );
|
||
|
$o->cleanup();
|
||
|
} catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'PageCache Garbage cleanup failed: %s',
|
||
|
'w3-total-cache' ), $e );
|
||
|
}
|
||
|
|
||
|
\WP_CLI::success( __( 'PageCache Garbage cleanup triggered successfully.',
|
||
|
'w3-total-cache' ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Generally triggered from a cronjob, performs manual page cache priming
|
||
|
* ## OPTIONS
|
||
|
* [--start=<start>]
|
||
|
* : Start since <start> entry of sitemap
|
||
|
*
|
||
|
* [--limit=<limit>]
|
||
|
* : load no more than <limit> pages
|
||
|
*
|
||
|
*/
|
||
|
function pgcache_prime( $args = array(), $vars = array() ) {
|
||
|
try {
|
||
|
$log_callback = function($m) {
|
||
|
\WP_CLI::log($m);
|
||
|
};
|
||
|
|
||
|
$o = Dispatcher::component( 'PgCache_Plugin_Admin' );
|
||
|
$o->prime( ( isset( $vars['start'] ) ? $vars['start'] - 1 : null ),
|
||
|
( isset( $vars['limit'] ) ? $vars['limit'] : null ),
|
||
|
$log_callback );
|
||
|
|
||
|
} catch ( \Exception $e ) {
|
||
|
\WP_CLI::error( __( 'PageCache Priming did failed: %s',
|
||
|
'w3-total-cache' ), $e );
|
||
|
}
|
||
|
|
||
|
\WP_CLI::success( __( 'PageCache Priming triggered successfully.',
|
||
|
'w3-total-cache' ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
if ( method_exists( '\WP_CLI', 'add_command' ) ) {
|
||
|
\WP_CLI::add_command( 'w3-total-cache', '\W3TC\W3TotalCache_Command' );
|
||
|
\WP_CLI::add_command( 'total-cache', '\W3TC\W3TotalCache_Command' );
|
||
|
} else {
|
||
|
// backward compatibility
|
||
|
\WP_CLI::addCommand( 'w3-total-cache', '\W3TC\W3TotalCache_Command' );
|
||
|
\WP_CLI::addCommand( 'total-cache', '\W3TC\W3TotalCache_Command' );
|
||
|
}
|