如何重用包含简单循环的GET_TEMPLATE_PART()以正确使用AJAX?

时间:2018-05-12 作者:Daniel

我有一个简单的循环standard-loop.php 文件(文件位于inc/loop 文件夹):

if ( have_posts() ) :

    while ( have_posts() ) :

        the_post();
        the_content();

    endwhile;

endif;
然后在index.php 我将该文件作为模板的一部分:

get_header();

get_template_part( \'inc/loop/standard\', \'loop\' );

get_footer();
现在,我在functions.php:

function blank_frontend_ajax() {

    $url      = $_POST[\'postUrl\'];
    $post_id  = url_to_postid( $url );
    $post_data = get_post( $post_id );

    get_template_part( \'inc/loop/standard\', \'loop\' );


    wp_die();

}
add_action( \'wp_ajax_nopriv_frontend_ajax\', \'blank_frontend_ajax\' );
add_action( \'wp_ajax_frontend_ajax\', \'blank_frontend_ajax\' );
最后是我的jQuery AJAX:

function desktopAjax() {

    jQuery( \'body\' ).on( \'click\', \'.menu-item a\', function( event ) {

        var postUrl = jQuery( this ).attr( \'href\' );

        event.preventDefault();

        jQuery.ajax({

            url: blankAjax.ajaxUrl,
            type: \'post\',
            data: {
                action: \'frontend_ajax\',
                postUrl: postUrl,
            },

            success: function( postObject ) {

                // jQuery( \'#main\' ).empty().append( postObject );

                console.log( postObject );

            }

        });

    });

}
现在,我想在索引中使用相同的模板部分。php和我的AJAX函数。我知道我可以通过set_query_var() 进入get_template_part() 然后用get_query_var() 但在索引内部也是如此。php不会有太大的杀伤力(index.php中已经有一个post ID,因此无需将post ID传递到get_template_part())? 如何重写get\\u template\\u part()中的内容,以便在索引中加载时正常工作。php和我的AJAX功能,同时省略所有不必要的代码?

1 个回复
最合适的回答,由SO网友:Howdy_McGee 整理而成

从我使用和看到的情况来看,您并没有将整个循环放入模板部分,只是布局。事实上,你总是会有某种循环,不同的是循环内容的布局。你应该这样说:

if( have_posts() ) {

    while( have_posts() ) {

        the_post();
        get_template_part( \'inc/loop/layout\', \'simple\' );

    }

}
现在,如果您真的想在AJAX调用中提取完全相同的查询,您可以说:

rewind_posts();

ob_start();

// Same loop as above

$output = ob_get_clean();
Therewind_posts() 将在索引0处启动全局post循环,以便可以再次运行该循环。实际上,您更可能创建一个新的WP\\U查询和循环,不管这些帖子是什么(偏移?分页?)并使用新的WP\\U查询对象运行相同的循环方法,但仍使用相同的简单布局模板部分:

$query = new WP_Query( $args );

ob_start();

if( $query->have_posts() ) {

    while( $query->have_posts() ) {

        $query->the_post();
        get_template_part( \'inc/loop/layout\', \'simple\' );

    }

}

$output = ob_get_clean();
最后,我们只是使用输出缓冲来循环任何对象,但模板部分为这些对象提供了相同的布局。

结束

相关推荐

AJAX POST端点的标准技术:WP REST还是WP API?

我需要为任何用户(不仅仅是登录用户)都可以使用的联系人表单创建一个post端点。这篇文章是通过AJAX/REST完成的。通过新的WP REST端点实现这一点的行业标准方法是吗?比如,add_action( \'rest_api_init\', function () { register_rest_route( \'mytheme/v1\', \'/contact\', array( \'methods\' => \'POST\', \