我正在使用AJAX加载主页上的下一组帖子。立柱加载良好,但不会渲染短代码。我正在尝试对ajax调用获取的内容使用do\\u shortcode函数(尽管专家建议not to use do_shortcode) 但显然它正在失败。
以下是我处理请求的函数:
function theme_load_more_posts() {
check_ajax_referer( \'theme-load-more-posts-nonce\', \'nonce\' );
$args = isset( $_POST[\'query\'] ) ? array_map( \'esc_attr\', $_POST[\'query\'] ) : array();
$args[\'post_type\'] = isset( $args[\'post_type\'] ) ? esc_attr( $args[\'post_type\'] ) : \'post\';
$args[\'paged\'] = esc_attr( $_POST[\'page\'] );
$args[\'post_status\'] = \'publish\';
ob_start();
$loop = new WP_Query( $args );
if( $loop->have_posts() ): while( $loop->have_posts() ): $loop->the_post();
get_content_template();
endwhile;
endif;
$data = ob_get_clean();
wp_send_json_success( do_shortcode($data) ); // Performing do_shortcode here but it doesn\'t work.
wp_reset_postdata();
wp_die();
}
add_action( \'wp_ajax_theme_load_more_posts\', \'theme_load_more_posts\' );
add_action( \'wp_ajax_nopriv_theme_load_more_posts\', \'theme_load_more_posts\' );
The
get_content_template()
函数加载一个模板文件,该文件包含用于显示帖子内容的常规wordpress代码。
我试过使用do_shortcode_in_html()
在…上get_content_template()
但它也不起作用。
我也看到了与此相关的类似线程,但它们主要解决了ajax调用本身的问题。我认为我的问题在于这个功能。有什么猜测吗?
SO网友:brianjohnhanna
我想问题是你没有打电话do_shortcode()
在输出缓冲区中。您不需要在输出缓冲区内运行循环,因为我可以假设get_content_template()
只需返回带有嵌入式短代码的HTML。将其保存到字符串变量,然后通过do_shortcode()
并保存echo
ed输出到缓冲区。
这是未经测试的,但应将您引导到正确的方向:
function theme_load_more_posts() {
check_ajax_referer( \'theme-load-more-posts-nonce\', \'nonce\' );
$args = isset( $_POST[\'query\'] ) ? array_map( \'esc_attr\', $_POST[\'query\'] ) : array();
$args[\'post_type\'] = isset( $args[\'post_type\'] ) ? esc_attr( $args[\'post_type\'] ) : \'post\';
$args[\'paged\'] = esc_attr( $_POST[\'page\'] );
$args[\'post_status\'] = \'publish\';
$loopContent = \'\';
$loop = new WP_Query( $args );
if( $loop->have_posts() ):
while( $loop->have_posts() ): $loop->the_post();
$loopContent .= get_content_template();
endwhile;
endif;
ob_start();
echo do_shortcode($loopContent);
$data = ob_get_clean();
wp_send_json_success( $data ); // Performing do_shortcode here but it doesn\'t work.
wp_reset_postdata();
wp_die();
}
add_action( \'wp_ajax_theme_load_more_posts\', \'theme_load_more_posts\' );
add_action( \'wp_ajax_nopriv_theme_load_more_posts\', \'theme_load_more_posts\' );