diff --git a/nixos/doc/manual/from_md/release-notes/rl-2305.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2305.section.xml
index 12023ce0797c..66e53106cbce 100644
--- a/nixos/doc/manual/from_md/release-notes/rl-2305.section.xml
+++ b/nixos/doc/manual/from_md/release-notes/rl-2305.section.xml
@@ -337,6 +337,16 @@
which now also accepts structured settings.
+
+
+ The wordpress service now takes
+ configuration via the
+ services.wordpress.sites.<name>.settings
+ attribute set, extraConfig is still
+ available to append additional text to
+ wp-config.php.
+
+
To reduce closure size in
diff --git a/nixos/doc/manual/release-notes/rl-2305.section.md b/nixos/doc/manual/release-notes/rl-2305.section.md
index c2ba8658d69c..98e7c6455c23 100644
--- a/nixos/doc/manual/release-notes/rl-2305.section.md
+++ b/nixos/doc/manual/release-notes/rl-2305.section.md
@@ -92,6 +92,8 @@ In addition to numerous new and upgraded packages, this release has the followin
The `{aclUse,superUser,disableActions}` attributes have been renamed, `pluginsConfig` now also accepts an attribute set of booleans, passing plain PHP is deprecated.
Same applies to `acl` which now also accepts structured settings.
+- The `wordpress` service now takes configuration via the `services.wordpress.sites..settings` attribute set, `extraConfig` is still available to append additional text to `wp-config.php`.
+
- To reduce closure size in `nixos/modules/profiles/minimal.nix` profile disabled installation documentations and manuals. Also disabled `logrotate` and `udisks2` services.
- The minimal ISO image now uses the `nixos/modules/profiles/minimal.nix` profile.
diff --git a/nixos/modules/services/web-apps/wordpress.nix b/nixos/modules/services/web-apps/wordpress.nix
index 43a6d7e75dc6..416ad8556bdd 100644
--- a/nixos/modules/services/web-apps/wordpress.nix
+++ b/nixos/modules/services/web-apps/wordpress.nix
@@ -38,29 +38,53 @@ let
'';
};
- wpConfig = hostName: cfg: pkgs.writeText "wp-config-${hostName}.php" ''
-
- '';
+ require_once(ABSPATH . 'wp-settings.php');
+ ?>
+ '';
+ checkPhase = "${pkgs.php81}/bin/php --syntax-check $target";
+ };
+
+ mkPhpValue = v: let
+ isHasAttr = s: isAttrs v && hasAttr s v;
+ in
+ if isString v then escapeShellArg v
+ # NOTE: If any value contains a , (comma) this will not get escaped
+ else if isList v && any lib.strings.isCoercibleToString v then escapeShellArg (concatMapStringsSep "," toString v)
+ else if isInt v then toString v
+ else if isBool v then boolToString v
+ else if isHasAttr "_file" then "trim(file_get_contents(${lib.escapeShellArg v._file}))"
+ else if isHasAttr "_raw" then v._raw
+ else abort "The Wordpress config value ${lib.generators.toPretty {} v} can not be encoded."
+ ;
secretsVars = [ "AUTH_KEY" "SECURE_AUTH_KEY" "LOGGED_IN_KEY" "NONCE_KEY" "AUTH_SALT" "SECURE_AUTH_SALT" "LOGGED_IN_SALT" "NONCE_SALT" ];
secretsScript = hostStateDir: ''
@@ -77,7 +101,7 @@ let
fi
'';
- siteOpts = { lib, name, ... }:
+ siteOpts = { lib, name, config, ... }:
{
options = {
package = mkOption {
@@ -283,6 +307,42 @@ let
'';
};
+ settings = mkOption {
+ type = types.attrsOf types.anything;
+ default = {};
+ description = lib.mdDoc ''
+ Structural Wordpress configuration.
+ Refer to
+ for details and supported values.
+ '';
+ example = literalExpression ''
+ {
+ WP_DEFAULT_THEME = "twentytwentytwo";
+ WP_SITEURL = "https://example.org";
+ WP_HOME = "https://example.org";
+ WP_DEBUG = true;
+ WP_DEBUG_DISPLAY = true;
+ WPLANG = "de_DE";
+ FORCE_SSL_ADMIN = true;
+ AUTOMATIC_UPDATER_DISABLED = true;
+ }
+ '';
+ };
+
+ mergedConfig = mkOption {
+ readOnly = true;
+ default = mergeConfig config;
+ defaultText = literalExpression ''
+ {
+ DISALLOW_FILE_EDIT = true;
+ AUTOMATIC_UPDATER_DISABLED = true;
+ }
+ '';
+ description = lib.mdDoc ''
+ Read only representation of the final configuration.
+ '';
+ };
+
extraConfig = mkOption {
type = types.lines;
default = "";
@@ -290,11 +350,16 @@ let
Any additional text to be appended to the wp-config.php
configuration file. This is a PHP script. For configuration
settings, see .
+
+ **Note**: Please pass structured settings via
+ `services.wordpress.sites.${name}.settings` instead.
'';
example = ''
- define( 'AUTOSAVE_INTERVAL', 60 ); // Seconds
+ @ini_set( 'log_errors', 'Off' );
+ @ini_set( 'display_errors', 'On' );
'';
};
+
};
config.virtualHost.hostName = mkDefault name;