(Minha primeira pergunta WP já feita! Seja gentil!)
Estou construindo um site composto principalmente de páginas (estáticas), usando o WP como CMS. Na parte inferior de várias páginas, aparecerão 1, 2 ou 3 "caixas promocionais" - basicamente imagens de botões com links para outras partes do site. Embora apenas três caixas promocionais apareçam em uma página, haverá ~ 30 diferentes para você escolher.
Quando meu cliente cria uma nova página, gostaria que ele pudesse escolher caixas promocionais de algo como uma lista suspensa de todas as possíveis caixas promocionais.
Parece-me que isso deve funcionar assim:
- Crie um tipo de postagem personalizado chamado "caixa promocional". (Embora possa facilmente ser uma tag para postagens regulares.)
- Use uma ferramenta como Modelo de campo personalizado para criar uma lista suspensa no editor de páginas, onde os valores das opções suspensas são gerados dinamicamente a partir da lista de todas as postagens existentes na caixa promocional. ( Esta é a parte que eu não sei fazer. )
- Acesse os metadados resultantes (o número da postagem é realmente tudo o que eu preciso e posso obter todo o resto) no modelo da página.
Com base nas respostas a outras perguntas aqui, dei uma olhada inicial nos campos personalizados WPAlchemy MetaBox, Posts-2-Posts e SLT, mas confesso que a documentação de cada um deles é um pouco mais geek do que eu, então não me aprofundei muito profundamente.
Adendo? Uma das ferramentas acima é a solução certa para mim e só preciso descobrir isso? Estou faltando alguma coisa aqui?
fonte
Respostas:
Como autor do WPAlchemy , sou um pouco tendencioso, mas você basicamente tem um bom modelo de trabalho a seguir, dependendo do caminho que você escolher.
No entanto, se você estiver usando o WPAlchemy, basicamente faria algo como o seguinte (etapa 2):
custom/meta.css
pode conter estilos com os quais você pode estilizar seu formulário ecustom/meta.php
é essencialmente um arquivo HTML com o conteúdo FORM da caixa meta; nesse caso, sua lista suspensa, para gerar sua lista suspensa, você faria uma consulta wp personalizada para obter todas as suas postagens personalizadas tipos. O WPAlchemy possui algumas funções auxiliares especiais para ajudar na criação dos elementos do formulário.Há documentação adicional para ajudá-lo a trabalhar no modelo.
O principal objetivo do WPAlchemy era manter o controle nas mãos do desenvolvedor, desde o estilo (aparência + sensação) até a definição do conteúdo da meta box.
E eu e outros sempre estamos dispostos a ajudar aqueles que comentam e fazem perguntas.
fonte
do_meta_boxes
com alguma lógica condicional ou, alternativamente, paraadd_meta_boxes_{%TYPE%}
..Hehe, você é um novato! Vamos rasgar você em pedaços ...!
j / k :) Oferecemos boas-vindas a todos os novatos aqui, prazer em tê-lo.
Portanto, é a terceira vez que ouvi esse requisito, duas vezes de clientes e não novamente de você (e de seu cliente.) Isso me diz que é uma necessidade razoavelmente comum.
Gostei da sua análise, então decidi codificar uma classe para abordar seu segundo ponto. Liguei
LittlePromoBoxes
porque nunca consigo tirar essa música da minha cabeça, graças a eles . Basicamente, uso a classe para encapsular para evitar possíveis conflitos de nomes com as funções que eu precisaria escrever.Você pode colocar essa classe no
functions.php
arquivo do seu tema ou no arquivo .PHP de um plug-in que possa estar escrevendo (mas não se preocupe, parece muito mais complexo do que é).A primeira função
on_load()
é uma função estática que eu chamo no final da declaração de classe para inicializar os três (3) ganchos necessários (as funções estáticas da fyi são essencialmente funções relacionadas à classe , não à instância) :O
init
gancho para registrar opromo-box
tipo de postagem,O
add_meta_boxes_post
gancho para permitir que você defina o metabox eO
wp_insert_post_data
gancho para permitir que você capture as caixas promocionais selecionadas e salve no banco de dados.Cada um desses ganchos faz referência a outra função estática da classe (essas eram as funções que eu estava encapsulando ao criar a classe).
Vou pular a descrição da
action_init()
função e minhamake_labels()
função auxiliar, assumindo que você saiba como registrar um tipo de postagem com base na sua pergunta.A
action_add_meta_boxes_post()
função registra a metabox usando a função principal do WordPressadd_meta_box()
e eu comentei seus parâmetros para explicar por que passei no que passei para cada um. A função de retorno de chamadathe_little_promo_boxes_metabox()
é obviamente outra função estática da classe e é o que realmente exibe o conteúdo no metabox. Ele usa principalmente a função principal do WordPresswp_dropdown_pages()
para exibir uma lista de caixas promocionais (observe que ele exibirá outros tipos de postagem além da 'página', mas apenas se eles estiverem marcados como estando'hierarchical'=>true
em seu registro de tipo de postagem. Por que apenas hierárquico? Porque é dessa maneira que eles escreveu, é por isso! :)Como mostramos três (3) listas suspensas, precisamos fornecer a cada um um ID exclusivo no HTML (
"promo_box_{$i}"
), mas o mesmo nome entre colchetes ('promo_boxes[]'
), para que o PHP os colete em uma matriz dentro da$_POST
variável (que o WordPress acessa para nós; você verá como em um minuto) . E é claro que precisamos definir o valor selecionado ((empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i])
) se um dos valores já tiver sido selecionado anteriormente.Também usei a função principal do WordPress
get_post_type_object()
para mostrar como obter os rótulos de um tipo de postagem, e também usando a função principal do WordPressget_post_meta()
para recuperar uma matriz de IDs de caixas promocionais usando a chave de campo personalizada '_promo_boxes', que mostrarei que você tem para salvar em seguida (observe que usei um sublinhado anterior no nome'_promo_boxes'
que faz com que o WordPress oculte da interface do usuário do campo personalizado padrão quando o usuário estiver editando a postagem.) .A última função a ser descrita antes de você ver o código é o
filter_wp_insert_post_data()
que recebe os dados de postagem existentes no primeiro parâmetro ($data
) e o conteúdo da$_POST
matriz, graças ao WordPress como o segundo parâmetro ($postarr
). Dentro dessa função, chamamos a função principal do WordPressupdate_post_meta()
e extraímos o array das caixas promocionais ($postarr['promo_boxes']
) para salvar no valor do campo personalizado da chave'_promo_boxes'
da postagem especificada pelo$_POST
array (por exemplo$postarr['ID']
).Dito isto, aqui está o código para a
LittlePromoBoxes
classe:Ainda existem duas (2) funções estáticas ainda não mencionadas:
get_promo_boxes()
eget_promo_box()
; essas são funções auxiliares para ajudá-lo a recuperar as postagenspost_type='promo-box'
pelos seus números ordinais 1..3. Mas para torná-los mais WordPress, como aqui estão duas funções de wrapper para adicionar aofunctions.php
arquivo do seu tema (observe que você pode passar uma postagem como um parâmetro, mas não é necessário, a menos que esteja usando uma postagem diferente da do The Loop ) :Agora você pode chamar uma ou ambas as funções no seu
single.php
arquivo de tema com um código que se parece com isso (esse código pode ter sido escrito em um loop, mas a maioria dos temáticos do WordPress parece gostar de duplicar o código para que possa lê-lo em vez de eliminar a redundância Então, quando em Roma ...):fonte