Meu problema real é um pouco complexo, então tentarei abstraí-lo e mantê-lo simples.
Estou trabalhando em um aplicativo personalizado baseado no WordPress. Registrei um tipo de postagem personalizado, vamos chamá-lo de "pessoas", onde armazeno informações sobre ... pessoas.
O CPT oferece suporte apenas aos campos padrão de título e conteúdo de postagem, mas existem algumas metaboxes para armazenar informações pessoais (pense em meu aplicativo como um catálogo de endereços).
Portanto, existe um metabox para armazenar informações pessoais, um para armazenar informações de redes sociais e outro para armazenar informações relacionadas ao trabalho, ou seja, se essa pessoa é para mim um cliente, um fornecedor, se temos créditos ou débitos ...
Simplifiquei aqui, mas há uma quantidade consistente de metaboxes, digamos 12.
Meu problema é que, algumas pessoas para as quais eu quero armazenar informações são apenas contatos aleatórios e quero armazenar apenas informações pessoais, outras são amigas e quero armazenar informações pessoais e informações de redes sociais, outras são clientes ou fornecedores e eu deseja armazenar informações relacionadas ao trabalho.
Se, ao editar uma postagem, eu oculto (através do menu de opções da tela ) ou fecho qualquer metabox, não preciso, quando abro outra postagem onde preciso delas, preciso mostrar ou abri-las novamente. Isso porque os metaboxes posição / status / pedido são salvos por usuário como metadados do usuário .
Se você imagina que em algumas postagens eu preciso de 2 metaboxes, em 10 e 5, você entende que isso é irritante porque manter todos eles mostrados / abertos torna a tela de edição baixa acessível (a barra de rolagem parece interminável), e às vezes as informações que eu procuro são no final da página, após um monte de metaboxes sem informações ...
Questão:
É possível salvar metaboxes de posição / status / ordem por postagem para um tipo de postagem específico?
PS: Eu sei que alguns js / jQuery podem resolver o problema, mas, se possível, evitaria soluções javascript.
'get_user_option_*_post'
para fazer o WP reconhecer dados personalizados. Só acho que eu não gosto muito é o uso dowp_get_referer
que realmente em$_SERVER
var que é não é realmente confiável , mas eu acho que tenho uma idéia para superar o "principal problema";)wp_get_referer()
método, por isso o chamei de uma solução PHP não elegante ;-) Pensei em armazenar o ID da postagem atual de cada usuário, mas isso não funciona se um usuário estiver editando dois ou mais postagens no navegador. Ansiosos de ouvir sobre a sua ideia sobre o "principal problema" Aproveite o fim de semana ;-)Conforme apontado por birgire em sua resposta , o WordPress usa o AJAX para atualizar o status de metaboxes e os dados passados na solicitação do AJAX não incluem o ID da postagem, o que dificulta a atualização do status das caixas por postagem.
Depois de encontrar a ação AJAX usada pelo WordPress
'closed-postboxes'
, procurei essa sequência na pasta admin js para descobrir como o WordPress faz a solicitação AJAX.Descobri que isso acontece
postbox.js
na linha # 118 .Parece assim:
Essencialmente, o WordPress analisa itens do DOM com a classe 'caixa postal' e a classe 'fechada' e cria uma lista separada por vírgula de seus IDs. O mesmo é feito para itens DOM ocultos com a classe 'caixa postal'.
Então, meu pensamento era: eu posso criar um metabox falso que tenha as classes certas e oculto, definindo seu ID para conter o ID da postagem e, dessa forma, eu posso recuperá-lo em uma solicitação AJAX.
Isto é o que eu fiz:
Dessa maneira, criei uma metabox que está sempre fechada e sempre oculta, para que o WordPress envie seu ID como
$_POST
var na solicitação AJAX e, uma vez que o ID da caixa falsa contenha o ID da postagem de maneira previsível, sou capaz de reconhecê-la.Depois disso, observei como o WordPress executa a tarefa AJAX.
Na
admin-ajax.php
linha 72 , o WordPress adere'wp_ajax_closed-postboxes'
à prioridade 1.Portanto, para agir antes do WordPress, eu poderia conectar a mesma ação à prioridade 0.
Tendo os dados salvos em uma meta de postagem, foi possível filtrar
get_user_option_closedpostboxes_mycpt
eget_user_option_metaboxhidden_mycpt
(ambas as variações doget_user_option_{$option}
filtro) forçar as opções de carregamento do WordPress a partir da meta de postagem:e
fonte