<?php if ( !defined( 'ABSPATH' ) ) exit;//PHPの宣言と直接アクセスの拒否

/***** wp-includes/--.php への直接アクセスをブロック *****/
/*** .htaccessファイルの#BEGIN WordPressの上へコードを追加する一連の機構として使いまわす場合の手順 ***/
/* 関数を変更する（特にコールバックを利用するところの関数名を間違えないこと） */
/* 開始・終了コメントの部分を変更する */
/* オプションの設定値を変更する */
/* 追加するコードを変更する */

/*** admin_init フックで設定を確認し、.htaccess を更新する ***/
function haup_deny_wp_includes_files_access_init() {
	// 1. 設定画面のスイッチ（オプション値）を取得
	//optionグループ
	$options_group = GetOP02_security(); 
		//機能を有効化するか
		if(isset( $options_group['enable-block-wp-includes'] ) && $options_group['enable-block-wp-includes'] == '1'){
			$is_enabled = '1';
		}else{
			$is_enabled = '0';
		}

	//.htaccessファイルの場所を特定する
	$htaccess_file = ABSPATH . '.htaccess';

	//.htaccessが存在しない、または書き込み許可されていなければ終了
	if (!file_exists($htaccess_file) || !is_writable($htaccess_file)) {
		return;
	}

	//.htaccessの記述内から開始マーカーを取得
	$content = file_get_contents($htaccess_file);
	$marker_begin = '# BEGIN HaupBlockIncludesFiles'; //開始マーカー
	$has_marker = (strpos($content, $marker_begin) !== false);

	// 2. 機能を有効化しているのに開始マーカーがない場合 ＝ コードを追加
	if ($is_enabled === '1' && !$has_marker) {
		haup_add_deny_wp_includes_files_access(); //追加するコールバック関数を指定する
	} 
	// 3. 機能を無効化しているのに開始マーカーがある場合 ＝ コードを削除
	elseif ($is_enabled !== '1' && $has_marker) {
		haup_remove_deny_wp_includes_files_access(); //削除するコールバック関数を指定する
	}

}
add_action('admin_init', 'haup_deny_wp_includes_files_access_init');

/*** .htaccessへ追加するコールバック関数 ***/
function haup_add_deny_wp_includes_files_access() {
	$htaccess_file = ABSPATH . '.htaccess';
	$content = file_get_contents($htaccess_file);
 
	//開始・終了マーカー
	$marker_begin = '# BEGIN HaupBlockIncludesFiles';
	$marker_end   = '# END HaupBlockIncludesFiles';

	$new_rules = $marker_begin . "\n";
	$new_rules .= "# wp-includes/--.php への直接アクセスをブロック\n";
	$new_rules .= "<IfModule mod_rewrite.c>\n";
	$new_rules .= "    RewriteEngine On\n";
	$new_rules .= "    RewriteCond %{REQUEST_URI} ^/wp-includes/[^/]+\.php$ [NC]\n";
	$new_rules .= "    RewriteRule .* - [F,L]\n";

	$new_rules .= "</IfModule>\n";
	$new_rules .= $marker_end . "\n";

	//# BEGIN WordPressマーカーの前に追加（WordPressが反応する前に処理）
	$target = '# BEGIN WordPress';
	if (strpos($content, $target) !== false) {
		$updated_content = str_replace($target, $new_rules . $target, $content);
	} else {
		$updated_content = $content . $new_rules;
	}

	file_put_contents($htaccess_file, $updated_content, LOCK_EX);
}

/*** .htaccessから削除するコールバック関数 ***/
/* 開始・終了マーカーを必ず変更すること */
function haup_remove_deny_wp_includes_files_access() {
	$htaccess_file = ABSPATH . '.htaccess';

	if ( file_exists( $htaccess_file ) && is_writable( $htaccess_file ) ) {
		$content = file_get_contents( $htaccess_file );

		// 自前で追加したマーカー間を正規表現で削除
		$pattern = '/# BEGIN HaupBlockIncludesFiles.*# END HaupBlockIncludesFiles\s*/s';
		$new_content = preg_replace( $pattern, '', $content );

		if ( $new_content !== null ) {
			// 前後の余計な空行を整えて保存
			file_put_contents( $htaccess_file, trim( $new_content ) . "\n" );
		}
	}
}

/*** プラグイン停止時に .htaccessから削除するコールバック関数を呼び出して処理する ***/
register_deactivation_hook( __FILE__, 'haup_remove_deny_wp_includes_files_access' );