文件系统
概述
这文件系统API,添加WordPress 2.6,最初是为WordPress自己的自动更新功能而创建的。
文件系统API将读取和编写本地文件读取到要在各种主机类型上安全完成的文件系统所需的功能。
它通过wp_filesystem_base类和几个子类,这些子类实现与本地文件系统连接的不同方式,具体取决于单个主机支持。
任何需要在本地编写文件的主题或插件都应使用wp_filesystem
班级家庭。
目的
不同的托管系统在配置其网络服务器的方式方面具有不同的限制。
特别是,许多托管系统具有与WordPress文件所有者不同的用户网络服务器。在这种情况下,从Web服务器用户编写文件的过程将具有Web服务器用户帐户所拥有的结果文件,而不是实际用户的帐户。这可能会导致共享托管情况中的安全问题,其中多个用户正在为不同站点共享相同的Web服务器。
wp_filesystem
能够检测书面文件的用户何时不匹配,并使用FTP或类似方法切换到方法。根据可用的PHP库,WP_FILESYSTEM支持使用FTP的三种不同方法(通过扩展,套接字或超级SSH),并将自动选择正确的方法。
在这种情况下,实施此代码的插件或主题需要向用户请求FTP凭据。已经添加了功能以使其容易做到,并标准化了凭证条目的外观和感觉。
文件系统API类参考
- 班级:wp_filesystem_base
- 班级:wp_filesystem_direct
- 班级:wp_filesystem_ftpext
- 班级:wp_filesystem_ftpsocket
- 班级:wp_filesystem_ssh2
- 功能:request_filesystem_credentials()
获得凭据
使用WP_FILESYSTEM的第一步是向用户请求凭据。实现这一目标的正常方式是在保存表单输入的结果时,或者您已经确定需要写入文件。
凭据表格可以通过使用以下代码显示在管理页面上:
$ url = wp_nonce_url('themes.php?page = example','example-theme-options');if(false ===($ creds = request_filesystem_credentials($ url,'',false,false,null))){return;//在这里停止处理}
这request_filesystem_credentials()呼叫需要五个论点。
- 应提交表单的URL(上面的示例中使用了主题页的非计量URL)
- 方法覆盖(通常您应该将其作为空字符串:“”)
- 错误标志(通常是错误的,除非检测到错误,请参见下文)
- 上下文目录(false或您要测试的访问的特定目录路径)
- 表单字段(您希望“通过”所得的凭据表单中的表单字段名称数组
这request_filesystem_credentials
呼叫将测试以查看它是否能够直接写入本地文件系统,而无需首先凭据。如果是这种情况,那么它将返回真实而不会做任何事情。然后,您的代码可以继续使用wp_filesystem
班级。
这request_filesystem_credentials
呼叫还考虑了硬编码信息,例如主机名或用户名或密码,已插入wp-config.php
使用定义的文件。如果这些文件是在该文件中预定的,则此调用将返回该信息,而不是显示表单,绕过为用户的表单。
如果它确实需要用户的凭据,则将输出FTP信息表格并返回false。在这种情况下,您应该停止进一步处理,以允许用户输入凭据。您指定的任何表单字段名称都将包含在结果表单中为隐藏输入,并且当用户重新提交表单时,这次将返回使用FTP凭据。
注意:请勿使用保留的名称主机名
,,,,用户名
,,,,密码
,,,,public_key
, 或者private_key
对于您自己的输入。这些由凭证形式本身使用。或者,如果您确实使用它们,request_filesystem_credentials
功能将假定它们是传入的FTP凭据。
当提交凭据表单时,它将查看这些字段的传入帖子数据,如果发现,它将以适合传递给WP_FILESYSTEM的数组返回,这是下一步。
初始化wp_filesystem_base
在使用WP_FILESYSTEM之前,必须使用适当的凭据初始化它。可以这样做:
如果(!wp_filesystem($ creds)){request_filesystem_credentials($ url,'',true,false,null);返回;}
首先您打电话给wp_filesystem
功能,从之前传递凭据。然后,它将尝试验证凭据。如果它们很好,那么它将返回真实。如果没有,则它将返回false。
对于不良凭据,上述代码然后再次呼叫request_filesystem_credentials()
,但是这次将错误标志设置为true。这迫使功能再次显示表单,这次是给用户说他们的信息不正确的错误消息。然后,用户可以重新输入他们的信息,然后重试。
使用wp_filesystem_base班级
一旦班级初始化,则全局$ wp_filesystem
变量被定义并可供您使用。这wp_filesystem_base
类定义了您可以用来读取本地文件的几种方法。例如,要编写文件,您可以执行此操作:
全局$ wp_filesystem;$ wp_filesystem-> put_contents('/tmp/example.txt','',''',file的示例内容',fs_chmod_file // wp files的预定模式设置);
其他可用方法包括get_contents()
和get_contents_array()
读取文件;wp_content_dir()
,,,,wp_雷竞技plugins_dir()
, 和wp_themes_dir()
将返回文件系统路径到这些目录;mkdir()
和rmdir()
制作和删除目录;以及其他一些方便的文件系统相关功能。
技巧和窍门
什么时候可以打电话request_filesystem_credentials()
?
对于使用WP Filesystem API的开发人员来说,最初的挑战之一是您不能在任何地方初始化它。这request_filesystem_credentials()
直到之后才能使用功能wp_loaded
动作钩,仅包含在管理区域中。您可以使用的最早钩子之一是Admin_Init。
WP文件系统API方法论
打电话的另一个问题request_filesystem_credentials()
您无法直接确定您是否可以直接访问文件系统,或者是否将提示用户获得凭据。从UX的角度来看,如果您想在激活插件时对文件进行更改,这将变得有问题。试想一下,用户可以通过其管理区域安装插件,输入FTP详细信息,完成安装并激活您的插件。但是,一旦他们这样做,他们就会再次提示他们再次输入FTP细节,并抓住他们的原因。
一个更好的解决方案是添加通知(例如,使用admin_notice)向用户解释您的插件需要写入文件系统以完成安装。除此通知外,您还将添加一个按钮或链接,将您的功能调用触发到request_filesystem_credentials()
。
但是,让我们进一步扩展这种情况,并说该插件每次更新插件时都需要访问文件系统。如果您定期发布更新和错误修复,则每次升级时,用户很快就可以单击可操作的按钮变得很脆弱。很好的是确定我们是否有直接的写入访问request_filesystem_credentials()
并默默地进行安装。那就是get_filesystem_method()
功能发挥作用。
$ access_type = get_filesystem_method();if($ access_type ==='direct'){/ *您可以安全地运行request_filesystem_credentials()而无需任何问题,并且不必担心传递url */$ creds = request_filesystem_credentials(site_url()。-admin/','',false,false,array());/ *初始化api */ if(!wp_filesystem($ creds)){/ *任何问题,我们退出 */ return false;}全局$ wp_filesystem;/*在下面进行文件操作* /} else { /*没有直接的写入访问。提示用户通知 */ add_action('admin_notices','you_admin_notice_function');}
这种方法适合所有参与者。没有直接写入权限的用户会提示更改文件系统,而插件在可以直接写入文件系统的站点上没有注意到(以一种很好的方式)。
使用路径
值得盐的WordPress开发人员应该熟悉设置常数或变量以访问插件的路径。通常看起来像这样:
define('my_plugin_dir',plugin_dir_path(__file__));
使用文件系统API时需要考虑的是文件的途径并不总是相同的。使用直接方法时,您可以安全地使用my_plugin_dir
恒定,但是如果您使用FTP或SSH方法时尝试执行相同的操作,那么您可能会遇到问题。这是因为FTP和SSH通常扎根于沿绝对路径的某个地方的目录。现在,文件系统API为我们提供了通过诸如此类的方法克服这个问题的方法$ wp_filesystem-> wp_content_dir()
和$ wp_filesystem-> w雷竞技p_plugins_dir()
,但两次定义插件的路径是不切实际的。
/ *将“直接”绝对路径替换为文件系统API路径 */ $ plugin_path = str_replace(abspath,$ wp_filesystem-> abspath(),my_plugin_dir);/ *现在,我们可以在所有文件系统API方法调用 */if(!$ wp_filesystem-> is_dir($ plugin_path。'/config/'))中使用$ plugin_path */ *目录不存在,所以让我们创建它 */$ wp_filesystem-> mkdir($ plugin_path。'/config/');}
unzip_file($ file,$ to);
虽然此功能需要初始化文件系统API,但它不是$ wp_filesystem
对象,这可能就是为什么其参数相互矛盾的原因。第一个参数,$文件
,需要是文件的绝对“直接”路径,而$ toparameter
需要指向文件系统的绝对路径。
define('my_plugin_dir',plugin_dir_path(__file__));全局$ wp_filesystem;//已经初始化了文件系统API以前$ plugin_path = str_replace(abspath,$ wp_filesystem-> abspath(),my_plugin_dir);//获取远程系统绝对路径/ *使用函数 */ $ file = my_plugin_dir的可接受方法。'/plugin-file.zip';$ to = $ plugin_path;$ result = unzip_file($ file,$ to);if($ result!== true){// unzip失败。处理错误} / *不可接受 * / $ file = my_plugin_dir。'/plugin-file.zip'; $to = MY_PLUGIN_DIR; // $to cannot be the 'direct' absolute path to the folder otherwise FTP and SSH methods are left in the cold unzip_file( $file, $to ); $file = $plugin_path . '/plugin-file.zip'; // If $file isn't the 'direct' absolute path then users not using FTP and SSH methods are left in the cold $to = $plugin_path; unzip_file( $file, $to );