Gostaria de adicionar programaticamente widgets às minhas duas barras laterais que tenho. Não consegui encontrar nenhuma maneira oficial de fazer isso?
Comecei a procurar no banco de dados. Eu descobri que é a opção 'sidebars_widgets' que coloca widgets nas barras laterais. Ao examinar as opções, os nomes dos widgets têm um número adicionado ao final, como: widget_name-6. De onde vem esse número?
Alguma ideia de como consertar isso?
Respostas:
Quando comecei esta resposta, deveria ser apenas uma pequena nota. Bem, eu falhei. Desculpa! Fique comigo, há um broche escondido no fundo…
Como os widgets do WordPress são armazenados
A lista de widget é armazenado em uma opção chamada
'sidebars_widgets'
. Avar_export()
pode fornecer algo como o seguinte:Ignore
'wp_inactive_widgets'
e'array_version'
. Não precisamos nos preocupar com isso.As outras chaves são identificadoras de barras laterais registradas. Nesse caso, as barras laterais podem ter sido registradas com este código:
Por padrão, as barras laterais estão vazias após o registro. Claro.
Para cada classe de widget registrada, uma opção separada é criada, contendo todas as opções necessárias. A opção é prefixada pela sequência
widget_
. Para obter as opções para todos os widgets RSS ativos, precisamos analisar…Saída possível:
Anote o número 2 . Os argumentos para várias instâncias são todos armazenados nessa opção, ordenada por números.
Para ver quais classes de widgets já são conhecidas pelo WordPress, vá
wp-admin/options.php
e role para baixo até ver algo assim:Sim, dados serializados. Não, você não pode ler esses aqui. Não se preocupe, você não precisa.
Um widget de demonstração
Para ilustrar melhor o funcionamento interno, escrevi um widget de demonstração muito simples:
Observe o construtor:
't5_demo_widget'
é$id_base
o identificador para este widget. Como você pode ver na captura de tela seus argumentos são armazenados na opçãowidget_t5_demo_widget
. Todos os seus widgets personalizados serão tratados assim. Você não precisa adivinhar o nome. E desde que você escreveu seus widgets (provavelmente), você conhece todos os argumentos dos parâmetros da sua classe$instance
.Noções básicas de tema
Primeiro, você precisa registrar algumas barras laterais e o widget personalizado. A ação adequada para isso é fácil de lembrar:
'widgets_init'
. Coloque tudo em um contêiner - uma classe ou uma função. Para simplificar eu vou usar uma função chamadat5_default_widget_demo()
.Todo o código a seguir entra no
functions.php
. A classeT5_Demo_Widget
já deve estar carregada. Eu apenas coloquei no mesmo arquivo ...Até agora, tão simples. Nosso tema agora está pronto para o widget, o widget de demonstração é conhecido. Agora a diversão.
Você realmente não quer destruir as configurações do usuário. Se já houver algum conteúdo nas barras laterais, seu código não deve ser executado sobre ele. É por isso que paramos neste caso.
Ok, assumimos que as barras laterais estão vazias ... precisamos de um contador:
Os widgets são numerados . Esses números são segundos identificadores para o WordPress.
Vamos fazer com que o array mude:
Também precisamos de um contador (mais sobre isso mais tarde):
E aqui está como usamos o contador, os nomes da barra lateral e os argumentos do widget (bem, temos apenas um argumento:)
text
.Observe como o identificador do widget é criado: o
id_base
, um menos-
e o contador. O conteúdo do widget é armazenado em outra variável$demo_widget_content
. Aqui está o contador da chave e os argumentos do widget são armazenados em uma matriz.Aumentamos o contador em um quando terminamos para evitar colisões.
Essa foi fácil. Agora um widget de RSS. Mais campos, mais diversão!
Aqui está algo novo:
update_option()
isso armazenará o argumento do widget RSS em uma opção separada. O WordPress os encontrará automaticamente mais tarde.Não salvamos os argumentos do widget de demonstração porque agora adicionamos uma segunda instância à nossa segunda barra lateral…
… E salve todos os argumentos para
t5_demo_widget
uma corrida. Não há necessidade de atualizar a mesma opção duas vezes.Bem, widgets suficientes para hoje, vamos salvar
sidebars_widgets
também:Agora, o WordPress saberá que existem alguns widgets registrados e onde os argumentos para cada widget são armazenados. Um
var_export()
na sidebar_widgets ficará assim:O código completo novamente:
Se você for
wp-admin/widgets.php
agora, verá três widgets predefinidos:E é isso. Usar …
… Para imprimir os widgets.
Há uma pequena falha: você precisa carregar o front-end duas vezes para o registro inicial. Se alguém puder ajudar aqui, ficarei muito grato.
fonte
widget_t5_demo_widget
refere aquiupdate_option( 'widget_t5_demo_widget', $demo_widget_content );
:?Obrigado por compartilhar sua solução. Eu usei o que foi descrito nesta pergunta para criar um pedaço de código que pode ser usado para inicializar barras laterais com muita facilidade. É muito flexível, você pode criar quantos widgets desejar, sem precisar modificar o código. Basta usar os ganchos de filtro e passar argumentos em uma matriz. Aqui está o código comentado:
Esta é uma função auxiliar que verifica se a barra lateral já possui conteúdo:
Agora precisamos criar uma função que esteja conectada à ação 'sidebar_init'.
E agora a inicialização do widget:
A última ação é criar os widgets em cada barra lateral:
Esta função é usada para acompanhar quantas instâncias de um widget específico já foram definidas:
A última coisa que precisamos fazer é atribuir valores. Utilize estas funções de filtro:
E:
Idealmente, você chamaria initialize_sidebars em uma função de configuração chamada após a ativação do plug-in ou do tema, assim: Ativação do tema:
Ativação do plug-in:
Para resumir o uso desse conglomerado de funções:
crie uma função que inicialize as barras laterais conectadas ao filtro 'alter_initialization_sidebars'.
crie uma função para cada barra lateral que você acabou de adicionar, conectada ao filtro 'alter_initialization_widgets_ $ sidebarname'. Substitua $ sidebarname pelo nome de cada barra lateral criada na etapa 1.
Você também pode simplesmente copiar esse código não comentado no seu arquivo de funções e começar a criar suas funções de filtro imediatamente: Código em Pastie (sem funções de filtro de inicialização)
fonte
Antes de tudo, obrigado a @toscho pela resposta detalhada.
Este é um exemplo simples para quem está procurando uma solução simples e opções de widget padrão:
Nota 1: Você pode
sidebar-id
acessar o menu de widgets e inspecionar a barra lateral desejada. O primeiro<div id="widgets-holder-wrap">
's<div>
criança temsidebar-id
.Nota 2: Você pode
widget_name
acessar o menu de widgets e inspecionar o widget desejado. Você verá algo como<div id="widget-6_widget_name-__i__" class="widget ui-draggable">
.Eu desejo que ajude.
fonte
É assim que se faz:
(AVISO, isso poderá REMOVER todos os widgets anteriores, se você não colocar os widgets originais de volta na
widgets
matriz.)O número-pode ser usado se você desejar adicionar opções ao widget posteriormente com algo como isto:
fonte
$widgets = get_option( 'sidebars_widgets' );