WordPress 4.8.1 использует mysql_connect, который не работает с PHP 7
Я только что обновился до PHP 7 и обнаружил, что WordPress 4.8.1 (последняя версия) по-прежнему использует mysql_connect в модуле wp-db.php, хотя эта функция устарела.
Следующий код взят из wp-db.php, строки 1567-1571:
if ( WP_DEBUG ) {
$this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
} else {
$this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this>dbpassword,
$new_link, $client_flags);
}
Вот что я получаю при попытке запуска программы:
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in D:\ApacheHtdocs\ConneXions\wp-includes\wp-db.php:1570
Stack trace:
#0 D:\ApacheHtdocs\ConneXions\wp-includes\wp-db.php(658): wpdb->db_connect()
#1 D:\ApacheHtdocs\ConneXions\wp-includes\load.php(404): wpdb->__construct('root', '', 'connexions', 'localhost')
#2 D:\ApacheHtdocs\ConneXions\wp-settings.php(106): require_wp_db()
#3 D:\ApacheHtdocs\ConneXions\wp-config.php(104): require_once('D:\ApacheHtdocs...')
#4 D:\ApacheHtdocs\ConneXions\wp-load.php(37): require_once('D:\ApacheHtdocs...')
#5 D:\ApacheHtdocs\ConneXions\wp-blog-header.php(13): require_once('D:\ApacheHtdocs...')
#6 D:\ApacheHtdocs\ConneXions\index.php(17): require('D:\ApacheHtdocs...')
#7 {main} thrown in D:\ApacheHtdocs\ConneXions\wp-includes\wp-db.php on line 1570
Не могу поверить, что WordPress утверждает о совместимости с PHP 7, но при этом не работает с ним. Что я упускаю?

Похоже, что у вас не установлено и/или не включено расширение mysqli на сервере. Если я правильно помню, mysqli
было добавлено в PHP начиная с версии 5.5, а старое расширение mysql
было объявлено устаревшим и полностью удалено с тех пор. Если вы обновились с очень старой версии PHP, возможно, вам нужно дополнительно включить mysqli
.
(WordPress проверяет наличие mysqli
и только если его нет, пытается использовать старые функции mysql
.)

@CJDennis, именно это я и сказал касательно устаревания. Если вы считаете, что в моем английском есть ошибка, вы можете отредактировать ответ ;)

В дополнение к ответу @MarkKaplun, публикую часть кода из класса wpdb:
Вот как определяется wpdb::use_mysqli
:
Инициализируется следующим образом:
/**
* Использовать ли mysqli вместо mysql.
*
* @since 3.9.0
* @access private
* @var bool
*/
private $use_mysqli = false;
а затем в конструкторе wpdb
имеем:
/* Использовать ext/mysqli, если он существует и:
* - WP_USE_EXT_MYSQL определен как false, или
* - Мы используем разработческую версию WordPress, или
* - Мы используем PHP 5.5 или новее, или
* - ext/mysql не загружен.
*/
if ( function_exists( 'mysqli_connect' ) ) {
if ( defined( 'WP_USE_EXT_MYSQL' ) ) {
$this->use_mysqli = ! WP_USE_EXT_MYSQL;
} elseif ( version_compare( phpversion(), '5.5', '>=' ) || ! function_exists( 'mysql_connect' ) ) {
$this->use_mysqli = true;
} elseif ( false !== strpos( $GLOBALS['wp_version'], '-' ) ) {
$this->use_mysqli = true;
}
}

Чтобы решить эту проблему, вам нужно отредактировать файл php.ini.
Выполните поиск, где находится php.ini
Я нашел свой здесь:
/etc/php/php.ini
(хотя я не знаю, какую ОС вы используете, просто найдите свой файл)
Найдите эти две строки:
extension=pdo_mysql.so
extension=mysqli.so
и раскомментируйте их. Вуаля, это должно решить проблему в любой ситуации.
Дополнительные материалы: https://wiki.archlinux.org/index.php/PHP

Вы используете Xampp 7.x для Windows?
Со мной это случилось, когда я обновил Xampp 5.6 до Xampp 7.1. Изучая конфигурационный файл C:\Xampp\php\php.ini, я заметил множество ошибок, связанных с именами PHP расширений (у них отсутствует префикс php_ и суффикс .dll). Одна из них касалась mysqli.
Некорректная настройка, которую я обнаружил:
extension=mysqli
Правильная настройка (после редактирования этой строки):
extension=php_mysqli.dll
Исправление этой строки решило мою проблему.
Кстати: не забудьте исправить все остальные некорректные настройки (правильные имена расширений можно посмотреть в C:\xampp\php\ext).
