私はAjaxを使って検索結果をロードしようとしています。結果は正しく表示されますが、検索語を結果の前に表示させるためにget_search_query()
を機能させることはできません。 Javascriptでこれを実行できることはわかっていますが、WordPressの機能が機能していない理由について非常に興味があります。私は$_GET['s']
とget_query_var('s')
を使っても試しましたが、どちらもうまくいきません。
下記の私のコードを見てください。
Functions.php
<?php add_action( 'wp_ajax_search_results', 'load_search_results' );
add_action( 'wp_ajax_nopriv_search_results', 'load_search_results' );
function load_search_results() {
$query = $_POST['query'];
$args = array(
'post_status' => array( 'publish', 'inherit' ),
's' => $query
);
$search = new WP_Query( $args );
if ( $search->have_posts() ) :
?>
<h1><?php printf( __( 'Results for: %s', 'theme' ), get_search_query() ); ?></h1>
<?php /* Start the Loop */ ?>
<?php while( $search->have_posts() ): $search->the_post();?>
<?php get_template_part( 'content', get_post_type() ); ?>
<?php endwhile;
else :?>
<p><?php _e( 'No results', 'theme' ); ?></p>
<?php endif;
die();
}?>
JSコード
$(document).on('submit', '.search-form', function( event ) {
event.preventDefault();
var $input = $(this).find('input[name="s"]');
var $sQuery = $input.val();
$('#results').html('');
$.ajax({
url: ajaxPosts.ajaxurl,
type: 'post',
data: {
action: 'search_results',
query: $sQuery
},
success: function( html ) {
$('#results').append( html );
}
});
});
$_GET['s']
は2つの理由で機能しません。最初にGETリクエストではなくPOSTリクエストを行い、次にリクエスト内にs
という名前の変数がありません。
wp-admin/admin-ajax.php
でAJAXリクエストを実行すると、そのリクエストに登録されているコード(関数)のみが実行されます。また、WordPress Core用のWordPress管理APIとAjaxハンドラをロードします。そのため、クエリ変数、テンプレートなどは初期化されず、get_search_query()が機能しません。 AJAX要求のフローは通常のものと異なり、最低限のものだけがロードされています。フローの詳細については wp-admin/admin-ajax.php
をご覧ください。