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

/***** パスワード保護コンテンツ *****/
/* コンテンツ用の投稿タイプを作る */
function haup_create_protected_content_custom_post_type() {
	register_post_type('ha_protected_content',
		array(
			 'labels' => array(
				'name' => __('Protected Contents','hima-art-utility'),
				'singular_name' => __('Protected Content','hima-art-utility')
			),
			'public' => true,
			'exclude_from_search' => true, // 検索エンジンから除外
			'has_archive' => false, // アーカイブを無効にする
			'supports' => array('title', 'editor', 'author', 'thumbnail', 'revisions'),
			'rewrite' => array('slug' => 'protected-content'), // スラッグを設定
			'show_in_rest' => true, // ブロックエディターを有効にするために追加
			'show_in_menu' => false,//設定メニュー内に表示させるため非表示にする
		)
	);
}
add_action('init', 'haup_create_protected_content_custom_post_type');

/* プラグインの設定画面内にメニューを追加 */
function haup_add_protected_content_menu() {
	$menu_title = __('Protected Contents','hima-art-utility');

	// カスタム投稿タイプのサブメニューを追加
		add_submenu_page(
			'haumenu-admin-page', // 親メニューのスラッグ
			$menu_title, // サブメニューのページタイトル
			$menu_title, // サブメニューのタイトル
			'manage_options', // 権限
			'edit.php?post_type=ha_protected_content' // サブメニューのスラッグ
		);
}
add_action('admin_menu', 'haup_add_protected_content_menu');

/* 管理者以外は直接アクセスさせない（トップページへリダイレクト） */
function haup_redirect_protected_content() {
	if (is_singular('ha_protected_content') && !current_user_can('manage_options')) {
		wp_safe_redirect(home_url()); // ホームページにリダイレクト
		exit;
	}
}
add_action('template_redirect', 'haup_redirect_protected_content');

/* feedから除外 */
function haup_exclude_protected_content_from_feed($query) {
	if ($query->is_feed() && $query->is_main_query()) {
		// 除外したいカスタム投稿タイプのスラッグを指定
		$post_types = $query->get('post_type');
		
		// $post_typesが配列でない場合は配列に変換
		if (!is_array($post_types)) {
			$post_types = array($post_types);
		}

		$query->set('post_type', array_diff($post_types, array('ha_protected_content')));
	}
}
add_action('pre_get_posts', 'haup_exclude_protected_content_from_feed');

/* wp-sitemapから除外 */
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound
function remove_ha_protected_content_from_wp_sitemap( $post_types ) {
	unset( $post_types['ha_protected_content'] ); // Change page to any post type name
	return $post_types;
}
add_filter( 'wp_sitemaps_post_types', 'remove_ha_protected_content_from_wp_sitemap' );

/* ajaxのスクリプトを読み込む */
function haup_enqueue_password_protect_content_scripts() {
	wp_enqueue_script('haup-password-protected-js');

	// Ajax URLをローカライズ
		wp_localize_script(
			'haup-password-protected-js',
			'my_ajax_object',
			array(
				'ajax_url' => admin_url('admin-ajax.php'), // Ajax URL
				'nonce' => wp_create_nonce('protected_content_nonce'), // Nonceを追加
			)
		);
}
add_action('wp_enqueue_scripts', 'haup_enqueue_password_protect_content_scripts');

/* パスワード認証後位置を保持する（ajax処理） */
function haup_password_protected_content_ajax() {
	// nonceの検証
		check_ajax_referer('protected_content_nonce', 'nonce');

	//$password = isset($_POST['password_input']) ? sanitize_text_field(wp_unslash($_POST['password_input'])) : '';
	if(isset($_POST['password_input'])){
		$password = sanitize_text_field(wp_unslash($_POST['password_input']));
	}else{
		$password = '';
	}

	$protected_content_id = isset($_POST['protected_content_id']) ? intval($_POST['protected_content_id']) : 0;
	//パスワードが間違っている時のメッセージ
		$error_message = __('Please enter the correct password','hima-art-utility');
		$error_message = apply_filters('haup_pw_form_change_pass_error_message',$error_message);

	// パスワードが正しいか確認
	if ($password === get_post_field('post_password', $protected_content_id)) {
		// 正しいパスワードの場合、コンテンツを取得
		// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
			$content = apply_filters('the_content', get_post_field('post_content', $protected_content_id));
			wp_send_json_success($content);
	} else {
		// 間違ったパスワードの場合
		wp_send_json_error( $error_message );
	}
}
add_action('wp_ajax_password_protected_content', 'haup_password_protected_content_ajax');
add_action('wp_ajax_nopriv_password_protected_content', 'haup_password_protected_content_ajax');

