Я пытаюсь добиться чего-то с помощью 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?Я подозреваю (кроме взлома, который я использовал в начале, чтобы получить идентификаторы постов), что я делаю что-то очень неправильное здесь.