问题描述

我正在使用一个在头像 CSS 中使用动态的主题,并给管理员一个选项,也可以将它放在一个文件中。问题是我不知道什么 WP 文件夹是永远可写的。我最初将 CSS 文件创建添加到 themename/css/目录,但是由于 WP 删除了关于更新的主题已经成为一个问题。

你认为最好的方法是什么,我可以用于这个功能的最安全的可写 WP 文件夹是什么?

最佳解决方案

最好的地方是 uploads 目录 – 它可以由服务器写入,它是用于存储任何 user-generated /上传的文件的 defacto 目录:

$dirs = wp_upload_dir();
$path = $dirs['basedir']; // /path/to/wordpress/wp-content/uploads

次佳解决方案

唯一具有保证写访问权限的目录是上传目录。其他一切可能受到保护。

如今,我们使用 Composer 部署站点,将所有内容保留在版本控制之下,并在每次部署时都创建全新的站点,以便能够回滚部署的站点。这意味着每个部署目录将被创建为全新的。

使用 uploads 目录,如果你必须写入文件,因为这是唯一保留的 (在其他目录之外) 。

第三种解决方案

一种替代方法我们有一个 PHP 文件获取主题选项并输出 CSS 并直接排队。例如。

wp_enqueue_style('custom-css',trailingslashit(get_template_directory_uri()).'styles.php');

这可能起初似乎是一件奇怪的事情,但是由于实际编写新文件应该通过 WP 文件系统来完成正确的所有者/组权限,这是解决该问题的一种方法。

// send CSS Header
header("Content-type: text/css; charset: UTF-8");

// faster load by reducing memory with SHORTINIT
define('SHORTINIT', true);

// recursively find WordPress load
function find_require($file,$folder=null) {
    if ($folder === null) {$folder = dirname(__FILE__);}
    $path = $folder.DIRECTORY_SEPARATOR.$file;
    if (file_exists($path)) {require($path); return $folder;}
    else {
        $upfolder = find_require($file,dirname($folder));
        if ($upfolder != '') {return $upfolder;}
    }
}

// load WordPress core (minimal)
$wp_root_path = find_require('wp-load.php');
define('ABSPATH', $wp_root_path);
define('WPINC', 'wp-includes');

在这一点上,您将需要包括您需要的任何其他 wp-includes 文件,以获得主题选项,这可能会因您如何保存这些选项而有所不同。 (您可能需要添加更多,以免造成致命错误。

include(ABSPATH.WPINC.DIRECTORY_SEPARATOR.'version.php');
include(ABSPATH.WPINC.DIRECTORY_SEPARATOR.'general-template.php');
include(ABSPATH.WPINC.DIRECTORY_SEPARATOR.'link-template.php');

然后只输出 CSS 选项… 例如。

echo 'body {color:' . get_theme_mod('body_color') . ';}';
echo 'body {backgroundcolor:' . get_theme_mod('body_background_color') . ';}';
exit;

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。