私は検索結果をajaxでdivに入れようとしています。問題は、検索テンプレートにアクセスしたときにundefined function have_posts()
というエラーが表示されることです。それはsearch-results.phpにあるget_header()
でも問題を起こしましたが、私はそれを取り出しました。これが私の設定です。
<div id="my_search">
<form role="search" method="get" id="searchform" action="http://myurl.com/" >
<input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Search" />
</form>
</div>
<div id="results"></div>
<script type="text/javascript">
$(document).ready(function(){
$("#searchsubmit").click(function(e){
e.preventDefault();
var search_val=$("#s").val();
$.post('http://mysite.com/wp-content/themes/beta/search-results.php',{search_string:search_val},function(data){
if(data.length>0){
$("#results").html(data);
}
});
});
});
</script>
そしてこれがsearch-results.php
テンプレートです。検索結果をテンプレートに渡していないのではないかと思います。
<ul>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<li><a title="Permalink to this post" href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; endif; ?>
<?php if (!have_posts()) { echo('<li>No results to show.</li>'); } ?>
</ul>
この方法でテンプレートファイルを直接読み込む場合、WordPress環境を読み込んでいないため、WordPress関数は使用できません。
2つのオプションは、フロントエンドで検索ページを読み込むか、結果をフィルターすることです:
$('#results').load('http://mysite.com/?s=searchterm ul#target');
または、WordPressが提供するAJAX機能を使用して検索機能を構築します。 AJAX in Plugins を参照してください。
編集
以下に、AJAXを介して追加の投稿を読み込む方法の例を示します。これは、必要に応じて検索機能を作成するように調整できます。
まず、functions.php
で、JavaScriptをキューに入れ、スクリプトをローカライズして、リクエストを処理するAJAX URLを渡します。 WordPress AJAXはadmin-ajax.php
を使用して、フロントエンドまたはバックエンドのすべてのAJAXリクエストを処理します。
add_action( 'wp_enqueue_scripts', 'wpa56343_scripts', 100 );
function wpa56343_scripts() {
wp_enqueue_script(
'wpa56343_script',
get_template_directory_uri() . '/js/scripts.js?ver=1.0',
array( 'jquery' ),
null,
false
);
wp_localize_script(
'wpa56343_script',
'WPaAjax',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' )
)
);
}
scripts.js
では、AJAXアクションを呼び出し、postoffset
varを渡すJavaScriptが、クエリに渡すことができるようにしています。 WPaAjax.ajaxurl
を使用して、このリクエストを処理するURLを渡すことにも注意してください。
jQuery(document).ready(function($){
$('#blog-more').click(function(e){ // <- added
e.preventDefault(); // <- added to prevent normal form submission
var postoffset = $('.post').length;
$.post(
WPaAjax.ajaxurl,
{
action : 'wpa56343_more',
postoffset : postoffset
},
function( response ) {
$('#container').append( response );
}
);
});
});
functions.php
では、AJAXリクエストを処理する関数が、上記のJavaScriptで渡したアクションにマッピングされています。削除されたWordPressのバージョンはブートストラップされるため、ほとんどのWordPress関数にアクセスできます。
add_action('wp_ajax_wpa56343_more', 'wpa56343_more');
add_action('wp_ajax_nopriv_wpa56343_more', 'wpa56343_more');
function wpa56343_more(){
global $wp_query;
$offset = $_POST['postoffset'];
$args = array(
'offset' => $offset,
'posts_per_page' => 10
);
$wp_query = new WP_Query( $args );
get_template_part( 'post-template' );
exit;
}