it-swarm.dev

Chyba odeslání formuláře s get_template_part ()

Narazil jsem na zajímavý problém týkající se get_template_part().

Vytvořil jsem stránku možností motivu (s názvem sitewideSettings.php)

normálně bych to zahrnul do funkcí.

include(TEMPLATEPATH."sitewideSettings.php");

který funguje dobře.

Ale teď se snažím použít get_template_part();

get_template_part('sitewideSettings');

což je také v pořádku, kromě toho, že po kliknutí na tlačítko „aktualizovat“ aktualizujete nastavení, zobrazí se chybová zpráva: „Opravdu chcete toto provést? Zkuste to prosím znovu“.

"Znovu zkuste" odkazy zpět na stránku možností motivu a klepnutím na tlačítko Aktualizace se dostanete zpět k chybové zprávě, která vás vrátí zpět k možnostem motivu a projíždíme kolem a kolem.

Nic jiného se nezměnilo, než použití get_template_part();

S tímto problémem se setká někdo jiný? Jak jste se tam dostal? Jsem si jistý, že je to něco jednoduchého a zřejmého, ale přesně to, co je naprosto unikne mi.

(Není to problém nonce, protože v obou případech je vytvořen nonce)

6
Ashley G

Vím, že říkáte, že to není problém, který není v pořádku. Toto oznámení je výchozí zpráva „Toto nevyhovující políčko“. Nevím přesně, proč je to nezdar, ale to se děje.

Dvakrát zkontroluji, jak jsou vytvořeny a zkontrolovány vaše nonces. Pokud používáte wp_nonce_field(), ujistěte se, že hodnoty akcí i hodnoty argumentů jsou stejné. Také zkontrolujte dvojí kontrolu pravopisu proměnných nebo jakékoli problémy související s rozsahem, které by mohly způsobit nezdar neúspěchu.

UPRAVIT

V návaznosti na vaše naléhání, že se nejedná o problém nesouvislosti (což je to. Problém nonce je způsoben problémem rozsahu), tady je to, co se pravděpodobně stalo. Zahrnuté/požadované soubory jsou prováděny v rozsahu, v jakém jsou zahrnuty. Můj odhad je, že používáte proměnnou k vytvoření akce nonce nebo názvu nonce. Protože get_template_part() obsahuje soubor šablony v rozsahu této funkce, není již prováděn v rozsahu zpětného volání zobrazení stránky administrátora. Buď musíte tyto proměnné globalizovat ve všech umístěních, nebo namísto proměnných musíte použít konstanty.

6
John P Bloch

Nepoužívejte get_template_part () v Admin/Backend. Byl navržen pro použití šablony (zobrazení motivu, viz codex ), takže je určen pro šablony a části šablon v rámci témat:

Funkce Odkaz/získat šablonu

Načtení části šablony do šablony (jiné než záhlaví, postranní panel, zápatí). Díky tomu je pro téma snadné znovu použít části kódu v jednoduchém způsobu přetížení pro dětské motivy.

Funkce ve skutečnosti obsahuje také obecný zdrojový kód, ale to, co zažíváte (jak poukázal John), může souviset s rozsahem. Jelikož neznám váš kód, nemůžu s jistotou říci, zda je to přesná příčina problému, kterému čelíte (variabilní rozsah), takže mám tendenci ho udržet v mé odpovědi jednoduché:

Tato funkce prostě není určena jako náhrada standardního php kódu, například pro napsání admin stránky.

Takže prostě nepoužívejte, pokud pro vaše stránky admin, pokud opravdu víte, co děláte.


Aktualizovat:

Chcete-li načíst soubor php do globálního rozsahu při pohledu do adresáře podřízeného a nadřazeného motivu, můžete použít funkci, která vyhledává soubor pro vás: locate_template () :

Načíst název souboru šablony s nejvyšší prioritou, který existuje.

Vyhledává ve STYLESHEETPATH ​​před TEMPLATEPATH tak, že témata, která zdědí po nadřazeném motivu, mohou pouze přetížit jeden soubor.

Pro daný příklad zahrňte include(TEMPLATEPATH."sitewideSettings.php"); toto může být psáno jak:

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

To vám umožní kontrolovat, kde a jak je soubor obsažen (včetně/_once; vyžadují/_cone) a zabraňuje tomu, abyste měli problém s rozsahem ve vašem příkladu který porušuje mechanismus NONCE.


Zpráva "Zkuste to prosím znovu" je tam, protože wp-admin není schopen ověřit požadavek, konkrétně takzvaný nonce . Mohou na to být dva důvody: Žádost v žádosti není (např. Formulář neposkytuje žádné nebo nepřenáší ani nečte kód administrátora) nebo je neplatný. Nezávislosti vždy představují řetězec akcí, a pokud je tento řetězec rozbit, dostanete zprávu. Ale zpráva vám neřekne, kde je tento řetězec rozbit.

Tyto chybové zprávy v admin nejsou vždy velmi informativní a mohou být dokonce zavádějící (Související: # 14060 ). Chcete-li zjistit, co se zde děje, je nejúčinnější ladit v systému, kde se chyba objeví, což může být zcela specifické, která část řetězce je přerušena.

Přečtěte si prosím kodex o tom, jak vytvořit Admin Pages pro váš Theme nebo Plugin, abyste získali podrobnější informace o nonces, admin stránkách atd. Není možné, aby žádost Admin z nějakého důvodu ověřila zařízení nonce.

4
hakre

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

0
zeo

Jedná se o podrobnější vysvětlení první odpovědi - tj. „Rozsah je problém“

Moje jednoduchá vizualizace get_template_part je takto:

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

Takže pokud máte následující v sitewideSettings.php:

<?php
echo $nonce;
?>

Šablona s:

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

Přeloží (podle PHP) do:

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

Šablona s get_template_part:

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

Přeloží se do:

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

Takže cokoliv v části šablony je zabaleno uvnitř funkce a všechny proměnné, které máte v části šablony, potřebují global.

Tak, aby to fungovalo, potřebujete globalv sitewideSettings.php, který by byl přeložen do:

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

Je těžké odhadnout, je to celý žebříček funkcí. get_template_part() volání locate_template() které volá load_template() které require.

Navrhuji, abyste si je vyzkoušeli zdola nahoru, abyste zjistili, zda je get_template_part() přesně nebo nějaká funkce mezi nimi.

0
Rarst