it-swarm-pt.tech

Formulário enviando erro com get_template_part ()

Eu me deparei com um problema interessante em relação à get_template_part().

Eu criei uma página de opções de tema (chamada sitewideSettings.php)

normalmente eu incluiria isso em functions.php da seguinte forma:

include(TEMPLATEPATH."sitewideSettings.php");

que funciona bem.

Mas agora estou tentando usar get_template_part();

get_template_part('sitewideSettings');

que também está funcionando bem, exceto que ao clicar em "atualizar" para atualizar as configurações, recebo uma mensagem de erro: "Tem certeza de que deseja fazer isso? Por favor, tente novamente".

"Por favor, tente novamente" links de volta para a página de opções de tema e clicando em atualização leva de volta para a mensagem de erro que leva de volta para as opções de tema e volta e voltamos.

Nada mudou além do uso de get_template_part();

Alguém mais se deparou com este problema? Como você conseguiu isso? Tenho certeza de que é algo simples e óbvio, mas exatamente o que é totalmente me escapa.

(Não é um problema nonce como um nonce é criado em ambas as instâncias)

6
Ashley G

Eu sei que você diz que não é um problema estranho, mas claramente é. Esse aviso é a mensagem padrão "Este nonce não deu entrada". Eu não sei exatamente porque o nonce está falhando, mas é isso que está acontecendo.

Eu checaria novamente como seus nobs são criados e verificados. Se você estiver usando wp_nonce_field(), certifique-se de que os valores de ação e os valores dos argumentos sejam os mesmos. Além disso, verifique a ortografia das variáveis ​​ou quaisquer problemas relacionados ao escopo que possam estar causando falha no nonce.

EDITAR

Continuando a sua insistência de que não é um problema nonce (o que é. A questão do nonce é causada por uma questão de escopo), aqui está o que provavelmente aconteceu. Os arquivos incluídos/requeridos são executados no escopo em que estão incluídos. Meu palpite é que você está usando uma variável para construir a ação nonce ou o nome nonce. Como get_template_part() inclui o arquivo de modelo no escopo dessa função, ele não está mais sendo executado no escopo do retorno de chamada de exibição da sua página de administração. Você precisa globalizar essas variáveis ​​em todos os locais ou precisa usar constantes em vez de variáveis.

6
John P Bloch

Por favor, não use get_template_part () no Admin/Backend. Ele foi projetado para uso de modelo (exibindo o tema, por favor, veja codex ), então este destina-se a ser usado para modelos e partes de modelo dentro de temas:

Função Referência/get template part

Carregue uma parte de modelo em um modelo (diferente de cabeçalho, barra lateral, rodapé). Torna fácil para um tema reutilizar seções de código de maneira fácil de sobrecarregar para temas filhos.

A função realmente inclui código-fonte geral, mas o que você experimenta (como John apontou) pode estar relacionado ao escopo. Como eu não sei o seu código, não posso dizer com certeza, se essa é a causa exata do problema que você está enfrentando (escopo variável), então eu costumo manter isso simples na minha resposta:

A função não é apenas desgined para substituir como código php padrão incluir, por exemplo, para escrever uma página de administração.

Então, só não use isso para a sua página de administração, a menos que você realmente saiba o que está fazendo.


Update:

Se você quiser carregar um arquivo php no escopo global enquanto procura no diretório de tema filho e pai, você pode fazer uso de uma função que faz a busca pelo arquivo para você: locate_template () :

Recupere o nome do arquivo de modelo de maior prioridade que existe.

Procura no STYLESHEETPATH ​​antes de TEMPLATEPATH para que os temas que herdam de um tema pai possam sobrecarregar apenas um arquivo.

Para o seu exemplo, inclua include(TEMPLATEPATH."sitewideSettings.php"); isso pode ser escrito como:

include(locate_template('sitewideSettings.php'));

Isso permite que você controle onde e como o arquivo está incluído (include/_once; require/_cone) e evita que você tenha o problema no escopo no seu exemplo que quebra o mecanismo NONCE.


A mensagem "Por favor, tente novamente" está lá porque o wp-admin não pode verificar o pedido, mais especificamente o chamado nonce . Pode haver dois motivos para isso: Não há nenhum na solicitação (por exemplo, o formulário não fornece nenhum ou não é transferido ou lido pelo código administrativo) ou o nonce é inválido. Nonces sempre representam uma cadeia de ações, e se essa cadeia estiver quebrada, você receberá essa mensagem. Mas a mensagem não diz onde essa cadeia está quebrada.

Essas mensagens de erro no admin nem sempre são muito informativas e podem até mesmo enganar (Relacionadas: # 14060 ). Para descobrir o que acontece aqui, é mais eficaz depurar isso no sistema em que o erro aparece, pois pode ser bem específico qual parte da cadeia está quebrada.

Por favor, veja o codex sobre como criar páginas Admin para o seu tema ou Plugin para informações mais detalhadas sobre lojas, páginas de administração, etc. Não é possível para a solicitação do administrador validar o nonce por algum motivo.

4
hakre

locate_template( array( 'sitewideSettings.php' ), true )?

0
zeo

Esta é uma explicação mais detalhada da primeira resposta - ou seja, "o escopo é o seu problema"

Minha simples visualização de get_template_part é assim:

function get_template_part($slug) {
  require("$slug.php");
}

Então, se você tem o seguinte em sitewideSettings.php:

<?php
echo $nonce;
?>

Modelo com incluir:

<?php
$nonce = 'xxx';
include('sitewideSettings.php');
?>

É traduzido (por PHP) para:

<?php
$nonce = 'xxx';
echo $nonce;
?>

Template com get_template_part:

<?php
$nonce = 'xxx';
get_template_part('sitewideSettings');
?>

É traduzido para:

<?php
$nonce = 'xxx';
get_template_part(
  echo $nonce;
);
?>

Então, agora qualquer coisa na parte do template é envolvida dentro de uma função e quaisquer variáveis ​​que você tenha na sua parte de template precisam de uma variável global nelas.

Assim, para fazê-lo funcionar, você precisa de um globalno sitewideSettings.php, que seria traduzido em:

<?php
$nonce = 'xxx';
get_template_part(
  global $nonce;
  echo $nonce;
);
?>
0
icc97

Difícil de adivinhar, é toda a escada de funções. get_template_part() chama locate_template() que chama load_template() que faz require.

Eu sugiro que você tente estes de baixo para cima para determinar se é get_template_part() exatamente ou alguma função no meio.

0
Rarst