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

/* https://code.mukto.info/wordpress-ajax-search-without-plugin/ */
/* https://code.mukto.info/woocommerce-ajax-product-search-and-category-filter-without-plugin/ */
/* https://wemo.tech/160 */

/*** [ajax-text-search] というショートコードが含まれていればjQueryをフッターへ出力 ***/
function haup_ajax_text_search_script_in_footer() {

$admin_url = admin_url( 'admin-ajax.php', __FILE__ );

$word_count = apply_filters('haup_freeword_search_word_count_filter','2');

echo '<script defer>function haup_text_search_ajax_script_callback(){';
echo "jQuery.ajax({url: '";
echo esc_url($admin_url);
echo "',type: 'post',data: {action: 'haup_ajax_text_search_action',keyword: jQuery('#keyword').val()},success: function(data) {jQuery('#haup-datafetch').html( data );}});";
echo "jQuery('input#keyword').keyup(function() {if (jQuery(this).val().length > ".absint($word_count).") {jQuery('#haup-datafetch').show();} else {jQuery('#haup-datafetch').hide();}});";
echo '}</script>';


/* minify前のスクリプト(メモ)
	jQuery.ajax({
		url: '".$admin_url."',
		type: 'post',
		data: { 
			action: 'haup_ajax_text_search_action',
			keyword: jQuery('#keyword').val() 
		},
		success: function(data) {
			jQuery('#haup-datafetch').html( data );
		}
	});

//入力が2文字に満たない場合は結果を表示しない
	jQuery('input#keyword').keyup(function() {
		if (jQuery(this).val().length > 2) {
			jQuery('#haup-datafetch').show();
		} else {
			jQuery('#haup-datafetch').hide();
		}
	});
*/

}
add_action( 'wp_footer', 'haup_ajax_text_search_script_in_footer' ,9999);

/*** 検索結果の表示 ***/
function haup_text_ajax_search_result(){
//件数の文字列
	$result_before = __('Search Results:','hima-art-utility');
	$result_after = __('Items','hima-art-utility');
	$no_results = __('No Results Found','hima-art-utility');

//入力値から全角スペースを除去
// nonceの検証
	if ( !isset( $_POST['_haup_ajax_search_nonce'] ) || !wp_verify_nonce(  sanitize_text_field( wp_unslash( $_POST['_haup_ajax_search_nonce'])), 'haup_ajax_search_nonce_action' ) ) {
	//$formtxt = $_POST['keyword'];//キーワードを適切にサニタイズするため↓行へ修正20250314
	//$formtxt = isset($_POST['keyword']) ? sanitize_text_field(trim($_POST['keyword'])) : '';

	if ( isset($_POST['keyword']) ) {
		$formtxt = sanitize_text_field(wp_unslash($_POST['keyword']));
	} else {
		$formtxt = '';
	}

	$formtxt = str_replace('　',' ',$formtxt);
	}else{
		return;
	}

	//「公開」状態になっている投稿タイプを配列ですべて取得
	$custom_post_types_slug = get_post_types(array('public' => true));

	//抽出条件の指定
	$args = array(
	'post_type' => $custom_post_types_slug,
	'post_status' => 'publish',//公開済みのものに限定
	'posts_per_page' => -1,//全項目を表示
	's' => sanitize_text_field( $formtxt ),//全角スペースを半角に変換した上でキーワードをセット
	'order' => 'DESC',//降順に表示
	'orderby' => 'relevance',//一致度で判断
	'no_found_rows' => true,//ページャーを使う時はfalseに。
 );

	$the_query = new WP_Query($args);
	$post_count  = $the_query->post_count;   //実際にそのページで取得した件数

	if( $the_query->have_posts() ) {
		echo '<p>'.esc_html($result_before).' '.esc_html($post_count).' '.esc_html($result_after).'</p><ul>';
		while( $the_query->have_posts() ): $the_query->the_post(); ?>

		<li><a href="<?php echo esc_url( get_permalink() ); ?>"><?php the_title();?></a></li>

		<?php endwhile;
			echo '</ul>';
		wp_reset_postdata();  
		}else{
		echo '<p>'.esc_html($no_results).'</p>';
	}

	die();
}
add_action('wp_ajax_haup_ajax_text_search_action' , 'haup_text_ajax_search_result');
add_action('wp_ajax_nopriv_haup_ajax_text_search_action','haup_text_ajax_search_result');

/*** 検索窓と結果の出力を行うショートコード ***/
function haup_ajax_text_search_form_shortcode( ) {
//入力フォームの文字列
	$placeholder = __('Please Input Keywords...','hima-art-utility');
	$submit_text = __('Submit','hima-art-utility');
	$wait_text = __('Please wait..','hima-art-utility');

/*** 「Enter」で送信されないようにする対策 ***/
/*  onsubmit="return false;"で誤送信されないようにする */
/*  onclick="submit();"でボタンクリック時のみ送信するようにする */
/* 入力項目が1つなのでダミー項目を作って誤送信されないようにする */
/* https://qiita.com/mimoe/items/89b317be5e38bfbc44ee */
/* https://style01.net/721/ */

	// Nonceを生成
	$nonce = wp_create_nonce('haup_ajax_search_nonce_action');

$content= '
<aside><div class="ha-ajax-text-search-bar">
<form action="/" method="get" autocomplete="off" onsubmit="return false;">
	<div class="ha-ajax-text-search-bar-inner">
		<input type="text" class="ha-text-search-form" name="s" placeholder="'.esc_html($placeholder).'" id="keyword" class="input_search" onkeyup="haup_text_search_ajax_script_callback()">
		<input type="hidden" id="haup_ajax_search_nonce" value="' . esc_attr($nonce) . '" /> <!-- Nonceを隠しフィールドとして追加 -->
		<input type="text" name="dummy" style="display:none;">
		<input type="button" class="ha-text-search-button" onclick="submit();" value="'.esc_html($submit_text).'" />
	</div>
</form>
<div class="ha-text-search-result" id="haup-datafetch">
	<ul>
		<li>'.esc_html($wait_text).'</li>
	</ul>
</div>
</div>
</aside>
';
	
	return $content;
	
}
add_shortcode( 'ha-ajax-text-search', 'haup_ajax_text_search_form_shortcode' );