Istotope ajax内容加载

时间:2016-06-21 14:30:13

标签: ajax wordpress jquery-isotope jquery-masonry

我用同位素砌体布局卡在WordPress中实现加载下一组帖子。 它只是没有触发附加元素,我无法弄清楚原因。 如果有人能指出我正确的方向,我将不胜感激。

jQuery AJAX功能

function load_content( args ) {

        $container = $('#container-async');
        $status    = $('.status');

        $.ajax({
            url: ajax_url,
            data: {
                action: 'do_load_posts',
                nonce: nonce,
                args: args
            },
            type: 'post',
            dataType: 'json',
            success: function( data, textStatus, XMLHttpRequest ) {

                $items = data.posts;

                if ( args.action === 'filter') {
                    /**
                     * Replace items
                     */
                    $container.imagesLoaded( function() {
                        $container.isotope({
                            itemSelector: '.grid-item',
                            percentPosition: true,
                            masonry: {
                                columnWidth: '.grid-sizer'
                            }
                        });
                        $container.html( $items ).isotope( 'appended', $items, function() {
                            console.log('inserted');
                        });
                    });
                }
                else {
                    /**
                     * Append items
                     */
                    $container.imagesLoaded( function() {
                        $container.isotope({
                            itemSelector: '.grid-item',
                            percentPosition: true,
                            masonry: {
                                columnWidth: '.grid-sizer'
                            }
                        });
                        $container.append( $items ).isotope( 'appended', $items, function() {
                            console.log('appended');
                        });
                    });
                }
            },
            error: function( MLHttpRequest, textStatus, errorThrown ) {
                $status.toggleClass('active');
            }
        });
}

WordPress AJAX:

function ajax_do_load_posts() {

    // Verify nonce
    if( !isset( $_POST['nonce'] ) || !wp_verify_nonce( $_POST['nonce'], 'nonce' ) )
        die('Permission denied');

    $response = [
        'status' => 500,
        'posts'  => 0,
    ];

    $filter = $_POST['args'];

    $type   = get_post_type_object( $filter['type'] );
    $args   = [
        'post_type'      => sanitize_text_field($filter['type']),
        'paged'          => intval($filter['page']),
        'posts_per_page' => $filter['qty'],
    ];

    $qry = new WP_Query($args);

    if ($qry->have_posts()) :
        ob_start();

        while($qry->have_posts()) : $qry->the_post(); ?>
            <div class="grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3">
                <?php get_template_part('templates/loop', 'card' ); ?>
            </div>
        <?php endwhile;

        $response = [
            'status' => 200,
            'posts'  => ob_get_clean(),
        ];
    endif;

    wp_reset_query();
    wp_reset_postdata();

    die(json_encode($response));
}

add_action('wp_ajax_do_load_posts', 'ajax_do_load_posts');
add_action('wp_ajax_nopriv_do_load_posts', 'ajax_do_load_posts');

将项目插入或附加到容器中,但仅在页面加载时已存在的项目上触发砌体。

enter image description here

我已经用Google搜索并尝试了各种解决方案,但它们都不起作用,无论是同位素还是砌体jquery插件。

1 个答案:

答案 0 :(得分:0)

我能够解决我的问题,看起来问题是因为我使用的是jQuery默认的append / insert方法。 我已经改用同位素方法,现在看起来很好。

所以基本上不是

$container.html( $items ).isotope( 'appended', $items, function() {
    console.log('inserted');
});

我现在正在使用:

$grid.isotope('insert', jQuery($items));

如果我不使用同位素追加/插入方法,实际上看起来合乎逻辑的是同位素不能知道附加的项目。请注意,我还在jQuery中包装了$ items。

无论如何我为同一个PHP函数工作的JS是:

function load_content( args ) {

    $container = $('#container-async');
    $status    = $('.status');

    $.ajax({
        url: ajax_url,
        data: {
            action: 'do_load_posts',
            nonce: nonce,
            args: args
        },
        type: 'post',
        dataType: 'json',
        success: function( data, textStatus, XMLHttpRequest ) {

            $items = data.posts;

            var $grid = $('.masonry').imagesLoaded( function() {

                $grid.isotope({
                    itemSelector: '.grid-item',
                    percentPosition: true,
                    masonry: {
                        columnWidth: '.grid-sizer'
                    }
                });

                if ( args.action === 'filter') {
                    $grid.isotope('remove', $('.grid-item'));
                }

                $grid.isotope('insert', jQuery($items));
            });


            $grid.on( 'layoutComplete', function( event, laidOutItems ) {
                $container.removeClass(data.action);
            });
        },
        error: function( MLHttpRequest, textStatus, errorThrown ) {
            $status.toggleClass('active');
        }
    });
}