在WordPress的wp-config文件中使用环境变量

19
我正在使用phpfog.com进行托管,github.com进行问题跟踪等。 我已经设置了两个远程库,一个是指向phpfog.com的,另一个是指向github的。 在phpfog的后端管理界面中,您可以定义环境变量。我已经在那里这样做了,并希望在我的wp-config文件中使用它们。 以下是我使用的代码:
/** Hardened Salts for use on github.com, phpfog.com, etc.*/
$AUTH_KEY = getenv('AUTH_KEY');
$SECURE_AUTH_KEY = getenv('SECURE_AUTH_KEY');
$LOGGED_IN_KEY = getenv('LOGGED_IN_KEY');
$NONCE_KEY = getenv('NONCE_KEY');
$AUTH_SALT = getenv('AUTH_SALT');
$SECURE_AUTH_SALT = getenv('SECURE_AUTH_SALT');
$LOGGED_IN_SALT = getenv('LOGGED_IN_SALT');
$NONCE_SALT = getenv('NONCE_SALT');
define('AUTH_KEY', $AUTH_KEY);
define('SECURE_AUTH_KEY', $SECURE_AUTH_KEY);
define('LOGGED_IN_KEY', $LOGGED_IN_KEY);
define('NONCE_KEY', $NONCE_KEY);
define('AUTH_SALT', $AUTH_SALT);
define('SECURE_AUTH_SALT', $SECURE_AUTH_SALT);
define('LOGGED_IN_SALT', $LOGGED_IN_SALT);
define('NONCE_SALT', $NONCE_SALT);

一定有更简洁的方法来做这件事...


不好意思,我忘记接受答案了...谢谢! - Robert C Edwards
1
在我回答之前,我询问了问题;-) - zerkms
5个回答

24

通过将函数结果作为常量值传递而不使用中间变量,您可以将其长度减半:

define('AUTH_KEY', getenv('AUTH_KEY'));

或者在循环中这样做:

$vars = array('AUTH_KEY', 'SECURE_AUTH_KEY', ...);
foreach ($vars as $var) {
    define($var, getenv($var));
}

啊,太好了...这就是我缺失的语法。 - Robert C Edwards
4
在循环中定义常量时,会失去IDE的支持。 - Okneloper

14

从WordPress 5.5.0开始

WordPress添加了一个新的函数来处理环境变量,具有3种不同的可能值。

您可以使用wp_get_environment_type()函数获取当前环境。

用法示例:

If(wp_get_environment_type() === 'development') {
 // do something
} else {
 // do something
}

默认情况下,如果WP_ENVIRONMENT_TYPE为空或无效(除了developmentstagingproduction之外的任何内容),都会返回production

你可以通过wp-config.php文件定义developmentstaging环境。

define( 'WP_ENVIRONMENT_TYPE', 'development' );

1
一个小提示:我正在使用 https://localwp.com/,默认情况下,我注意到它使用“local”来定义值。 - Amr
1
一个小提示:除了确切的4个可能值之外,使用任何其他值定义变量都不会改变其值。可能的值包括“本地”,“开发”,“暂存”和“生产”。 - Amr

14

我更喜欢使用以下方法:

<?php

//GET HOSTNAME INFO
$hostname = $_SERVER['SERVER_NAME']; 

//VERIFY WHICH ENVIRONMENT THE APP IS RUNNING
switch ($hostname) {
    case 'development.dev':
        define('WP_ENV', 'development');
        define('WP_DEBUG', true);
        break;
    case 'staging.mywebsite.com':
        define('WP_ENV', 'staging');
        define('WP_DEBUG', true);
        break;
    case 'www.mywebsite.com':
        define('WP_ENV', 'production');
        define('WP_DEBUG', false);
        break;
    default:
        define('WP_ENV', 'production');
        define('WP_DEBUG', false);
}

?>

我喜欢这个建议将搜索环境分离到它自己的文件中,然后在这里include它们,特别是如果你使用git和代码审查系统。这样可以保持整洁。 - Sgnl
如果您的环境遵循这些特定的URL,并且开发人员没有在他们的/etc/hosts文件中添加特定的URL进行本地测试,那么这将起作用。确保服务器名称已设置并可预测。我还更喜欢使用诸如defined( 'WP_DEBUG' ) || define( 'WP_DEBUG', true );之类的东西,以避免重复定义或覆盖更高层次的设置。 - Sandra

4
使用环境变量来控制WP环境的最佳方法是使用DotEnv (https://github.com/vlucas/phpdotenv)。
这个方法在一篇博客文章中详细介绍:https://m.dotdev.co/secure-your-wordpress-config-with-dotenv-d939fcb06e24
基本方法是在您站点的根目录中创建一个.env文件,并在其中设置环境变量。
但是,由于DotEnv 5版本不再默认使用环境变量,所以请使用以下代码替换博客文章中使用的代码,将其放置在wp-config.php文件顶部...
$app_env = getenv("APP_ENV");
$file = $app_env == null ? ".env" : ".env.".$app_env;
if(file_exists(__DIR__.'/'.$file))
{
    require_once(__DIR__ . '/vendor/autoload.php');
    (Dotenv\Dotenv::createUnsafeImmutable(__DIR__,$file))->load();
    error_log("Environment loaded from ".$file);
} else {
    error_log("*WARNING* environment file not found: ".$file);
}

.env文件看起来像这样...

# MySQL settings

DB_NAME=wpbench
DB_USER=wpuser
DB_PASSWORD=password
DB_HOST=localhost
DB_CHARSET=utf8
DB_COLLATE=

在wp-config.php文件中定义常量的方式如下:

/** The name of the database for WordPress */
define( 'DB_NAME', getenv('DB_NAME'));

/** MySQL database username */
define( 'DB_USER', getenv('DB_USER'));

/** MySQL database password */
define( 'DB_PASSWORD', getenv('DB_PASSWORD'));

/** MySQL hostname */
define( 'DB_HOST', getenv('DB_HOST'));

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', getenv('DB_CHARSET'));

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', getenv('DB_COLLATE'));

使用 APP_ENV 变量在变量集之间进行切换。例如,创建 .env.production 和 .env.staging 文件。如果 .env 文件不存在,则从环境中提取值,这对于云部署非常有效。


谢谢提供链接。它需要进行一些小的改动,尤其是关于使用 getenv('ENV_KEY') 的地方,应该替换为 $_SERVER['ENV_KEY'] - tsega
2
@tsega 我曾经也遇到过这个问题。尽管 DotEnv 文档中标注环境变量不是线程安全的,但我还是决定使用 get_env()。如果环境变量不会改变,那么线程安全并不重要。而且它们不应该改变...它们是静态配置的一部分。在云服务(如 Azure)上配置 WP 需要环境变量。 - AQuirky
在管理员端它是如何工作的,在我看来前端是正常工作的,但当我尝试登录时出现错误,没有环境变量。 - Noor Fahad

2
你可以尝试这样做:
- 在根目录下添加一个名为".env"的文件,并添加你的秘密变量。
DB_NAME=my_db_name
DB_USER=root
DB_PASSWORD=root
DB_HOST=localhost

-将wp-config.php更新为以下内容

$env = [];
if( file_exists( '.env' ) && count( parse_ini_file( '.env' ) ) > 0 ) {
    $env = parse_ini_file( '.env' );
} else {
    echo "no env";
    exit;
}

define( 'DB_NAME', $env['DB_NAME'] );
define( 'DB_USER', $env['DB_USER'] );
define( 'DB_PASSWORD', $env['DB_PASSWORD'] );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接