WordPress запрашивает учетные данные для FTP. Что я должен делать?

Возможно, если вы читаете эту статью, вы столкнулись с ситуацией, изображенной на рисунке сбоку.
Обычно я получаю такое уведомление от WordPress на машинах местного разработчика и на серверах, где используется ручная установка с использованием SSH. На самом деле я не помню, чтобы я когда-либо сталкивался с этим на общем хостинге, которые доступны через FTP.
Вы получаете это уведомление при попытки обновить WordPress или установить/обновить плагины или темы.
Не беспокойтесь, я не дам вам быстрое решение (или два).
- Ну, видимо, вы можете попытаться предоставить учетные данные. Никогда не делал это, слишком параноидально для этого 🙂
- В ролях магические заклинания, приведенному ниже.
Волшебное заклинание
- Поместите следующую строку в ваш wp-config.php:
define('FS_METHOD', 'direct');
- Укажите свой сервер HTTP с доступом для записи ко всей папке WordPress, например, так (обновить его с вашими собственными конкретными значениями):
cd _wordpress_dir_ chown -R _username_:www-data . # задания группы в одним файле httpd использует, www-data для nginx в моем случае chmod -R g+w . # добавить доступ для записи в группу
На самом деле иногда вы можете выполнить только один из шагов (любой), но выполнение обоих дает 100% -ный результат.
Немного теории для заклинания
Если вы хотите знать, достаточно вам раскопать файл /wp-admin/includes/file.php ~ 900 строк вниз и найти эту функцию.
/**
* Determines which method to use for reading, writing, modifying, or deleting
* files on the filesystem.
*
* The priority of the transports are: Direct, SSH2, FTP PHP Extension, FTP Sockets
* (Via Sockets class, or `fsockopen()`). Valid values for these are: 'direct', 'ssh2',
* 'ftpext' or 'ftpsockets'.
*
* The return value can be overridden by defining the `FS_METHOD` constant in `wp-config.php`,
* or filtering via {@see 'filesystem_method'}.
*
* @link https://codex.wordpress.org/Editing_wp-config.php#WordPress_Upgrade_Constants
*
* Plugins may define a custom transport handler, See WP_Filesystem().
*
* @since 2.5.0
*
* @global callable $_wp_filesystem_direct_method
*
* @param array $args Optional. Connection details. Default empty array.
* @param string $context Optional. Full path to the directory that is tested
* for being writable. Default false.
* @param bool $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable.
* Default false.
* @return string The transport to use, see description for valid return values.
*/
function get_filesystem_method( $args = array(), $context = false, $allow_relaxed_file_ownership = false ) {
$method = defined('FS_METHOD') ? FS_METHOD : false; // Please ensure that this is either 'direct', 'ssh2', 'ftpext' or 'ftpsockets'
if ( ! $context ) {
$context = WP_CONTENT_DIR;
}
// If the directory doesn't exist (wp-content/languages) then use the parent directory as we'll create it.
if ( WP_LANG_DIR == $context && ! is_dir( $context ) ) {
$context = dirname( $context );
}
$context = trailingslashit( $context );
if ( ! $method ) {
$temp_file_name = $context . 'temp-write-test-' . time();
$temp_handle = @fopen($temp_file_name, 'w');
if ( $temp_handle ) {
// Attempt to determine the file owner of the WordPress files, and that of newly created files
$wp_file_owner = $temp_file_owner = false;
if ( function_exists('fileowner') ) {
$wp_file_owner = @fileowner( __FILE__ );
$temp_file_owner = @fileowner( $temp_file_name );
}
if ( $wp_file_owner !== false && $wp_file_owner === $temp_file_owner ) {
// WordPress is creating files as the same owner as the WordPress files,
// this means it's safe to modify & create new files via PHP.
$method = 'direct';
$GLOBALS['_wp_filesystem_direct_method'] = 'file_owner';
} elseif ( $allow_relaxed_file_ownership ) {
// The $context directory is writable, and $allow_relaxed_file_ownership is set, this means we can modify files
// safely in this directory. This mode doesn't create new files, only alter existing ones.
$method = 'direct';
$GLOBALS['_wp_filesystem_direct_method'] = 'relaxed_ownership';
}
@fclose($temp_handle);
@unlink($temp_file_name);
}
}
if ( ! $method && isset($args['connection_type']) && 'ssh' == $args['connection_type'] && extension_loaded('ssh2') && function_exists('stream_get_contents') ) $method = 'ssh2';
if ( ! $method && extension_loaded('ftp') ) $method = 'ftpext';
if ( ! $method && ( extension_loaded('sockets') || function_exists('fsockopen') ) ) $method = 'ftpsockets'; //Sockets: Socket extension; PHP Mode: FSockopen / fwrite / fread
/**
* Filter the filesystem method to use.
*
* @since 2.6.0
*
* @param string $method Filesystem method to return.
* @param array $args An array of connection details for the method.
* @param string $context Full path to the directory that is tested for being writable.
* @param bool $allow_relaxed_file_ownership Whether to allow Group/World writable.
*/
return apply_filters( 'filesystem_method', $method, $args, $context, $allow_relaxed_file_ownership );
}
Дело в том, чтобы определить, может ли WordPress изменить сам, он пытается создать временный файл. Чем он сравнивает временный идентификатор владельца файла с владельцем сценария WordPress. Если временный файл создается, то WP не нуждается в каких-либо полномочий. В противном случае WP пытается проверить, может ли файловая система быть доступна по FTP или SSH.
Чтобы ярлык этой сложной проверки вы можете установить константу FS_METHOD на значение «direct». И обеспечить доступ на запись.
Редактор: AndreyEx
