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

/*** コールバック ***/
/* 投稿タイプ */
function haup_keyword_auto_link_postytype_name(){
	$posttype_name = 'haup_auto_link_pt';

	return esc_html( $posttype_name );
}

/*** 自動リンク集用のカスタム投稿タイプを作る ***/
function haup_add_auto_link_post_type() {
	$posttype_name = __('Auto Link','hima-art-utility');

	register_post_type( haup_keyword_auto_link_postytype_name(),
		array(
			'labels' => array(
				'name' => $posttype_name,
				'singular_name' => $posttype_name,
			),
			'public' => true, // 編集は可能にする
			'has_archive' => false,
			'supports' => array('title', 'custom-fields'), // 'editor'を削除
			'menu_icon' => 'dashicons-link',
			'rewrite' => array('slug' => 'haup-link-collection'),
			'exclude_from_search' => true,
			'show_in_menu' => false,//設定メニュー内に表示させるため非表示にする
		)
	);
}
add_action('init', 'haup_add_auto_link_post_type');

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

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

/* 投稿タイプへの直接アクセスを404ページへリダイレクト */
function haup_redirect_auto_link_post_type() {
	if (is_singular(haup_keyword_auto_link_postytype_name())) {
		// URLがアクセスされた場合に404ページを表示
		if (!is_admin()) { // 管理画面以外の場合
			global $wp_query;
			$wp_query->set_404();
			status_header(404);
			nocache_headers();
			include(get_404_template());
			exit;
		}
	}
}
add_action('template_redirect', 'haup_redirect_auto_link_post_type');

/* 投稿タイプをnoindexにする */
function haup_noindex_auto_link_post_type() {
	if (is_singular(haup_keyword_auto_link_postytype_name())) {
		echo '<meta name="robots" content="noindex, nofollow" />' . "\n";
	}
}
add_action('wp_head', 'haup_noindex_auto_link_post_type');

/*** リンク先URLを入力するメタボックスを追加し、保存する ***/
/* メタボックスの追加 */
function haup_add_auto_link_url_meta_box() {
	$meta_box_title = __('Link URL','hima-art-utility');

	add_meta_box(
		'haup_auto_link_url_meta_box', // メタボックスのID
		$meta_box_title, // メタボックスのタイトル
		'haup_auto_link_url_meta_box_callback', // 表示する関数
		haup_keyword_auto_link_postytype_name(), // カスタム投稿タイプ名
		'normal', // 表示位置
		'high' // 優先度
	);
}
add_action('add_meta_boxes', 'haup_add_auto_link_url_meta_box');

/* メタボックスの内容コールバック */
function haup_auto_link_url_meta_box_callback($post) {
	// 現在の値を取得
		$link_url = get_post_meta($post->ID, 'ha-autolink-url', true);

	// Nonceを生成
		wp_nonce_field('ha_auto_link_url_nonce_action', 'ha_auto_link_url_nonce');

	$label_title = __('Link URL:','hima-art-utility');
?>
<label for="link_url"><?php echo esc_html( $label_title ); ?></label>
<input type="text" id="ha-autolink-url" name="ha-autolink-url" value="<?php echo esc_attr($link_url); ?>" style="width: 100%;" required />
<?php
}


/* メタボックスの値を保存 */
function haup_save_auto_link_url_meta_box($post_id) {
	// 自動保存の場合は何もしない
		if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
			return;
		}

	// 権限の確認
		if (!current_user_can('edit_post', $post_id)) {
			return;
		}

	// Nonceの検証
		if (!isset($_POST['ha_auto_link_url_nonce']) || !wp_verify_nonce(sanitize_text_field( wp_unslash($_POST['ha_auto_link_url_nonce'])), 'ha_auto_link_url_nonce_action')) {
			return;
		}

	// メタボックスの値を保存
	if (isset($_POST['ha-autolink-url'])) {
		$link_url = sanitize_text_field(wp_unslash($_POST['ha-autolink-url']));
        
		// 入力が空の場合はエラーメッセージを表示
			$message = __('The link URL is required.','hima-art-utility');

		if (empty($link_url)) {
			// エラーメッセージを設定
				set_transient('ha-auto-link_url_error', $message, 30); // 30秒間表示
				return;
		}

		update_post_meta($post_id, 'ha-autolink-url', $link_url);
	}
}
add_action('save_post', 'haup_save_auto_link_url_meta_box');


/* エラーメッセージを表示 */
function haup_display_auto_link_url_error() {
	if ($error_message = get_transient('ha-auto-link_url_error')) {
		echo '<div class="notice notice-error is-dismissible"><p>' . esc_html($error_message) . '</p></div>';

		delete_transient('ha-auto-link_url_error');
	}
}
add_action('admin_notices', 'haup_display_auto_link_url_error');

