我正在尝试在Wordpress中使用AJAX实现某些功能,以便在其中选择帖子时更新admin视图中所有ACF Post Objects字段的查询。
我想在所有Post Object字段之间创建某种同步,并使其同步,这样,如果我在Post Object字段之一中选择了一个帖子,则该帖子应该不可能在另一个Post Object的任何一个中再次选择领域。如果我从“发布对象”字段中删除该帖子(将其设为null
),则应该可以再次选择该帖子。
收集所选帖子
(到目前为止)我已经在PHP中创建了一个有点古怪的解决方案,该解决方案将在“发布对象”字段中选择的每个帖子的ID和特色图像URL反射到“发布对象”标题中的隐藏div中。
function my_post_object_result($title, $post, $field, $post_id)
{
$post_thumbnail_url = get_the_post_thumbnail_url($post->ID);
$hidden_div = $title;
$hidden_div .= '<div id="' . $post->ID . '" class="featured-image" style="display:none;">' . $post_thumbnail_url . ' </div>';
return $hidden_div;
}
add_filter('acf/fields/post_object/result', 'my_post_object_result', 10, 4);
通过AJAX发送选定的帖子ID
精选图像URL用于在JavaScript的帮助下在Post Object输入下创建一个单独的div。由于它们用于网格,因此管理员查看他们选择的帖子的特色图片非常重要。但这与这个问题无关。
然后,JavaScript使用ID属性创建一个数组,其中包含当前选中的每个帖子ID,然后将其作为数据通过AJAX发送。
这是我在页面加载时使用JavaScript所做的事情:
$(window).on("load", function() {
$(".acf-field-post-object").each(function() {
var imageURL = $(this).find(".select2-selection").find(".featured-image").text();
$(this).find(".acf-input").append("<div class='featured-image-container'><div class='inner'><img src='" + imageURL + "' /></div></div>");
var newPost = $(this).find(".select2-selection").find(".featured-image").attr("id");
selectedPosts.push(newPost);
})
var filteredPosts = selectedPosts.filter(function(id){
return id != undefined
})
var data = {
'action': 'my_action',
'selectedPosts': filteredPosts,
};
$.post(ajax_object.ajax_url, data, function(response) {
console.log(response);
});
})
修改发布对象查询
AJAX的response
返回一个包含所有选定帖子的PHP数组,这正是我想要的。 AJAX将数据发送到的my_action
PHP函数如下:
add_action('wp_ajax_my_action', 'my_action');
function my_action()
{
$postitems = $_POST['selectedPosts'];
print_r($postitems);
function work_post_object_query($args, $field, $post_id)
{
$args['post_status'] = array('publish');
$args['post__not_in'] = $postitems;
return $args;
}
// filter for every field
add_filter('acf/fields/post_object/query', 'work_post_object_query', 10, 3);
exit();
}
我正在使用acf/fields/post_object/query
过滤器,该过滤器使我可以修改“发布对象”字段的查询。如果最初在functions.php
中调用此过滤器,则可以使用该过滤器,但是当我尝试使用这样的AJAX对其进行修改时,我遇到了麻烦。
问题
“发布对象”字段根本不会更新。所以我想知道,这是将ACF过滤器与AJAX一起使用的正确方法吗?我怀疑(除了我最初用于检索帖子ID的黑客攻击之外),我在这里做错了什么。