wp-cli/wp-config-transformer

以编程方式编辑 wp-config.php 文件。

v1.4.0 2024-09-17 19:05 UTC

This package is auto-updated.

Last update: 2024-09-17 19:06:54 UTC


README

以编程方式编辑 wp-config.php 文件。

Testing

快速链接: 使用方法 | 选项 | 工作原理 | 测试

使用方法

实例化

$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 采取“原地编辑”策略,以保留原始格式和块中可能存在的其他各种复杂性。毕竟,我们只关心转换值,而不是常量或变量名称。

为此,执行以下步骤:

  1. 将包含配置的 PHP 块拆分成不同的部分。
  2. 只针对包含配置值的部分进行替换。
  3. 使用新值重新组装部分。
  4. 用新的 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,并且不会添加任何配置。

已知问题

  1. 正则表达式将仅在每行匹配一个配置定义。

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';
  1. 如果使用了 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