web-dev-qa-db-ja.com

何 WP フォルダにファイルを書き込むことができますか?

私は頭のCSSで動的を使用し、ファイルにも同じように配置するオプションを管理者に与えるテーマに取り組んでいます。問題は、WPフォルダが常に書き込み可能かどうかわからないことです。私はもともとCSSファイルの作成をthemename/css/dirに追加しましたが、WPは更新時にテーマを削除するのでこれが問題になりました。

これに対処する最善の方法は何だと思いますか。また、この機能に使用できる最も安全な書き込み可能なWPフォルダは何ですか。

6
Benn

最良の場所はuploadsディレクトリです - それはサーバによって書き込み可能であるでしょう、そしてそれはあらゆるユーザ生成/アップロードされたファイルを格納するためのdefactoディレクトリです:

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

書き込みアクセスが保証されている唯一のディレクトリはアップロードディレクトリです。他のすべては保護されるかもしれません。

今日では、Composerを使用してサイトをデプロイし、すべてをバージョン管理下に置き、デプロイされたサイトをロールバックできるように、デプロイごとにまったく新しいサイトを作成します。つまり、ディレクトリはデプロイごとにまったく新しく作成されます。

ファイルを作成する必要がある場合は、uploadsディレクトリを使用します。これが(他のディレクトリの外側に)保持されるのはそれだけだからです。

4
fuxia

もう1つの方法は、テーマオプションを取得してCSSを出力し、代わりに直接エンキューするPHPファイルを作成することです。例えば。

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;
2
majick

私は書くのに最も良い場所はwp-contentフォルダにフォルダを追加することだと思います。ここでは、テーマの更新があるときやWPの更新があるときに、上書きされずにCSSファイルを書き込むことができます。

0