Обновление Sypex Dumper 2 для WordPress: Решение проблем авторизации в PHP 8.3 и WP 6.0+

Введение

Sypex Dumper 2 — отличный инструмент для создания бэкапов MySQL баз данных, который я привык использовать вместе с WordPress когда большие базы данных, как и наверное многие пользователи. Однако с выходом новых версий PHP и WordPress оригинальный плагин перестал работать корректно, а точнее перестал авторизовываться в админке WP и вместо обычного вида плагина я видел пустую страницу. Откатывать назад на устаревшие версии WP и php не было никакого желания. В интернете я не нашел решения.

В этой статье я расскажу, как я исправил проблемы авторизации и сделал Sypex Dumper 2 полностью совместимым с современными версиями PHP 8.3 и WordPress 6.0+.

Проблемы оригинальной версии

Поковырявшись в коде я нашел, что оригинальная версия плагина Sypex Dumper 2, а именно файл авторизации через WordPress имела несколько критических проблем:

1. Устаревшие функции MySQL

php

// Было в оригинале (не работает в PHP 7.0+)
mysql_connect();
mysql_selectdb();
mysql_query();

2. Неправильные пути к файлам

php

// Относительные пути часто ломаются
$path = '../wp-config.php';

3. Устаревшая проверка прав доступа

php

// Устаревший подход
if($user[$config['TAB_PREFIX'] . 'user_level'] > 7)

4. Конфликт переменных

php

// Приводило к ошибке "Array to string conversion"
$user = array(...); // массив данных пользователя
$key = md5(... . $user . ...); // используется как строка

Полное решение

Представляю на ваше обозрение исправленную версию файла авторизации через WP для Sypex Dumper 2:

Исправленный код авторизации

php

<?php
// Sypex Dumper 2 authorization file for WordPress 4.x
// Version 1.3.1
// Исправления для php 8.3 и WP 6.0+ внес Alexander Parkhomenko https://wplife.ru

// =============================================================================
// ОСНОВНЫЕ ИСПРАВЛЕНИЯ:
// 1. Замена mysql_* на mysqli_* для PHP 7.0+
// 2. Абсолютные пути вместо относительных
// 3. Проверка прав через 'capabilities' вместо 'user_level'
// 4. Исправление структуры SQL запросов (ID вместо id)
// 5. Корректная обработка переменной $user
// =============================================================================

// Исправление путей
$path = dirname(dirname(__FILE__)) . '/wp-config.php';
if (!file_exists($path)) {
$path = $_SERVER['DOCUMENT_ROOT'] . '/wp-config.php';
}

$no_cookie = true;
$config = array();
$auth = 0;
$wp_username = '';

// Обработка cookies WordPress
foreach ($_COOKIE as $c => $v) {
if (strpos($c, 'wordpress_logged_in') !== false) {
$config['COOKIE'] = explode('|', $v);
break;
}
}

