WordPress Snippet

ワードプレスをカスタマイズしよう

WP_Filesystemを使った、ファイルの作成

WordPressのカスタマイズを行う場合に、動的に作成したスタイルシートなどを、テーマディレクトリの中に、保存したいという事があります。

PHPのファイル操作関数を使う事で、ファイルを作る事は出来ますが、テーマファイルに、file_put_contents()等を直書きしてしまうと、それ自体が脆弱性の温床になる事も考えられるので、公式テーマなどでも、この種のファイル操作関数の利用は制限されています。

では、ファイルを保存したりする方法は完全に閉ざされているのかというと、そうでもないようで、WordPressの公式テーマ Platform などで、スタイルシートの動的な生成に利用されている事が、ひょんなことからわかりました。

以下のコードは、テーマオプションパネルで、ファイルへの書き込みを行います。
page=my_settingsは、書き換えてください

add_action('admin_head', 'add_dynamic_css');

function add_dynamic_css(){

	define( 'DYNAMIC_CSS' , TEMPLATEPATH .'/dynamic.css' );
	
	$txt= 'body{color:red;}';
	
	save_file_from_theme_option( $txt );
}

function save_file_from_theme_option( $txt= 'Hello World' ){

	global $wp_filesystem;
	
		add_filter('request_filesystem_credentials', '__return_true' );

		$method= '';
		$url = 'themes.php?page=raindrops_settings';

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

		if ( ! $wp_filesystem->put_contents( DYNAMIC_CSS , $txt, FS_CHMOD_FILE) ) {
			echo "error saving file!";
			return false;
		}
	return true;
}

[emulsion_relate_posts]