標準的なWPページ付けをAjaxの「もっと投稿を追加」ボタンに置き換えようとしています。私は基本的に この質問 からのコードに従っています。これはほとんどの場合うまくいきます。
関連するコードは次のとおりです。
HTML(ブログのインデックスページ):
<div id="content">
<?php $args = array(
'posts_per_page' => 5
);
if (isset($_GET['views'])) {
$args['orderby'] = 'meta_value_num';
$args['meta_key'] = 'post_views_count';
$args['order'] = 'DESC';
};
$wp_query = new WP_Query($args); ?>
<?php while( $wp_query->have_posts() ): $wp_query->the_post(); ?>
<?php the_title(); ?>
<?php endwhile; ?>
<a id="more_posts">Load More</a>
<?php wp_reset_postdata(); ?>
</div>
JS(ブログの索引ページの下部にあります)
var ajaxUrl = "<?php echo admin_url('admin-ajax.php', null); ?>";
var page = 1; // What page we are on.
var ppp = 4; // Post per page
jQuery("#more_posts").on("click",function(){ // When btn is pressed.
jQuery("#more_posts").attr("disabled",true); // Disable the button, temp.
jQuery.post(ajaxUrl, {
action:"more_post_ajax",
offset: (page * ppp) + 1,
ppp: ppp
}).success(function(posts){
page++;
jQuery("#content").append(posts);
jQuery("#more_posts").attr("disabled",false);
});
});
PHP(functions.php内):
function more_post_ajax(){
$offset = $_POST["offset"];
$ppp = $_POST["ppp"];
header("Content-Type: text/html");
$args2 = array(
'posts_per_page' => $ppp,
'offset' => $offset,
'orderby' => 'Rand'
);
$custom2 = new WP_Query($args2);
while ($custom2->have_posts()) : $custom2->the_post();
the_title();
endwhile;
exit;
}
add_action('wp_ajax_nopriv_more_post_ajax', 'more_post_ajax');
add_action('wp_ajax_more_post_ajax', 'more_post_ajax');
実行する必要があるのは、テンプレートファイルのコードで機能するので、「ビュー」が順序として選択されているかどうかに基づいて、投稿の読み込みに使用されるクエリのパラメータを変更することです。
Functions.phpのクエリーに追加された引数が正しく機能しないことを除けば、すべて正常に機能します。たとえば、posts_per_page
を$ppp
変数からfunctions.phpの中の数字に変更した場合、それは正しく機能します。しかし、'orderby' => 'Rand'
(テスト目的でのみ使用されている)は何もしません。投稿はまだ日付順に読み込まれています。私が試した他のorderby
や他のパラメータは機能しません。関数からクエリを取り出してテンプレートファイルに直接追加すれば、うまくいきます。
Functions.phpのクエリが追加のパラメータを認識しないのはなぜですか?他のパラメータではうまくいかないのに、なぜposts_per_page
やoffset
の変更が正しく機能するのでしょうか。
何らかの理由で、それはorderby
パラメータに特有の問題でした。 remove_all_filters('posts_orderby');
関数の先頭にmore_post_ajax()
を追加することで問題は解決しました。