更新所有ACF帖子对象字段中的可用帖子(Wordpress /高级自定义字段)

时间:2018-11-27 10:42:30

标签: php jquery ajax wordpress advanced-custom-fields

我正在尝试在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的黑客攻击之外),我在这里做错了什么。

0 个答案:

没有答案