wp-cli / wp-config-transformer
以编程方式编辑 wp-config.php 文件。
Requires
- php: ^5.6 || ^7.0 || ^8.0
Requires (Dev)
- wp-cli/wp-cli-tests: ^4.0
README
以编程方式编辑 wp-config.php
文件。
使用方法
实例化
$config_transformer = new WPConfigTransformer( '/path/to/wp-config.php' );
编辑常量
$config_transformer->update( 'constant', 'WP_DEBUG', 'true', array( 'raw' => true ) ); $config_transformer->add( 'constant', 'MY_SPECIAL_CONFIG', 'foo' ); $config_transformer->remove( 'constant', 'MY_SPECIAL_CONFIG' );
编辑变量
$config_transformer->update( 'variable', 'table_prefix', 'wp_custom_' ); $config_transformer->add( 'variable', 'my_special_global', 'foo' ); $config_transformer->remove( 'variable', 'my_special_global' );
检查是否存在
if ( $config_transformer->exists( 'constant', 'MY_SPECIAL_CONFIG' ) ) { // do stuff } if ( $config_transformer->exists( 'variable', 'my_special_global' ) ) { // do stuff }
选项
通过选项数组,可以使用特殊行为来添加或更新配置。
规范化
与上面的“原地编辑”策略相比,还有一个选项可以在配置更新期间规范化输出,并有效地用符合 WP 编码标准的输出替换现有语法。
让我们重新考虑一个格式不佳的例子
define ( 'WP_DEBUG' , false, false ) ;
这次运行
$config_transformer->update( 'constant', 'WP_DEBUG', 'true', array( 'raw' => true, 'normalize' => true ) );
现在我们将得到以下输出
define( 'WP_DEBUG', true );
太好了!
原始格式
假设您想更改您的 ABSPATH
配置 (啊!)。为此,我们可以运行
$config_transformer->update( 'constant', 'ABSPATH', "dirname( __FILE__ ) . '/somewhere/else/'", array( 'raw' => true ) );
raw
选项意味着值将不会作为字符串放在配置中,而是成为未加引号(并可执行)的语法 dirname( __FILE__ ) . '/somewhere/else/'
。
锚定字符串
锚定字符串是添加内容将锚定的文本片段。
$config_transformer->update( 'constant', 'FOO', 'bar', array( 'anchor' => '/** Absolute path to the WordPress directory' ) ); // Default
锚定位置
默认情况下,新配置将放在锚定字符串之前。
$config_transformer->update( 'constant', 'FOO', 'bar', array( 'placement' => 'before' ) ); // Default $config_transformer->update( 'constant', 'BAZ', 'qux', array( 'placement' => 'after' ) );
锚定分隔符
默认情况下,新配置与其锚定字符串之间的分隔符是 EOL(在 *nix 上是 "\n",在 Windows 上是 "\r\n")。
$config_transformer->update( 'constant', 'FOO', 'bar', array( 'separator' => PHP_EOL . PHP_EOL ) ); // Default $config_transformer->update( 'constant', 'FOO', 'bar', array( 'separator' => PHP_EOL ) );
如果缺失则添加
默认情况下,在尝试更新不存在配置时,将添加配置。可以通过指定 add
选项并将其设置为 false
来覆盖此行为。
$config_transformer->update( 'constant', 'FOO', 'bar', array( 'add' => true ) ); // Default $config_transformer->update( 'constant', 'FOO', 'bar', array( 'add' => false ) );
如果常量 FOO
存在,它将在原地更新。如果不存在,更新将返回 false
$config_transformer->exists( 'constant', 'FOO' ); // Returns false $config_transformer->update( 'constant', 'FOO', 'bar', array( 'add' => false ) ); // Returns false
工作原理
解析配置
常量:[https://regex101.com/r/6AeNGP/4](https://regex101.com/r/6AeNGP/4)
变量:[https://regex101.com/r/cSLZZz/4](https://regex101.com/r/cSLZZz/4)
原地编辑
由于 wp-config.php
文件的非语义性质以及 PHP 的一般松散语法,WP Config Transformer 采取“原地编辑”策略,以保留原始格式和块中可能存在的其他各种复杂性。毕竟,我们只关心转换值,而不是常量或变量名称。
为此,执行以下步骤:
- 将包含配置的 PHP 块拆分成不同的部分。
- 只针对包含配置值的部分进行替换。
- 使用新值重新组装部分。
- 用新的 PHP 块替换旧的 PHP 块。
考虑以下看似有效但令人毛骨悚然的 PHP 块,它还使用了可选的(且罕见的)第三个参数来指定常量的大小写敏感度
define ( 'WP_DEBUG' , false, false ) ;
“原地编辑”策略意味着运行
$config_transformer->update( 'constant', 'WP_DEBUG', 'true', array( 'raw' => true ) );
将安全地更改 仅 值,而保留格式和额外的参数不受损害
define ( 'WP_DEBUG' , true, false ) ;
选项传递
任何由 add()
方法支持的选项也可以通过 update()
方法传递,并在配置不存在时转发。
例如,如果您想就地更新如果存在的 FOO
常量,否则应该添加到特殊位置
$config_transformer->update( 'constant', 'FOO', 'bar', array( 'anchor' => '/** My special location' ) );
这与长格式逻辑具有相同的效果
if ( $config_transformer->exists( 'constant', 'FOO' ) ) { $config_transformer->update( 'constant', 'FOO', 'bar' ); } else { $config_transformer->add( 'constant', 'FOO', 'bar', array( 'anchor' => '/** My special area' ) ); }
当然,这个例外是如果您使用的是 add => false
选项,在这种情况下,更新将返回 false
,并且不会添加任何配置。
已知问题
- 正则表达式将仅在每行匹配一个配置定义。
CORRECT
define( 'WP_DEBUG', true ); define( 'WP_SCRIPT_DEBUG', true ); $table_prefix = 'wp_'; $my_var = 'foo';
INCORRECT
define( 'WP_DEBUG', true ); define( 'WP_SCRIPT_DEBUG', true ); $table_prefix = 'wp_'; $my_var = 'foo';
- 如果使用了
define()
的第三个参数,它 必须 是布尔值。
CORRECT
define( 'WP_DEBUG', true, false ); define( 'WP_DEBUG', true, FALSE ); define( 'foo', true, true ); define( 'foo', true, TRUE );
INCORRECT
define( 'WP_DEBUG', true, 0 ); define( 'WP_DEBUG', true, 'yes' ); define( 'WP_DEBUG', true, 'this comma, will break everything' );
测试
$ composer global require phpunit/phpunit $ composer install $ phpunit