/*** 編集画面に「自動リンクを有効にする」チェックボックスを表示し、値を保存 ***/
/* メタボックスの追加 */
function haup_add_disable_keyword_auto_link_meta_box() {
	//投稿タイプを「投稿」に指定し、haup_is_single_filterで追加できるようにする
	$posttypes = 'post';
	$posttypes = apply_filters('haup_is_single_filter',$posttypes);
	$posttypes = apply_filters('haup_is_single_keyword_auto_link_filter',$posttypes);
	//20250902 explodeだけでは空文字などがあった場合に不具合が出る可能性があるので修正
	$post_types_array = array_map('trim', explode(',', $posttypes));
	$post_types_array = array_filter($post_types_array);
	//$post_types_array = explode(',', $posttypes);//「,」で投稿タイプを分割

	//固定ページを除く指定された投稿タイプ分だけ繰り返す
	foreach ($post_types_array as $post_type) {
		//誤ってフィルターにpageが含まれていても除外し、投稿タイプ分だけ回す
		if (get_post_type() === $post_type) {
			add_meta_box(
				'ha_disable_auto_keyword_link_meta_box', // メタボックスのID
				__('Automatic Keyword Linking','hima-art-utility'), // メタボックスのタイトル
				'haup_disable_keyword_auto_link_meta_box_callback', // 表示する関数
				$post_type, // 通常の投稿タイプ
				'side', // 表示位置
				'high' // 優先度
			);
		}
	}

	//固定ページのみ
	if(get_post_type() === 'page'){
		add_meta_box(
			'ha_disable_auto_keyword_link_meta_box', // メタボックスのID
			__('Automatic Keyword Linking','hima-art-utility'), // メタボックスのタイトル
			'haup_disable_keyword_auto_link_meta_box_callback', // 表示する関数
			'page', // 固定ページ
			'side', // 表示位置
			'high' // 優先度
		);
	}
}
add_action('add_meta_boxes', 'haup_add_disable_keyword_auto_link_meta_box');


/* メタボックスの表示コールバック */
function haup_disable_keyword_auto_link_meta_box_callback($post) {
	// 現在の値を取得
		$disable_link = get_post_meta($post->ID, 'ha-disableauto-keyword-link', true);

	// Nonceを生成
		wp_nonce_field('ha_disable_keyword_auto_link_nonce_action', 'ha_disable_keyword_auto_link_nonce');

	$title = __('Enabled automatic keyword linking','hima-art-utility');
?>
<label for="ha-disableauto-keyword-link">
<input type="checkbox" id="ha-disableauto-keyword-link" name="ha-disableauto-keyword-link" value="1" <?php checked($disable_link, '1'); ?> />

<?php echo esc_html( $title ); ?>
</label>
<?php
}

/* メタボックスの値を保存 */
function haup_save_disable_keyword_auto_link_meta_box($post_id) {
	// 自動保存の場合は何もしない
		if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
			return;
		}

	// 権限の確認
		if (!current_user_can('edit_post', $post_id)) {
			return;
		}

	// Nonceの検証
		if (!isset($_POST['ha_disable_keyword_auto_link_nonce']) || !wp_verify_nonce(sanitize_text_field( wp_unslash($_POST['ha_disable_keyword_auto_link_nonce'])), 'ha_disable_keyword_auto_link_nonce_action')) {
			return;
		}

	// メタボックスの値を保存
	if (isset($_POST['ha-disableauto-keyword-link'])) {
		update_post_meta($post_id, 'ha-disableauto-keyword-link', '1');
	} else {
		delete_post_meta($post_id, 'ha-disableauto-keyword-link');
	}
}
add_action('save_post', 'haup_save_disable_keyword_auto_link_meta_box');

