我有一个简单的循环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功能,同时省略所有不必要的代码?
最合适的回答,由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();
The
rewind_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();
最后,我们只是使用输出缓冲来循环任何对象,但模板部分为这些对象提供了相同的布局。