Manipulando pós meta no personalizador

4

Estou trabalhando em um plug-in para campos personalizados em todo o administrador e estou tentando criar o maior número possível de locais para campos. Até agora estou fazendo isso com sucesso para alguns desses locais:

  1. Tipos de postagem
  2. Taxonomias
  3. Comentários
  4. Usuários
  5. Opções (páginas)
  6. Widgets
  7. Itens de menu
  8. Anexos
  9. Códigos de acesso
  10. O personalizador (mais ou menos)

Naturalmente, para cada um dos locais que tenho, estou tentando usar a API apropriada do WordPress - * _post_meta, * _term_meta, etc. e as coisas estão funcionando muito bem.

Para os locais associados a um item que tem um URL (principalmente os 4 primeiros, embora os anexos também tenham URLs), tenho formulários de front-end, que permitiriam aos usuários editar o item atual e salvar seus Os campos personalizados. Eu faço isso através de uma única tag de função / modelo, que não requer nenhum argumento - todos os grupos de campos, que estão associados ao item, são exibidos automaticamente.

O último elemento que desejo ter, antes de considerar o meu (prova de) conceito bem sucedido, é o suporte para o personalizador. Usar a API padrão me permite trabalhar com mods de opções / temas com bastante facilidade e cheguei a um ponto em que o local do "customizador" é bastante funcional. A única desvantagem da minha implementação parece ser que estou exibindo todo o grupo com campos como um único controle. Isso me permite ter guias, lógica condicional e validação apropriada (que depende da lógica condicional). Ainda assim, estou usando configurações diferentes (como em WP_Customize_Setting ), então postMessage e tudo mais estão funcionando corretamente sem precisar hackear mais nada.

O que eu quero, porém, é permitir que os mesmos locais, que têm URLs e possam ter formulários front-end, sejam facilmente adicionados ao personalizador também. Um desenvolvedor pode criar um meta grupo post, que aparecerá como uma caixa postal normal na tela de edição e meu objetivo é permitir que ele chame algo como - > show_in_customizer () para permitir que o grupo seja usado lá também.

Eu sei que muitas pessoas desaconselham a edição de postagens no personalizador e, em muitas ocasiões, eu concordo com elas. No entanto, se houver uma configuração de layout por postagem, algumas opções de cores ou mesmo algo tão simples quanto a imagem em destaque, eu gostaria de manter essa porta aberta.

Para ir direto ao ponto, isso parece ser uma tarefa difícil, porque requer pelo menos o seguinte:

  1. Determinar se deve exibir a seção responsável no personalizador. Isso é bastante fácil através da propriedade "active_callback" das seções.
  2. Alimentando dados no personalizador: Este é um pouco complicado. Mesmo se você clicar no botão "Personalizar" enquanto visualiza uma página, o personalizador é carregado de dentro do contexto do administrador e eu não tenho acesso direto à coisa, que está sendo exibida. O que estou fazendo, é coletar todos os dados que eu preciso no rodapé da página e enviá-lo para o personalizador através de parent.someFunction quando a página é carregada. Isso não é ideal, mas funciona bem - não estou recuperando / enviando nenhum valor mais de uma vez, por isso estou feliz. No mundo perfeito, essa funcionalidade, combinada com o active_callback , permitiria aos usuários editar uma página, clicar em um link para outra página e editar imediatamente a página recém-carregada. No entanto, quando isso é feito, a nova página não recebe nem os parâmetros de solicitação nem os cabeçalhos incluem, por isso, ela praticamente age se ela não estiver no personalizador, portanto, isso não está funcionando para mim.
  3. Sobrescrevendo o resultado de get_*_meta com os valores do customizador na solicitação normal (não postMessage). Esta parte é muito direta.
  4. Salvando os dados: Aqui é onde minha implementação falha: (

Quando o botão "Salvar e publicar" é clicado, o personalizador executa uma solicitação wp_ajax. A solicitação ainda inclui o% normalcustomized JSON, como uma atualização quando um valor é alterado, mas como o script está usando admin-ajax, não sei o que realmente está sendo salvo.

A única ideia que tenho agora é sobrescrever a função wp.customize.previewer.query JavaScript com algo nas linhas de:

var query = wp.customize.previewer.query;
wp.customize.previewer.query = function( options ) {
    args = query.call( wp.customize.previewer, options );
    args.my_plugin_name_current_object = 'post_10';
    return args;
}

Neste ponto, preciso ter muito cuidado ao adicionar o parâmetro e, no geral, a implementação está começando a ficar muito suja.

Finalmente, minha pergunta: Alguém conseguiu alcançar com sucesso uma funcionalidade semelhante no personalizador? Você poderia me aconselhar sobre uma abordagem adequada para acabar com isso?

Até agora não tentei desenvolver nada personalizado para o customizador e (embora não tenha intenção de ofender ninguém), estou surpreso com o quão complicado / super-engenheirado algumas partes do personalizador parecem, enquanto alguns aspectos bem básicos parecem ser extremamente meio cozido.

Eu sei que não estou incluindo nenhum trecho de código em particular, mas a pergunta parece ser geral o suficiente, pelo menos para mim.

Obrigado antecipadamente!

    
por Radoslav Georgiev 13.01.2017 / 23:36

1 resposta

1

Por favor, veja o plugin Personalizar Posts . Ele tem WP_Customize_Post_Setting e WP_Customize_Postmeta_Setting para representar posts e postmeta no personalizador, respectivamente.

    
por Weston Ruter 14.01.2017 / 09:03