Моя настоящая проблема немного сложна, поэтому я постараюсь здесь абстрагироваться и сделать ее проще.
Я работаю над пользовательским приложением на основе WordPress. Я зарегистрировал пользовательский тип поста, назовем его «люди», где я храню информацию о ... людях.
CPT поддерживает только поля заголовка и содержимого публикации по умолчанию, но есть некоторые метабоксы для хранения информации о человеке (думаю, что мое приложение - это адресная книга).
Таким образом, существует метабокс для хранения личной информации, один для хранения информации в социальных сетях, другой для хранения информации, связанной с работой, т.е. если этот человек для меня является клиентом, поставщиком, если у нас есть кредиты или дебеты ...
Я упростил здесь, но есть постоянное количество метабоксов, скажем, 12.
Моя проблема в том, что некоторые люди, для которых я хочу хранить информацию, являются просто случайными контактами, и я хочу хранить только личную информацию, другие - друзья, и я хочу хранить личную информацию и информацию в социальных сетях, другие - клиенты или поставщики, и я хочу хранить информацию, связанную с работой.
Если при редактировании поста я скрываю (через экранное меню ) или закрываю ненужные метабоксы, при открытии другого поста там, где он мне нужен, мне нужно показать или открыть их снова. Это потому, что положение / статус / порядок метабоксов сохраняются для каждого пользователя как метаданные .
Если вы представите, что в некоторых постах мне нужны 2 метабокса, в 10 и в 5, вы понимаете, что это раздражает, потому что, если все они отображаются / открыты, экран редактирования становится малодоступным (полоса прокрутки кажется бесконечной), и иногда информация, которую я ищу, - в конце страницы после нескольких метабоксов без информации ...
Вопрос:
Возможно ли сохранить положение / статус / порядок метабоксов для каждого поста для определенного типа поста?
PS: я знаю, что некоторые js / jQuery могут решить эту проблему, но если возможно, я бы избегал решений javascript.
'get_user_option_*_post'
WP для распознавания пользовательских данных. Только думаю, что мне не очень нравится, это использованиеwp_get_referer
действительно на$_SERVER
var, которое не очень надежно, но я думаю, что у меня есть идея преодолеть «главную проблему»;)wp_get_referer()
метода, поэтому я назвал его не элегантным решением PHP ;-) Сначала я подумал о сохранении текущего идентификатора записи для каждого пользователя, но это не работает, если пользователь редактирует два или более посты в браузере.Как отметил birgire в своем ответе , WordPress использует AJAX для обновления статуса метабоксов, а данные, передаваемые в запросе AJAX, не включают идентификатор поста, что затрудняет обновление статуса ящиков для каждого поста.
Когда я обнаружил, что AJAX-действие, используемое WordPress - это
'closed-postboxes'
, я искал эту строку в папке admin js, чтобы найти, как WordPress выполняет AJAX-запрос.Я обнаружил, что это происходит
postbox.js
в строке № 118 .Это выглядит так:
По сути, WordPress просматривает элементы DOM с классом 'postbox' и классом 'closed' и создает разделенный запятыми список их идентификаторов. То же самое сделано для скрытых элементов DOM с классом 'postbox'.
Итак, я подумал: я могу создать фальшивый метабокс, который имеет правильные классы и который скрыт, установив его идентификатор, содержащий идентификатор публикации, и таким образом я могу получить его в запросе AJAX.
Вот что я сделал:
Таким образом, я создал метабокс, который всегда закрыт и всегда скрыт, поэтому WordPress отправит свой идентификатор в виде
$_POST
var в запросе AJAX, и как только поддельный идентификатор поля содержит идентификатор сообщения предсказуемым образом, я могу распознать сообщение.После этого я посмотрел, как WordPress выполняет задачу AJAX.
В
admin-ajax.php
строке 72 WordPress подключается'wp_ajax_closed-postboxes'
с приоритетом 1.Итак, чтобы действовать до WordPress, я мог подключить то же действие с приоритетом 0.
Сохранение данных в мета-записи позволило отфильтровать
get_user_option_closedpostboxes_mycpt
иget_user_option_metaboxhidden_mycpt
(оба вариантаget_user_option_{$option}
фильтра) принудительно настроить параметры загрузки WordPress из мета-записи:а также
источник