Возможно, если вы читаете эту статью, вы столкнулись с ситуацией, изображенной на рисунке сбоку.
Обычно я получаю такое уведомление от 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”. И обеспечить доступ на запись.