/* ショートコードで投稿内へ表示（パスワード保護はWordPress標準機能を利用） */
function haup_password_protected_box($atts, $content = null) {
	$atts = shortcode_atts(array(
		'id' => '', // 投稿IDを指定するための属性
		'title' => '',
		'text' => '',
	), $atts);

	//値がない場合の処理
	if (empty($atts['id'])) {
		$empty_id_message = __('Specify the ID of the content you want to display.','hima-art-utility');
		return '<p>'.$empty_id_message.'</p>';
	}

	// 投稿を取得
		$query = new WP_Query(array(
			'post_type' => 'ha_protected_content',
			'p' => $atts['id'],
		));

	//コンテンツが見つからない時の処理
	if (!$query->have_posts()) {
		$no_content_message = __('No matching content found.','hima-art-utility');
		return '<p>'.$no_content_message.'</p>';
	}

//コンテンツの表示
ob_start();
while ($query->have_posts()) {
	$query->the_post();

	//テキストの初期値
	//見出し
		if(empty( $atts['title'] )){
			$heading_text = __('A password is required to view the content','hima-art-utility');
			$heading_text = apply_filters('haup_pw_form_change_heading_text',$heading_text);//冒頭文の変更
		}else{
			$heading_text = $atts['title'];
		}
	//説明文
		if(empty( $atts['text'] )){
			$message = __( 'Please enter your password to view the content','hima-art-utility' );
			$message = apply_filters('haup_pw_form_change_message',$message);//冒頭文の変更
		}else{
			$message = $atts['text'];
		}

	//ラベル
	$label_text = __( 'Password','hima-art-utility' );
	$label_text = apply_filters('haup_pw_form_change_pass_text',$label_text);//「パスワード:」の変更

	//送信ボタン文字列
	$submit_text = __( 'Submit','hima-art-utility' );
	$submit_text = apply_filters('haup_pw_form_change_submit_text',$submit_text);//「送信」の変更

	//CSSクラスの接頭辞
	$class_prefix = 'ha-password-form';

	// パスワードが必要な場合のフォーム内容
	if (post_password_required()) {
		$form = '';
		$form .= '<form method="post" class="ha-password-form">';
		$form .= '<h3 class="'.$class_prefix.'-heading">';
		$form .= $heading_text;
		$form .= '</h3>';
		$form .= '<p class="'.$class_prefix.'-message">';
		$form .= $message;
		$form .= '</p>';
		$form .= '<div class="'.$class_prefix.'-form">';
		$form .= '<label for="password_input" class="'.$class_prefix.'-label">';
		$form .= $label_text;
		$form .= '</label>';
		$form .= '<input type="password" name="password_input" required class="'.$class_prefix.'-input-field"  aria-label="Password Input">';
		$form .= '<input type="hidden" name="protected_content_id" value="' . get_the_ID() . '" aria-label="Content ID">';
		$form .= wp_nonce_field('protected_content_nonce', 'nonce', true, false);
		$form .= '<button type="submit" class="'.$class_prefix.'-submit-btn">';
		$form .= $submit_text;
		$form .= '</button>';


		// 管理者権限を持つユーザーにパスワードを表示
			if (current_user_can('manage_options')) {
				$post_password = get_post_field('post_password', get_the_ID());
				$form .= '<p class="'.$class_prefix.'-password-text"> ';
				$form .= $label_text;
				$form .= ': ' . esc_html($post_password);
				$form .= '</p>';
        }

		$form .= '</div>';
		$form .= '</form>';
		$form .= '<div class="ha-protected-box"></div>'; // 結果を表示するための空のdiv


		return '<div class="ha-protected-box '.$class_prefix.'-wrap">' . $form . '</div>';
	}

	// コンテンツを表示
	// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
		echo '<div>' . wp_kses_post(apply_filters('the_content', get_the_content())) . '</div>';
}

wp_reset_postdata();

return ob_get_clean();
}
add_shortcode('ha-protected-content', 'haup_password_protected_box');

/*** 「ha_protected_content」投稿タイプの一覧へショートコードを表示 ***/
/* 管理画面の列を追加 */
function haup_add_protected_content_sc_column($columns) {
	$title = __('Shortcode','hima-art-utility');
	$columns['ha_protected_content_sc_column'] = $title; // 列のタイトルを設定

	return $columns;
}
add_filter('manage_ha_protected_content_posts_columns', 'haup_add_protected_content_sc_column');

/* 列へ表示させる内容 */
function haup_add_protected_content_sc_custom_column($column, $id) {
	if ($column === 'ha_protected_content_sc_column') {
		$sc_id = esc_attr($id);
		$shortcode = '[ha-protected-content id="' . $sc_id . '" title="" text=""]';
		$button_text = __('Copy','hima-art-utility');

	// jQueryを使用してクリックでコピーするためのHTMLを追加
		//$output = '';
		echo '<span class="ha-copy-protect-content-shortcode" data-clipboard-text="';
		echo esc_attr($shortcode);
		echo '" style="position: relative; cursor: pointer;">';
		echo esc_html($shortcode);
		echo '<span class="ha-protect-content-tooltip" style="display:none; position:absolute; right:0; font-size:0.8rem; background:#333; color:#fff; padding:2px; border-radius:2px; white-space:nowrap; z-index:999;">';
		echo esc_html($button_text);
		echo '</span></span>';
	}
}
add_action('manage_ha_protected_content_posts_custom_column', 'haup_add_protected_content_sc_custom_column', 10, 2);

/* コピー動作用のjQueryを追加 */
function haup_enqueue_protected_content_copy_shortcode_script() {
	$message = __('Shortcode copied to clipboard','hima-art-utility');
?>
	<script>
		jQuery(document).ready(function($) {
			$('.ha-copy-protect-content-shortcode').on('click', function() {
				var shortcodeText = $(this).data('clipboard-text');
                
				// 一時的なテキストエリアを作成
					var $temp = $('<textarea>');
					$('body').append($temp);
					$temp.val(shortcodeText).select();
					document.execCommand('copy');
					$temp.remove();

				alert(' <?php echo esc_html($message); ?> ');
				}).hover(function() {
				// マウスオーバー時にツールチップを表示
					$(this).find('.ha-protect-content-tooltip').show();
				}, function() {
				// マウスアウト時にツールチップを非表示
					$(this).find('.ha-protect-content-tooltip').hide();
				});
		});
	</script>
<?php
}
add_action('admin_footer', 'haup_enqueue_protected_content_copy_shortcode_script');