我写了一个插件(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);
}
}
}
最合适的回答,由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
, 但这是可行的。