在插件中使用wp_filessystem

时间:2013-11-29 作者:Bass Jobsen

我写了一个插件(https://github.com/bassjobsen/custom-bootstrap-editor) 此插件将样式表写入wp-content/uploads/cbe.

我将使用下面的代码来执行此操作:

$upload_dir = wp_upload_dir();
$this->folder = trailingslashit($upload_dir[\'basedir\']).\'cbe/\';
if( !is_dir( $this->folder ) ) wp_mkdir_p( $this->folder );
if ( is_writable( $this->folder ) ){
    file_put_contents( $this->folder.$this->filename, $css);
}
关于上面的第一个问题,检查wp\\u upload\\u dir()是否可写的最佳位置是什么?是否会对此进行标准检查(加上错误)?

阅读后http://ottopress.com/2011/tutorial-using-the-wp_filesystem/ 我还有其他一些问题。

上面提到的帖子告诉我应该使用文件系统API来替换上面的代码。这个观察结果还会是真的吗?

request_filesystem_credentials 似乎工作正常,但每次文件更改都要登录似乎有些过火。我的插件可以跳过登录屏幕吗?

虽然信用卡似乎有效$wp_filesystem->mkdir( $folder )$wp_filesystem->put_contents( $folder.\'/\'.$filename, $css, FS_CHMOD_FILE) 似乎总是返回false。如何调试文件系统API调用?

update感谢@otto file writing works now:

if (isset($_POST[\'SaveCBESettings\'])) {

        if ( !empty($_POST) && check_admin_referer( \'cbe-nonce\') ) 
        {



            $SaveCBESettings = 1;
            $in = true;
            $url = wp_nonce_url(\'options-general.php?page=filewriting\',\'cbe-nonce\');
            if (false === ($creds = request_filesystem_credentials($url, \'\', false, false, array(\'SaveCBESettings\')) ) ) {
                $in = false;
            }
            if ($in && ! WP_Filesystem($creds) ) {
                // our credentials were no good, ask the user for them again
                request_filesystem_credentials($url, \'\', true, false,array(\'SaveCBESettings\'));
                $in = false;
            }
            if($in)
            {
            // by this point, the $wp_filesystem global should be working, so let\'s use it to create a file
            global $wp_filesystem;
            $contentdir = trailingslashit( $wp_filesystem->wp_content_dir() ); 
            $wp_filesystem->mkdir( $contentdir. \'cbe\' );
            if ( ! $wp_filesystem->put_contents(  $contentdir . \'cbe/test.txt\', \'Test file contents\', FS_CHMOD_FILE) ) 
            {
                echo "error saving file!";
            }
                unset($_POST);
            }
        }
}

1 个回复
最合适的回答,由SO网友:Otto 整理而成

这里有几件事需要解释:

在该教程中,我仅选择upload\\u dir作为如何执行此操作的示例。WP\\u文件系统功能如何工作的演示。通常,您不会使用WP\\u文件系统写入上载目录。该代码并不是要复制到实际生产代码中。

正在将CSS、PHP、HTML或任何其他类型的文件(图像除外)写入上载目录。。。然后以某种方式将其包含在网页中,这是不安全的。

不管你怎么做,上传目录应该包含本质上不一定是XSS安全的东西。如果您需要编写要包含在页面中的文件,如样式表,那么您应该在/wp-content下创建自己的文件夹,而不是在/wp-content/uploads下。上传目录应严格用于媒体文件和下载以及通过各种wp\\U上传功能上传的其他内容。

使用$wp\\u文件系统时,有一个方便的函数调用用于获取内容目录路径:$wp_filesystem->wp_content_dir();. 您需要使用此功能,因为“远程”目录路径可能与“本地”目录路径不同。

没有类似的函数来获取uploads\\u dir,因为您通常永远不会这样做。对这些文件使用uploads目录真的没有多大意义。

因此,这将为您提供内容目录的“远程”路径,您可以使用它来编写文件和创建目录等:

$contentdir = trailingslashit( $wp_filesystem->wp_content_dir() ); 
$wp_filesystem->mkdir( $contentdir. \'cbe\' );
$wp_filesystem->put_contents( $contentdir . \'cbe/filename.whatever\', $css, FS_CHMOD_FILE);
等等。当然,您仍然需要请求凭据并使用WP_Filesystem($creds) 先打电话使用global $wp_filesystem, 但这是可行的。

结束

相关推荐