我正在使用Modula插件来加速画廊的创建过程。它工作得很好,但我不知道如何在ajax调用中正确渲染它。我阅读了有关通过ajax呈现短代码的文章,但到目前为止,我很难在代码中实现它。以下是我使用的代码:
add_action(\'wp_ajax_nopriv_getHistory\', \'getHistory_ajax\');
add_action(\'wp_ajax_getHistory\', \'getHistory_ajax\');
function getHistory_ajax(){
$args = array(
\'post_type\' => \'gallery\',
\'posts_per_page\' => -1,
\'meta_query\' => array(
array(
\'key\' => \'post_gallery_gallery_year\',
\'value\' => $festivalQueryYear,
\'compare\' => \'LIKE\'
)
),
\'meta_key\' => \'post_gallery_gallery_year\',
\'orderby\' => \'meta_value_num\',
\'order\' => \'DESC\',
);
$gallery= new WP_Query($args);
if($gallery->have_posts()) : while($gallery->have_posts()): $gallery->the_post();
$shortcode = get_field(\'gallery_shortcode\');
echo do_shortcode($shortcode);
endwhile; wp_reset_postdata(); endif;
}
在中
ajax.js $(".festival-year-toggler-js-ajax").on("click", function (e) {
$.ajax({
url: wpAjax.ajaxUrl,
data: { action: "getHistory", festivalQueryYear },
type: "POST",
success: function (data) {
$(\'.target-div\').html(data);
},
error: function (error) {
console.warn(error);
},
});
})
结果是,库中的图像被渲染,但没有指定的布局,这显然是因为短代码没有在其默认环境中运行。如何运行此短代码,使其在ajax调用中的呈现方式与在正常页面加载中的呈现方式相同?
非常感谢您的帮助!!!
最合适的回答,由SO网友:Antti Koskinen 整理而成
我只能在一般层面上对此发表评论,因为我不熟悉您使用的插件。(这可能不是询问此类插件相关问题的最佳场所,因为第三方插件目前在WPSE上被认为是离题的。)
我遇到的大多数此类插件都有某种javascript(或jQuery),它在页面加载时执行,用于设置布局、启用灯箱和其他功能。脚本运行之后,它们就完成了,不关心DOM或html之后会发生什么。这意味着,如果您通过Ajax向页面添加新的html,您需要找到一种方法,自己再次启动这些相同的设置脚本。
$.ajax({
success: function (data) {
// add html to the DOM
$(\'.target-div\').html(data);
// the basic idea..
some_vendor_function_to_init_gallery(
$(\'.target-div\')
);
},
});
这些安装脚本是否全局可用取决于您使用的插件。您需要深入了解插件的源代码,浏览其文档,和/或联系插件作者。如果安装脚本不在全局范围内,那么您可能运气不好。
SO网友:iuriiGav
这是我从Modula团队获得的重新初始化插件的代码片段:
var modulaGalleries = jQuery(\'.modula.modula-gallery\');
jQuery.each(modulaGalleries, function () {
var modulaID = jQuery(this).attr(\'id\'),
modulaSettings = jQuery(this).data(\'config\');
jQuery(\'#\' + modulaID).modulaGallery(modulaSettings);
});
正如Antti所写,需要这样添加:
$.ajax({
success: function (data) {
// add html to the DOM
$(\'.target-div\').html(data);
var modulaGalleries = jQuery(\'.modula.modula-gallery\');
jQuery.each(modulaGalleries, function () {
var modulaID = jQuery(this).attr(\'id\'),
modulaSettings = jQuery(this).data(\'config\');
jQuery(\'#\' + modulaID).modulaGallery(modulaSettings);
});
});