Обновлять доступные записи во всех полях ACF Post Object при изменении (Wordpress / Расширенные пользовательские поля) - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь добиться чего-то с помощью AJAX в Wordpress, который обновляет запрос для всех полей объектов записей ACF в представлении администратора при выборе сообщения в них.

Я хочу создать какую-то синхронизацию между всеми полями объекта сообщения и сделать так, чтобы, если я выберу сообщение в одном из полей объекта сообщения, эту публикацию нельзя было выбрать снова ни в одном из полей.другие поля Post Object.Если я удалю сообщение из поля «Объект сообщения» (сделав его null), то можно будет выбрать этот пост снова.

Сбор выбранных сообщений

Я (на данный момент) создал несколько хакерское решение в PHP, которое отображает идентификатор и 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

URL избранного изображения используется для создания отдельного элемента div под входом Post Object с помощью JavaScript.Так как они используются для сетки, для администратора важно видеть избранное изображение сообщения, которое они выбирают.Но это не относится к этой проблеме.

Атрибут ID затем используется JavaScript для создания массива, содержащего каждый идентификатор записи, который выбран в данный момент, и затем он отправляется в качестве данных через 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);
        });

    })

Изменение запроса Post Object

response из AJAX возвращает PHPмассив со всеми выбранными постами, чего я и хочу.PHP-функция my_action, в которую AJAX отправляет данные, выглядит следующим образом:

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, который позволяет мне изменять запрос поля Post Object.Этот фильтр работает, если я сначала вызываю его в functions.php, но когда я пытаюсь изменить его, используя AJAX, вот так, у меня возникают проблемы.

Проблема

Поля Post Object вообще не обновляются.Поэтому мне интересно, это правильный способ использования фильтров ACF с AJAX?Я подозреваю (кроме взлома, который я использовал в начале, чтобы получить идентификаторы постов), что я делаю что-то очень неправильное здесь.

...