if (isset($config['COOKIE']) && count($config['COOKIE']) >= 3) {
if (file_exists($path)) {
$file = file_get_contents($path);

if (
preg_match_all("/define\s*\(\s*'(DB_\w+)',\s*'(.*?)'\s*\)\s*;/m", $file, $m, PREG_SET_ORDER) &&
preg_match("/^\\\$table_prefix\s*=\s*'(.+?)'\s*;/m", $file, $t)
) {
$config['TAB_PREFIX'] = stripcslashes($t[1]);
foreach ($m as $c) {
$config[$c[1]] = stripcslashes($c[2]);
}

// Современное соединение MySQLi
$link = mysqli_connect($config['DB_HOST'], $config['DB_USER'], $config['DB_PASSWORD'], $config['DB_NAME']);

if ($link) {
mysqli_set_charset($link, isset($config['DB_CHARSET']) ? $config['DB_CHARSET'] : 'utf8');

$username = mysqli_real_escape_string($link, $config['COOKIE'][0]);
$wp_username = $config['COOKIE'][0];

// Обновленный SQL-запрос для современного WordPress
$query = "SELECT u.ID, meta_key, meta_value
FROM {$config['TAB_PREFIX']}users u
LEFT JOIN {$config['TAB_PREFIX']}usermeta m ON (u.ID = m.user_id)
WHERE u.user_login = '$username'
AND m.meta_key IN ('{$config['TAB_PREFIX']}capabilities', 'session_tokens')";

$r = mysqli_query($link, $query);

if ($r && mysqli_num_rows($r) > 0) {
$user_data = array();
while ($u = mysqli_fetch_assoc($r)) {
$user_data[$u['meta_key']] = $u['meta_value'];
}

if (isset($user_data['session_tokens'])) {
$tokens = unserialize($user_data['session_tokens']);
$token = hash('sha256', $config['COOKIE'][2]);

if (isset($tokens[$token])) {
$session_data = $tokens[$token];
if (time() <= $session_data['expiration']) {
// Проверка современных возможностей
if (isset($user_data[$config['TAB_PREFIX'] . 'capabilities'])) {
$caps = unserialize($user_data[$config['TAB_PREFIX'] . 'capabilities']);
if (isset($caps['administrator']) && $caps['administrator']) {
$auth = 1;
$this->CFG['my_db'] = $config['DB_NAME'];
$this->CFG['exitURL'] = '../wp-admin/';
$user = $wp_username; // String, not array!
}
}
}
}
}
}
mysqli_close($link);
}
}
}
}

if (!$auth) {
$user = '';
}
?>

Ключевые изменения

1. Современный подход к работе с базой данных

Было:

php

if($this->connect($config['DB_HOST'], '', $config['DB_USER'], $config['DB_PASSWORD'])){
    mysql_selectdb($config['DB_NAME']);
    mysql_query("SET NAMES {$config['DB_CHARSET']}");
}

Стало:

php

$link = mysqli_connect($config['DB_HOST'], $config['DB_USER'], $config['DB_PASSWORD'], $config['DB_NAME']);
if ($link) {
    mysqli_set_charset($link, isset($config['DB_CHARSET']) ? $config['DB_CHARSET'] : 'utf8');
}

2. Правильная проверка прав администратора

Было:

php

if($user[$config['TAB_PREFIX'] . 'user_level'] > 7) $auth = 1;

Стало:

php

if (isset($user_data[$config['TAB_PREFIX'] . 'capabilities'])) {
    $caps = unserialize($user_data[$config['TAB_PREFIX'] . 'capabilities']);
    if (isset($caps['administrator']) && $caps['administrator']) {
        $auth = 1;
    }
}

3. Исправление критической ошибки с переменной $user

Было:

php

$user = array(...); // массив данных
// ... где-то в коде Sypex Dumper ...
$key = md5(... . $user . ...); // ОШИБКА! Array to string conversion

Стало:

php

$user_data = array(...); // массив данных
$user = $wp_username; // строка с именем пользователя

Установка и настройка

Шаг 1: Скачайте Sypex Dumper 2

Скачайте последнюю версию Sypex Dumper 2 с официального сайта.

Шаг 2: Установите плагин для WordPress

Установите плагин для WordPress согласно инструкции которая есть в плагине, файл install_ru.txt

Шаг 3: Замените файл авторизации

Замените содержимое файла авторизации auth_wp4.php в папке Sypex Dumper (обычно sxd) на исправленный код выше.

Краткий список основных изменений:

  • Замена mysql_ на mysqli_** — для поддержки PHP 7.0+
  • Исправление путей — абсолютные пути вместо относительных
  • Обновление проверки прав — ‘capabilities’ вместо ‘user_level’
  • Исправление SQL запросов — правильные названия полей (ID вместо id)
  • Обработка переменной $user — передача строки вместо массива
  • Улучшенная обработка ошибок — проверка существования файлов и соединений
  • Совместимость с разными версиями WP — гибкая проверка cookies

Заключение

Исправленная версия Sypex Dumper 2 позволяет продолжать использовать этот удобный инструмент для резервного копирования в современных средах WordPress. Все ключевые проблемы оригинального кода были решены, что обеспечивает стабильную работу плагина.

Если у вас возникли вопросы или нужна помощь с настройкой — оставляйте комментарии ниже!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх