加载更多帖子Ajax按钮在WordPress中更新 24.04.2016.

2022-08-30 13:38:02

我浏览了一下老问题,并尝试了许多不同的方法,这些方法似乎可以做到这一点。我最接近这里的工作是这个:如何在Ajax的自定义WP_Query实现分页

我已经尝试了一切,但它就是不起作用。页面上绝对没有任何变化。如果您检查“加载更多按钮”并单击它,则jQuery正在使“加载更多按钮”操作从中更改为“即使这样6对我来说似乎也不合适”。这不是添加帖子,我认为我错过了一些简单的东西,但对于我的生活,我无法解决它。<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');

我在页脚中的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>

有人能看到我错过的东西或能够帮助的东西吗?


答案 1

更新 24.04.2016.

我已经在我的页面上创建了关于在Twenty Sixteen主题上实现此内容 https://madebydenis.com/ajax-load-posts-on-wordpress/ 教程,因此请随时查看:)

编辑

我已经在Twenty Fifteen上测试了这个,它正在工作,所以它应该对你有用。

索引.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');

但就目前而言,您可以将其排除在外。

函数中的下一个.php我添加了

wp_localize_script( 'twentyfifteen-script', 'ajax_posts', array(
    'ajaxurl' => admin_url( 'admin-ajax.php' ),
    'noposts' => __('No older posts found', 'twentyfifteen'),
));

紧跟在现有的 .这将加载WordPress自己的admin-ajax.php以便我们可以在ajax调用中调用它时使用它。wp_localize_script

在函数的末尾.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,你会把.这将在数组中,您将能够在ajax中使用它。$cat$_POST

最后一部分是ajax本身。在函数中.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

enter image description here

enter image description here

enter image description here

更新

对于“无限加载”,而不是在按钮上的单击事件(只需使其不可见,使用),您可以尝试使用visibility: hidden;

$(window).on('scroll', function () {
    if ($(window).scrollTop() + $(window).height()  >= $(document).height() - 100) {
        load_posts();
    }
});

这应该在距离页面底部 100px 时运行该函数。在我的网站上的教程中,您可以添加一个检查以查看帖子是否正在加载(以防止两次触发ajax),并且可以在滚动到达页脚顶部时触发它load_posts()

$(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

您可以通过在代码中放入s来轻松检查它,并在检查器中查看它们抛出的内容console.log

$(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();
    }
});

只需相应地调整;)

希望这有助于:)如果您有任何疑问,请直接询问。


答案 2

如果我没有使用任何类别,那么我该如何使用此代码?实际上,我想将此代码用于自定义帖子类型。