在插件中使用wp_filessystem存储定制器设置

时间:2013-12-13 作者:Bass Jobsen

我尝试用我在这里得到的答案修复我的插件:Using wp_filesystem in Plugins背景我写了一个主题(https://github.com/bassjobsen/jamedo-bootstrap-start-theme) 和一个插件(https://github.com/bassjobsen/wp-less-to-css) 现在我想在主题中集成插件。插件将CSS文件写入文件夹。使用本机PHP函数写入文件不安全,如下所述:http://ottopress.com/2011/tutorial-using-the-wp_filesystem/. 前面的答案帮助我解决了插件的这个问题。

由@otto relays on提供的解决方案request_filesystem_credentials 这似乎需要一个URL。当插件与主题集成时,这个URL会给我带来一些麻烦。

我的目标是在保存后使用自定义程序中的设置来创建新的css文件。

现在我有in函数。php:

add_action( \'customize_save_after\', \'lesscustomize\' );

function lesscustomize($setting)
{
//$setting is no used here
$updatecss = WP_LESS_to_CSS::$instance;
add_filter( \'add_extra_less_code\', \'add_extra_less_now_live\');

function add_extra_less_now_live($parser)
{
    return \'h1{color:\'.get_theme_mod( \'heading_color\').\'}\';          
}
$updatecss->wpless2csssavecss();
}
在哪里wpless2csssavecss() 现在将文件保存为file_put_contents.这个file_put_contents 应替换为$wp_filesystem->put_contents();. 原因$wp_filesystem 将用作全局凭据。我认为应该可以在lesscustomize() 作用除此之外,我不知道如何在没有URL的情况下做到这一点。将有一个URL,但它是由Ajax调用的,对用户不可见。

使用“customize\\u save\\u after”的想法来自https://stackoverflow.com/questions/14802251/hook-into-the-wordpress-theme-customizer-save-action/16679837

我的第一个问题是,是否可以在lesscustomize()?或者,如果没有,是否还有其他方法可以挂接customizer设置保存操作并获取文件系统凭据以保存我的设置?

update在这个问题的更新中,我将对马克·卡普伦的有用答案做出回应。我希望这将有助于理解我最初的问题。

如果它是通用的,并且不是为特定客户的需求量身定制的,那么您试图做的就是错误的。动态修改>主题的代码,而css是类似JS的代码,这通常是一个坏主意,只会带来>维护问题

在我的主题中,我很少使用CSS(尽管你也可以编写CSS)。我认为这将是有用的,并符合主题用户的需求。首先,LESS保持事物干净,其次,我的主题是用Twitter的引导程序构建的。LESS将是修改基于引导的HTML/CSS的最直接的方法。我不修改我的主题代码,我只想将我的CSS保存到文件中,在那里CSS将从更少的代码中编译出来。我在这里描述的代码维护策略:http://bassjobsen.weblogs.fm/integrate-less-jbst-wordpress-theme/

除了理论上的原因外,还有与主题定制的用户体验相关的用户期望,这不涉及向服务器写入文件。

我不明白写文件与UX有什么关系。使用“我的主题”的人会选择一个使用引导程序的主题,因此使用较少。我想他们应该明白,应该有书面文件的地方。我同意在填写凭证时多做一步会导致用户体验不好。

如果您确实需要在服务器上保存文件,那么它们的正确位置是>/wp-content/uploads目录。

是的,我现在就是这么做的。http://ottopress.com/2011/tutorial-using-the-wp_filesystem/ 告诉我这是个坏主意。自WP3起。8它也不会通过wordpress上的主题测试。org:“警告:在wp-less-to-css.php文件中发现file\\u put\\u内容可能是文件操作。”

更好的方法是尽量减少只与用户控制的选项相关的文件。一旦更改了选项,您就可以编译LESS并将生成的CSS存储在一个选项中,并将其作为每个页面HTML的一部分输出,就像大多数主题使用其可定制的选项所做的那样。

我同意这是一种选择。编写内联CSS并不总是最好的解决方案,另请参见:https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery. 并非所有自定义设置都必须是关键的,或是上述折叠CSS的一部分。此外,在我的情况下,一些设置还将重新编译引导程序的CSS(例如更改@grid float breakingpoint),我无法内联此代码。

2 个回复
最合适的回答,由SO网友:Bass Jobsen 整理而成

update

下面描述的会话选项似乎非常不安全!进一步的调查表明,request\\u filesystem\\u凭据返回的数组包含纯文本形式的凭据。因此,将其存储在会话中似乎是个坏主意。

注意:在发布表单时,通过非安全连接(http)发送凭据似乎也是个坏主意。最新的问题可以通过将凭据添加到wp\\u config来解决。php。执行此操作时,请确保chmod 600您的wp\\u配置。php(参见:http://codex.wordpress.org/Changing_File_Permissions).

在wp config中设置凭据。php示例:

define(\'FS_METHOD\', \'ftpext\');
define(\'FTP_HOST\', \'localhost\');
define(\'FTP_USER\', \'ftpuser\');
define(\'FTP_PASS\', \'ftpuser\');
define(\'FTP_BASE\', \'/home/username/http_docs/\');
完成此操作后,我们可以将它们(临时)保存到数据库中,以供定制者使用。这似乎会导致wp config中的设置。php也保存到数据库中。保存到数据库将使用set_theme_mod 灵感来源:https://stackoverflow.com/questions/14802251/hook-into-the-wordpress-theme-customizer-save-action/16679837

完成所有这些之后,最后一段代码使我能够使用wp\\U文件系统将自定义程序设置存储在文件中:

function lesscustomize($setting)
{
$updatecss = WP_LESS_to_CSS::$instance;
$updatecss->wpless2csssavecss(unserialize(get_theme_mod(\'customizercredits\')));
}

add_action( \'customize_save_after\', \'lesscustomize\' );

function storecedits( $wp_customize ) {

            $in = true;
            $url = \'customize.php\';
            if (false === ($creds = request_filesystem_credentials($url, \'\', false, false,null) ) ) {
                $in = false;
                exit;
            }

            if ($in && ! WP_Filesystem($creds) ) {
                // our credentials were no good, ask the user for them again
                request_filesystem_credentials($url, \'\', true, false,null);
                $in = false;
                exit;
            }

            set_theme_mod(\'customizercredits\', serialize($creds));

}
add_action(\'customize_controls_init\', \'storecedits\', 1);  
----------------结束更新----------------------

我发现我可以通过会话从理论上解决这个问题。不幸的是,这带来了有关安全性的新问题。First将启用会话(可在此处找到https://stackoverflow.com/a/4769449/1596547) 造成其他麻烦吗?如果没有,在会话中存储文件凭据的风险是什么?

function kana_init_session()
{
  session_start();
}

add_action(\'init\', \'kana_init_session\', 1);

function updatefiles( $wp_customize ) {
WP_Filesystem($_SESSION[\'creds\']);

            global $wp_filesystem;
            $contentdir = trailingslashit( $wp_filesystem->wp_content_dir() ); 
            echo $contentdir;
            $wp_filesystem->mkdir( $contentdir. \'cbe\' );
            if ( ! $wp_filesystem->put_contents(  $contentdir . \'cbe/test.txt\', \'Test file contents\', FS_CHMOD_FILE) ) 
            {
                echo "error saving file!";
            }



}

add_action(\'customize_save\', \'updatefiles\', 1);

function storecredentials( $wp_customize ) 
{

            $in = true;
            $url = \'customize.php\';
            if (false === ($creds = request_filesystem_credentials($url, \'\', false, false,null) ) ) {
                $in = false;
                exit;
            }
            if ($in && ! WP_Filesystem($creds) ) {
                // our credentials were no good, ask the user for them again
                request_filesystem_credentials($url, \'\', true, false,null);
                $in = false;
                exit;
            }
            $_SESSION[\'creds\'] = $creds;

}
add_action(\'customize_controls_init\', \'storecredentials\', 1);</strike>

SO网友:Mark Kaplun

如果它是通用的,并且不是为特定客户的需求量身定制的,那么您试图做的就是错误的。动态修改主题的代码,而css是类似于JS的代码,这通常是一个坏主意,只会带来维护问题-您是否验证了所有值以便能够编译?您将如何处理升级?如果用户不知道FTP凭据,您将如何处理网络安装?

除了理论上的原因外,还有与主题定制的用户体验相关的用户期望,这不涉及向服务器写入文件。

如果您确实需要在服务器上保存文件,那么正确的位置是/wp-content/uploads目录。

更好的方法是尽量减少只与用户控制的选项相关的文件。一旦更改了选项,您就可以编译LESS并将生成的CSS存储在一个选项中,并将其作为每个页面HTML的一部分输出,就像大多数主题使用其可定制的选项所做的那样。

结束

相关推荐