I finally found a solution.
I had to extend the wpdb class inside wp-contents/db.php. It looks like this:
<?php
/**
* WordPress Database Access Abstraction Object
* Custom DB Connection class to provide ssl connection to the database
*/
class ssldb extends wpdb
{
/**
* Connects to the database server and selects a database.
*
* Does the actual setting up
* of the class properties and connection to the database.
*/
public function __construct()
{
if (WP_DEBUG && WP_DEBUG_DISPLAY) {
$this->show_errors();
}
// Use the `mysqli` extension if it exists unless `WP_USE_EXT_MYSQL` is defined as true.
if (function_exists('mysqli_connect')) {
$this->use_mysqli = true;
}
$this->dbuser = DB_USER; //$dbuser;
$this->dbpassword = DB_PASSWORD; //$dbpassword;
$this->dbname = DB_NAME; //$dbname;
$this->dbhost = DB_HOST; //$dbhost;
$this->db_connect();
}
/**
* Connects to and selects database.
*
* If `$allow_bail` is false, the lack of database connection will need to be handled manually.
*
* @since 3.0.0
* @since 3.9.0 $allow_bail parameter added.
*
* @param bool $allow_bail Optional. Allows the function to bail. Default true.
* @return bool True with a successful connection, false on failure.
*/
public function db_connect($allow_bail = true)
{
$this->is_mysql = true;
/*
* Deprecated in 3.9+ when using MySQLi. No equivalent
* $new_link parameter exists for mysqli_* functions.
*/
$new_link = defined('MYSQL_NEW_LINK') ? MYSQL_NEW_LINK : true;
$client_flags = defined('MYSQL_CLIENT_FLAGS') ? MYSQL_CLIENT_FLAGS : 0;
if ($this->use_mysqli) {
/*
* Set the MySQLi error reporting off because WordPress handles its own.
* This is due to the default value change from `MYSQLI_REPORT_OFF`
* to `MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT` in PHP 8.1.
*/
mysqli_report(MYSQLI_REPORT_OFF);
$this->dbh = mysqli_init();
$host = $this->dbhost;
$port = null;
$socket = null;
$is_ipv6 = false;
$host_data = $this->parse_db_host($this->dbhost);
if ($host_data) {
list($host, $port, $socket, $is_ipv6) = $host_data;
}
/*
* If using the `mysqlnd` library, the IPv6 address needs to be enclosed
* in square brackets, whereas it doesn't while using the `libmysqlclient` library.
* @see https://bugs.php.net/bug.php?id=67563
*/
if ($is_ipv6 && extension_loaded('mysqlnd')) {
$host = "[$host]";
}
if (DB_SSL) {
mysqli_ssl_set($this->dbh, MYSQL_SSL_KEY, MYSQL_SSL_CERT, MYSQL_SSL_CA, NULL, NULL);
}
if (WP_DEBUG) {
mysqli_real_connect($this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags);
} else {
// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
@mysqli_real_connect($this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags);
}
if ($this->dbh->connect_errno) {
$this->dbh = null;
/*
* It's possible ext/mysqli is misconfigured. Fall back to ext/mysql if:
* - We haven't previously connected, and
* - WP_USE_EXT_MYSQL isn't set to false, and
* - ext/mysql is loaded.
*/
$attempt_fallback = true;
if ($this->has_connected) {
$attempt_fallback = false;
} elseif (defined('WP_USE_EXT_MYSQL') && ! WP_USE_EXT_MYSQL) {
$attempt_fallback = false;
} elseif (! function_exists('mysql_connect')) {
$attempt_fallback = false;
}
if ($attempt_fallback) {
$this->use_mysqli = false;
return $this->db_connect($allow_bail);
}
}
} else {
if (WP_DEBUG) {
$this->dbh = mysql_connect($this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags);
} else {
// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
$this->dbh = @mysql_connect($this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags);
}
}
if (! $this->dbh && $allow_bail) {
wp_load_translations_early();
// Load custom DB error template, if present.
if (file_exists(WP_CONTENT_DIR . '/db-error.php')) {
require_once WP_CONTENT_DIR . '/db-error.php';
die();
}
$message="<h1>" . __('Error establishing a database connection') . "</h1>\n";
$message .= '<p>' . sprintf(
/* translators: 1: wp-config.php, 2: Database host. */
__('This either means that the username and password information in your %1$s file is incorrect or that contact with the database server at %2$s could not be established. This could mean your host’s database server is down.'),
'<code>wp-config.php</code>',
'<code>' . htmlspecialchars($this->dbhost, ENT_QUOTES) . '</code>'
) . "</p>\n";
$message .= "<ul>\n";
$message .= '<li>' . __('Are you sure you have the correct username and password?') . "</li>\n";
$message .= '<li>' . __('Are you sure you have typed the correct hostname?') . "</li>\n";
$message .= '<li>' . __('Are you sure the database server is running?') . "</li>\n";
$message .= "</ul>\n";
$message .= '<p>' . sprintf(
/* translators: %s: Support forums URL. */
__('If you are unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href="%s">WordPress Support Forums</a>.'),
__('https://wordpress.org/support/forums/')
) . "</p>\n";
$this->bail($message, 'db_connect_fail');
return false;
} elseif ($this->dbh) {
if (! $this->has_connected) {
$this->init_charset();
}
$this->has_connected = true;
$this->set_charset($this->dbh);
$this->ready = true;
$this->set_sql_mode();
$this->select($this->dbname, $this->dbh);
return true;
}
return false;
}
}
global $wpdb;
$wpdb = new ssldb();
I then defined constants in wp-config.php like this:
define('DB_SSL', true);
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
define('MYSQL_SSL_CA', '/path-to-ssl-dir/ca.pem');
define('MYSQL_SSL_CERT', '/path-to-ssl-dir/cert.pem');
define('MYSQL_SSL_KEY', "/path-to-ssl-dir/key.pem");
And It Worked. 🙂