Я хочу создать скрипт для резервного копирования всех моих установок WordPress без необходимости отмечать все каталоги.
Я хочу проверить наличие файла wp-config.php и создать резервную копию базы данных с информацией в этом файле.
Вот мой скрипт, который всегда выводит «ничего не найдено»:
$content = file_get_contents($sub_dir . '/wp-config.php');
if (preg_match_all("/define\('DB_NAME', '(.*?)'\)/", preg_quote($content, '/'), $result)) {
print_r($result);
}
else
print "nothing found\n";
Я хочу сделать такой же анализ с DB_USER
, DB_PASSWORD
, а также DB_HOST
,
Вот пример содержимого в этом файле конфигурации:
../...
// ** Réglages MySQL - Votre hébergeur doit vous fournir ces informations. ** //
/** Nom de la base de données de WordPress. */
define('DB_NAME', 'thedbname');
/** Utilisateur de la base de données MySQL. */
define('DB_USER', 'thedbuser');
/** Mot de passe de la base de données MySQL. */
define('DB_PASSWORD', 'thedbpassword');
/** Adresse de l'hébergement MySQL. */
define('DB_HOST', 'thedbhost');
../...
Функция preg_quote()
экранирует регулярные выражения специальных символов, в том числе (
а также )
поэтому ваша строка темы не содержит
define('DB_NAME', 'thedbname');
Вместо этого он содержит
define\('DB_NAME', 'thedbname'\);
и ваше регулярное выражение не работает.
Просто удалите preg_quote()
из вашего кода, вот так:
if (preg_match_all("/define\('DB_NAME', '(.*?)'\)/", $content, $result)) {
print_r($result);
} else { // note: I added braces; it's better to use them always.
print "nothing found\n";
}
Это работает правильно и выводит:
Array
(
[0] => Array
(
[0] => define('DB_NAME', 'thedbname')
)
[1] => Array
(
[0] => thedbname
)
)
Вот это функция, которая читает все WP DB определяет:
function get_wordpress_data() {
$content = @file_get_contents( '../wp-config.php' );
if( ! $content ) {
return false;
}
$params = [
'db_name' => "/define.+?'DB_NAME'.+?'(.*?)'.+/",
'db_user' => "/define.+?'DB_USER'.+?'(.*?)'.+/",
'db_password' => "/define.+?'DB_PASSWORD'.+?'(.*?)'.+/",
'db_host' => "/define.+?'DB_HOST'.+?'(.*?)'.+/",
];
$return = [];
foreach( $params as $key => $value ) {
$found = preg_match_all( $value, $content, $result );
if( $found ) {
$return[ $key ] = $result[ 1 ][ 0 ];
} else {
$return[ $key ] = false;
}
}
return $return;
}
это возвращает массив как это:
array (size=4)
'db_name' => string '.........'
'db_user' => string '.........'
'db_password' => string '.........'
'db_host' => string 'localhost'