/*** 自動リンク機能 ***/
function haup_auto_link_keywords($content) {

	//投稿タイプを「投稿」に指定し、haup_is_single_filterで追加できるようにする
	$posttypes = 'post';
	$posttypes = apply_filters('haup_is_single_filter',$posttypes);
	$posttypes = apply_filters('haup_is_single_keyword_auto_link_filter',$posttypes);
	//20250902 explodeだけでは空文字などがあった場合に不具合が出る可能性があるので修正
	$post_types_array = array_map('trim', explode(',', $posttypes));
	$post_types_array = array_filter($post_types_array);
	//$post_types_array = explode(',', $posttypes);//「,」で投稿タイプを分割

	//固定ページを除く指定された投稿タイプ分だけ繰り返す
	foreach ($post_types_array as $post_type) {
		//誤ってフィルターにpageが含まれていても除外し、投稿タイプ分だけ回す
		if (get_post_type() === $post_type ||  is_page()){
			//if (is_single() || is_page()) {
			$post_id = get_the_ID();
			$disable_link = get_post_meta($post_id, 'ha-disableauto-keyword-link', true);
		}

		//全コンテンツ有効化スイッチのON/OFFと各投稿メタボックスにチェックが入っているかで処理を分岐
		if(!isset( GetOP05_utility()['all-content-auto-keword-link'] ) || GetOP05_utility()['all-content-auto-keword-link'] == ''){
			if (!isset( $disable_link ) || $disable_link === '') {
				return $content; // チェックが入っていない場合はそのまま返す
			}
		}
	}

	// リンク集からキーワードとURLを取得
		$args = array(
			'post_type' => haup_keyword_auto_link_postytype_name(),
			'posts_per_page' => -1,
		);

		$link_query = new WP_Query($args);
			if ($link_query->have_posts()) {
				while ($link_query->have_posts()) {
					$link_query->the_post();
					$keyword = get_the_title();
					$url = get_post_meta(get_the_ID(), 'ha-autolink-url', true);
            
					// 本文内のキーワードをリンクに置き換える
					$content = str_replace($keyword, '<a href="' . esc_url($url) . '">' . esc_html($keyword) . '</a>', $content);
				}

				wp_reset_postdata();
			}

	return $content;
}
add_filter('the_content', 'haup_auto_link_keywords');

/*** 管理画面をタイトルの昇順で常に並び替えて表示 ***/
function haup_set_auto_link_admin_page_order($query) {
	// 管理画面でのみ実行
		if (is_admin() && $query->is_post_type_archive( haup_keyword_auto_link_postytype_name() )) {
			// タイトルの昇順でソート
			$query->set('orderby', 'title');
			$query->set('order', 'ASC');
		}
}
add_action('pre_get_posts', 'haup_set_auto_link_admin_page_order');

/*** 管理画面の列に重複とリンクURLを表示 ***/
/* 新しい列を追加 */
function haup_auto_link_add_admin_custom_columns($columns) {
	$duplicate_title = __('Duplicate title','hima-art-utility');
	$link_url_title = __('Link URL','hima-art-utility');

	$columns['haup_auto_lin_url_duplicate_title'] = esc_html( $duplicate_title );
	$columns['haup_auto_link_url_column'] = esc_html( $link_url_title ); // カスタムフィールド用の列を追加

	return $columns;
}
add_filter('manage_edit-haup_auto_link_pt_columns', 'haup_auto_link_add_admin_custom_columns');

/* 列に内容を表示 */
function haup_display_auto_link_pt_columns($column, $post_id) {
	// タイトル重複の列
	if ($column === 'haup_auto_lin_url_duplicate_title') {
		$title = get_the_title($post_id);

		// 同じタイトルを持つ投稿を取得
		$args = array(
			'post_type' => haup_keyword_auto_link_postytype_name(),
			'post_status' => 'publish',
			'posts_per_page' => -1,
			// phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in
			'post__not_in' => array($post_id) // 現在の投稿を除外
		);

		$query = new WP_Query($args);
        
		$duplicated_message = __('Duplicate title (keyword)','hima-art-utility');
		$duplicated_message_b = __('There may be a problem with the automatic link function.','hima-art-utility');

		$has_duplicate = false;

		// クエリの結果をループしてタイトルをチェック
		if ($query->have_posts()) {
			while ($query->have_posts()) {
				$query->the_post();
				$other_title = get_the_title();

				// タイトルを直接比較
				if ($title === $other_title) {
					$has_duplicate = true;
					break;
				}
			}

			wp_reset_postdata(); // クエリのリセット

		}

		if ($has_duplicate) {
			//$output = '';
			echo esc_html($duplicated_message);
			echo '<br>';
			echo '<span style="color:red;">';
			echo esc_html($duplicated_message_b);
			echo '</span>';
		} else {
			echo '';
		}
	}

	// link_urlの表示
	if ($column === 'haup_auto_link_url_column') {
		$link_url = get_post_meta($post_id, 'ha-autolink-url', true); // link_urlの値を取得

		echo '<a href="' . esc_url($link_url) . '" target="_blank">' . esc_html($link_url) . '</a>'; // 値を表示
	}
}
add_action('manage_haup_auto_link_pt_posts_custom_column', 'haup_display_auto_link_pt_columns', 10, 2);

/* 管理画面上のスタイル */
function haup_admin_auto_link_column_style_init(){
$custom_css = "
body.edit-php #haup_auto_lin_url_duplicate_title {width:20%;}
body.edit-php #haup_auto_link_url_column {width:20%;}
";

wp_add_inline_style( 'haup-only-admin-style', $custom_css );//インラインでCSS出力
}
add_action('admin_enqueue_scripts','haup_admin_auto_link_column_style_init');