私は古い質問に目を通し、これを行うように思われるさまざまな方法の多くを試しました。作業に最も近いのは、次のとおりです。 カスタムWP_Query Ajaxにページネーションを実装する方法
私はすべてを試しましたが、うまくいきません。ページ上で何も変わりません。 [さらに読み込む]ボタンを調べてクリックすると、jqueryは<a id="more_posts">Load More</a>
から<a id="more_posts" disables="disabled">Load More</a>
に変わるときに[さらに読み込む]ボタンアクションを作成しますが、それでも私には思えません。投稿を追加するのではなく、単純なものが欠けていると思いますが、私の人生では解決できません。
テンプレートファイルのコードは次のとおりです。
<div id="ajax-posts" class="row">
<?php
$postsPerPage = 3;
$args = [
'post_type' => 'post',
'posts_per_page' => $postsPerPage,
'cat' => 1
];
$loop = new WP_Query($args);
while ($loop->have_posts()) : $loop->the_post(); ?>
<div class="small-12 large-4 columns">
<h1><?php the_title(); ?></h1>
<p><?php the_content(); ?></p>
</div>
<?php
endwhile;
echo '<a id="more_posts">Load More</a>';
wp_reset_postdata();
?>
</div>
関数ファイルのコードは次のとおりです。
function more_post_ajax(){
$offset = $_POST["offset"];
$ppp = $_POST["ppp"];
header("Content-Type: text/html");
$args = [
'suppress_filters' => true,
'post_type' => 'post',
'posts_per_page' => $ppp,
'cat' => 1,
'offset' => $offset,
];
$loop = new WP_Query($args);
while ($loop->have_posts()) { $loop->the_post();
the_content();
}
exit;
}
add_action('wp_ajax_nopriv_more_post_ajax', 'more_post_ajax');
add_action('wp_ajax_more_post_ajax', 'more_post_ajax');
そして、フッターのMy JQueryは次のとおりです。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready( function($) {
var ajaxUrl = "<?php echo admin_url('admin-ajax.php')?>";
// What page we are on.
var page = 5;
// Post per page
var ppp = 3;
$("#more_posts").on("click", function() {
// When btn is pressed.
$("#more_posts").attr("disabled",true);
// Disable the button, temp.
$.post(ajaxUrl, {
action: "more_post_ajax",
offset: (page * ppp) + 1,
ppp: ppp
})
.success(function(posts) {
page++;
$("#ajax-posts").append(posts);
// CHANGE THIS!
$("#more_posts").attr("disabled", false);
});
});
});
</script>
誰かが私が行方不明になっている、または手伝うことができるものを見ることができますか?
私は自分のページでチュートリアルを作成しました https://madebydenis.com/ajax-load-posts-on-wordpress/ Twenty Sixteenテーマでこれを実装することについて、お気軽にチェックしてください:)
これをTwenty Fifteenでテストしましたが、動作しているので、動作するはずです。
Inindex.php(メインページに投稿を表示すると仮定しますが、ページテンプレートに配置しても機能するはずです)置いた:
<div id="ajax-posts" class="row">
<?php
$postsPerPage = 3;
$args = array(
'post_type' => 'post',
'posts_per_page' => $postsPerPage,
'cat' => 8
);
$loop = new WP_Query($args);
while ($loop->have_posts()) : $loop->the_post();
?>
<div class="small-12 large-4 columns">
<h1><?php the_title(); ?></h1>
<p><?php the_content(); ?></p>
</div>
<?php
endwhile;
wp_reset_postdata();
?>
</div>
<div id="more_posts">Load More</div>
これにより、カテゴリ8から3つの投稿が出力されます(そのカテゴリに投稿があったので使用しました。好きなものを使用できます)。あなたがいるカテゴリをクエリすることもできます
$cat_id = get_query_var('cat');
これにより、クエリで使用するカテゴリIDが得られます。これをローダーに入れて(さらにdivをロード)、jQueryで次のようにプルできます。
<div id="more_posts" data-category="<?php echo $cat_id; ?>">>Load More</div>
そして、カテゴリーを引き出します
var cat = $('#more_posts').data('category');
しかし、今のところ、これは省略できます。
次にfunctions.phpに追加しました
wp_localize_script( 'twentyfifteen-script', 'ajax_posts', array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'noposts' => __('No older posts found', 'twentyfifteen'),
));
既存のwp_localize_script
の直後。これにより、WordPress独自のadmin-ajax.phpがロードされ、ajax呼び出しで呼び出すときに使用できます。
Functions.phpファイルの最後に、投稿を読み込む関数を追加しました。
function more_post_ajax(){
$ppp = (isset($_POST["ppp"])) ? $_POST["ppp"] : 3;
$page = (isset($_POST['pageNumber'])) ? $_POST['pageNumber'] : 0;
header("Content-Type: text/html");
$args = array(
'suppress_filters' => true,
'post_type' => 'post',
'posts_per_page' => $ppp,
'cat' => 8,
'paged' => $page,
);
$loop = new WP_Query($args);
$out = '';
if ($loop -> have_posts()) : while ($loop -> have_posts()) : $loop -> the_post();
$out .= '<div class="small-12 large-4 columns">
<h1>'.get_the_title().'</h1>
<p>'.get_the_content().'</p>
</div>';
endwhile;
endif;
wp_reset_postdata();
die($out);
}
add_action('wp_ajax_nopriv_more_post_ajax', 'more_post_ajax');
add_action('wp_ajax_more_post_ajax', 'more_post_ajax');
ここで、ページのキーを配列に追加しました。これにより、ループは、投稿を読み込むときにあなたがどのページであるかを追跡できます。
ローダーにカテゴリを追加した場合、次を追加します。
$cat = (isset($_POST['cat'])) ? $_POST['cat'] : '';
そして、8の代わりに$cat
を入れます。これは$_POST
配列にあり、ajaxで使用できます。
最後の部分はajaxそのものです。 functions.js$(document).ready();
環境内に配置します
var ppp = 3; // Post per page
var cat = 8;
var pageNumber = 1;
function load_posts(){
pageNumber++;
var str = '&cat=' + cat + '&pageNumber=' + pageNumber + '&ppp=' + ppp + '&action=more_post_ajax';
$.ajax({
type: "POST",
dataType: "html",
url: ajax_posts.ajaxurl,
data: str,
success: function(data){
var $data = $(data);
if($data.length){
$("#ajax-posts").append($data);
$("#more_posts").attr("disabled",false);
} else{
$("#more_posts").attr("disabled",true);
}
},
error : function(jqXHR, textStatus, errorThrown) {
$loader.html(jqXHR + " :: " + textStatus + " :: " + errorThrown);
}
});
return false;
}
$("#more_posts").on("click",function(){ // When btn is pressed.
$("#more_posts").attr("disabled",true); // Disable the button, temp.
load_posts();
});
保存してテストし、動作します:)
証拠としての画像(見掛け倒しのスタイリングを気にしないでください、それはすぐに行われました)。また、投稿内容は意味不明なxDです
UPDATE
ボタンのクリックイベントではなく「無限ロード」の場合(visibility: hidden;
で非表示にするだけ)
$(window).on('scroll', function () {
if ($(window).scrollTop() + $(window).height() >= $(document).height() - 100) {
load_posts();
}
});
これにより、ページの下部から100ピクセルのときにload_posts()
関数が実行されます。私のサイトのチュートリアルの場合、投稿がロードされているかどうかを確認するチェックを追加し(ajaxの2回の発火を防ぐため)、スクロールがフッターの上部に到達したときに発火することができます
$(window).on('scroll', function(){
if($('body').scrollTop()+$(window).height() > $('footer').offset().top){
if(!($loader.hasClass('post_loading_loader') || $loader.hasClass('post_no_more_posts'))){
load_posts();
}
}
});
これらの場合の唯一の欠点は、何らかの理由で$(document).height() - 100
または$('footer').offset().top
の値にスクロールできないことです。その場合は、スクロールする先の数字を増やしてください。
console.log
sをコードに挿入して、インスペクターで何がスローされるかを確認することで簡単に確認できます
$(window).on('scroll', function () {
console.log($(window).scrollTop() + $(window).height());
console.log($(document).height() - 100);
if ($(window).scrollTop() + $(window).height() >= $(document).height() - 100) {
load_posts();
}
});
それに応じて調整してください;)
これがお役に立てば幸いです:)質問がある場合は質問してください。