WordPress: Difference between revisions

From NixOS Wiki
imported>Onny
Add infos about error logging
imported>Onny
Add note about auto enable plugins
Line 50: Line 50:
Make sure that the source of your language package corresponds to the Wordpress package version you're using. Consult the [https://translate.wordpress.org translation portal] of Wordpress for the specific country and language codes available. This example is using the code <code>de_DE</code> (Germany/German) in the source URL and also the <code>extraConfig</code> part.
Make sure that the source of your language package corresponds to the Wordpress package version you're using. Consult the [https://translate.wordpress.org translation portal] of Wordpress for the specific country and language codes available. This example is using the code <code>de_DE</code> (Germany/German) in the source URL and also the <code>extraConfig</code> part.


=== Plugins and themes ===
=== Themes ===


In case you want to package and add custom plugins and themes, you can add these too
Unfortunately themes and plugins [https://github.com/NixOS/nixpkgs/pull/173622 haven't been packaged yet in nixpkgs]. In case you want to package and add custom themes yourself, the configuration could look like this


<syntaxHighlight lang="nix">
<syntaxHighlight lang="nix">
let
let


# For shits and giggles, let's package the responsive theme
responsive = pkgs.stdenv.mkDerivation {
responsive = pkgs.stdenv.mkDerivation {
   name = "responsive";
   name = "responsive";
  # Download the theme from the wordpress site
   src = pkgs.fetchurl {
   src = pkgs.fetchurl {
     url = http://wordpress.org/themes/download/responsive.1.9.7.6.zip;
     url = http://wordpress.org/themes/download/responsive.1.9.7.6.zip;
     sha256 = "06i26xlc5kdnx903b1gfvnysx49fb4kh4pixn89qii3a30fgd8r8";
     sha256 = "06i26xlc5kdnx903b1gfvnysx49fb4kh4pixn89qii3a30fgd8r8";
   };
   };
  # We need unzip to build this package
   buildInputs = [ pkgs.unzip ];
   buildInputs = [ pkgs.unzip ];
  # Installing simply means copying all files to the output directory
   installPhase = "mkdir -p $out; cp -R * $out/";
   installPhase = "mkdir -p $out; cp -R * $out/";
};
};


# Wordpress plugin 'akismet' installation example
in {
 
  services.wordpress.sites."localhost" = {
    themes = [ responsive ];
    virtualHost.adminAddr = "hello@example.org";
  };
 
}
</syntaxHighlight>
 
You can package any available Wordpress theme, for example from the [https://wordpress.org/themes official themes repository]. Be sure to replace the ''name'', url and ''sha256'' part according to your desired theme.
 
If you want to automatically enable the ''responsive'' theme, add this </code>extraConfig</code> line
 
<syntaxHighlight lang="nix">
extraConfig = ''
  // Activate and enable theme responsive as default
  define ('WP_DEFAULT_THEME', 'responsive');
'';
</syntaxHighlight>
 
=== Plugins ===
 
Packaging plugins, for example from the [https://wordpress.org/plugins official plugins repository], is similar to the approach used above
 
<syntaxHighlight lang="nix">
let
 
akismet = pkgs.stdenv.mkDerivation {
akismet = pkgs.stdenv.mkDerivation {
   name = "akismet";
   name = "akismet";
  # Download the theme from the wordpress site
   src = pkgs.fetchurl {
   src = pkgs.fetchurl {
     url = https://downloads.wordpress.org/plugin/akismet.3.1.zip;
     url = https://downloads.wordpress.org/plugin/akismet.3.1.zip;
     sha256 = "1i4k7qyzna08822ncaz5l00wwxkwcdg4j9h3z2g0ay23q640pclg";
     sha256 = "1i4k7qyzna08822ncaz5l00wwxkwcdg4j9h3z2g0ay23q640pclg";
   };
   };
  # We need unzip to build this package
   buildInputs = [ pkgs.unzip ];
   buildInputs = [ pkgs.unzip ];
  # Installing simply means copying all files to the output directory
   installPhase = "mkdir -p $out; cp -R * $out/";
   installPhase = "mkdir -p $out; cp -R * $out/";
};
};
Line 88: Line 108:


   services.wordpress.sites."localhost" = {
   services.wordpress.sites."localhost" = {
    themes = [ responsive ];
     plugins = [ akismet ];
     plugins = [ akismet ];
     virtualHost.adminAddr = "hello@example.org";
     virtualHost.adminAddr = "hello@example.org";
    extraConfig = ''
      // Activate and enable theme responsive as default
      define ('WP_DEFAULT_THEME', 'responsive');
    '';
   };
   };


Line 100: Line 115:
</syntaxHighlight>
</syntaxHighlight>


Unfortunately you'll have to enable plugins every time you update or install them manually. Hopefully Wordpress plugins and themes will also be packaged inside the Nixpkgs repository, see [https://github.com/NixOS/nixpkgs/pull/173622 this draft pull request].
In case you want to automatically enable the plugin, in this example ''akismet'', you can add following to <code>extraConfig</code>


<syntaxHighlight lang="nix">
extraConfig = ''
  // Activate and enable theme responsive as default
  if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');
  require_once(ABSPATH . 'wp-settings.php');
  require_once ABSPATH . 'wp-admin/includes/plugin.php';
  activate_plugin( 'akismet/akismet.php' );
'';
</syntaxHighlight>
== Tips and tricks ==
== Tips and tricks ==



Revision as of 15:15, 16 September 2022

Wordpress is a self-hosted content management web application, especially designed for blogging but also a good start to create your own website. It can customized with themes and an in-build site editor and further extended with plugins.

Installation

Note: Parts of this instruction and module are not yet upstreamed and still being reviewed as an open PR.

A simple local setup of Wordpress can be enabled with the following setup

services.wordpress.sites."localhost" = {
  enable = true;
  virtualHost.adminAddr = "hello@example.org";
};

Visit http://localhost to setup your new Wordpress instance. By default, a Mysql server is configured automatically so you won't have to setup the database backend.

Configuration

Language

The default language of the Wordpress module will be English. It is possible to package additional languages and make them available for your specific instance. Using extraConfig you can configure the default language. In this example, we're going to package and enable the German language.

{ pkgs, ... }: let

  language-de = pkgs.stdenv.mkDerivation {
    name = "language-de";
    src = pkgs.fetchurl {
      url = "https://de.wordpress.org/wordpress-6.0.1-de_DE.tar.gz";
      sha256 = "sha256-dlas0rXTSV4JAl8f/UyMbig57yURRYRhTMtJwF9g8h0=";
    };
    installPhase = "mkdir -p $out; cp -r ./wp-content/languages/* $out/";
  };

in {

  services.wordpress.sites."localhost" = {
    enable = true;
    languages = [ language-de ];
    virtualHost.adminAddr = "hello@example.org";
    extraConfig = ''
      define ('WPLANG', 'de_DE');
    '';
  };

}

Make sure that the source of your language package corresponds to the Wordpress package version you're using. Consult the translation portal of Wordpress for the specific country and language codes available. This example is using the code de_DE (Germany/German) in the source URL and also the extraConfig part.

Themes

Unfortunately themes and plugins haven't been packaged yet in nixpkgs. In case you want to package and add custom themes yourself, the configuration could look like this

let

responsive = pkgs.stdenv.mkDerivation {
  name = "responsive";
  src = pkgs.fetchurl {
    url = http://wordpress.org/themes/download/responsive.1.9.7.6.zip;
    sha256 = "06i26xlc5kdnx903b1gfvnysx49fb4kh4pixn89qii3a30fgd8r8";
  };
  buildInputs = [ pkgs.unzip ];
  installPhase = "mkdir -p $out; cp -R * $out/";
};

in {

  services.wordpress.sites."localhost" = {
    themes = [ responsive ];
    virtualHost.adminAddr = "hello@example.org";
  };

}

You can package any available Wordpress theme, for example from the official themes repository. Be sure to replace the name, url and sha256 part according to your desired theme.

If you want to automatically enable the responsive theme, add this extraConfig line

extraConfig = ''
  // Activate and enable theme responsive as default
  define ('WP_DEFAULT_THEME', 'responsive');
'';

Plugins

Packaging plugins, for example from the official plugins repository, is similar to the approach used above

let

akismet = pkgs.stdenv.mkDerivation {
  name = "akismet";
  src = pkgs.fetchurl {
    url = https://downloads.wordpress.org/plugin/akismet.3.1.zip;
    sha256 = "1i4k7qyzna08822ncaz5l00wwxkwcdg4j9h3z2g0ay23q640pclg";
  };
  buildInputs = [ pkgs.unzip ];
  installPhase = "mkdir -p $out; cp -R * $out/";
};

in {

  services.wordpress.sites."localhost" = {
    plugins = [ akismet ];
    virtualHost.adminAddr = "hello@example.org";
  };

}

In case you want to automatically enable the plugin, in this example akismet, you can add following to extraConfig

extraConfig = ''
  // Activate and enable theme responsive as default
  if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');
  require_once(ABSPATH . 'wp-settings.php');
  require_once ABSPATH . 'wp-admin/includes/plugin.php';
  activate_plugin( 'akismet/akismet.php' );
'';

Tips and tricks

Enable SSL behind reverse proxy

In case you're running Wordpress behind a reverse proxy which offers a SSL/https connection to the outside, you can force Wordpress to use the https protocol

services.wordpress.sites."localhost".extraConfig = ''
  // Needed to run behind reverse proxy
  define('FORCE_SSL_ADMIN', true);
  $_SERVER['HTTPS']='on';
'';

Troubleshooting

Enable logging

To enable logging add the following lines to extraConfig

services.wordpress.sites."localhost".extraConfig = ''
  define( 'WP_DEBUG', true );
  define( 'WP_DEBUG_LOG', true );
  ini_set( 'error_log', '/var/lib/wordpress/localhost/debug.log' );
'';

Since the default location to the folder wp-content is not writable, we redirect the log file path to /var/lib/wordpress/localhost/debug.log. All error messages will be stored there. Change the folder name localhost to the name of your site.

In case you want to print error messages directly in your browser, append following line

services.wordpress.sites."localhost".extraConfig = ''
  @ini_set( 'display_errors', 1 );
'';

Please note that this exposes sensible information about your server setup therefore this option should not be enabled in production.