問題描述
我正在使用一個在頭像 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。