it-swarm-eu.dev

Jak nejlépe zpracovat vlastní akce na stránce s pluginem?

Neustále se dostávám do stejné mrzutosti, takže jsem si myslel, že uvidím, jestli tam jsou nějaké nápady nebo zkušenosti ...

Vytvořil jsem plugin, který používá vlastní stránku administrátora. Musí. Teď, když jsem vyřešil WP_List_Table () věci, musím říct, že je to skvělé ... ale ....

Vlastní stránky pluginů se vždy načítají jako admin.php?page=..., pokud je nechci nahrát přímo z adresáře pluginů, což ne. Teď, když jsem 'akce' z této stránky, musím zpracovat, že nějak a pak přesměrovat zpět na stránku bez akce parametr. Bez ohledu na to, jestli dělám GET nebo POST, opravdu.

Na všech svých interních stránkách WP to dělá na stejné stránce, kontroluje, zda existuje akce, zda ji zpracovává a pak přesměruje na sebe bez akce. To je možné, protože na těchto stránkách dosud nebyl soubor admin-header načten.

Pokud to zkusíte udělat na své vlastní stránce, polovina administrátorského rozhraní již byla odeslána do prohlížeče, takže přesměrování již není možné. Je zřejmé, že řešením je POST/GET přímo na jinou stránku, načíst rámec WP, provést zpracování a pak přesměrovat zpět na původní stránku ... ale ... to je trochu nepříjemné, protože ... moje původní stránka je načtena přes zpětné volání, takže běží v rámci metody mé třídy. To je nádherné.

Pokud jsem načíst samostatnou stránku, musím ručně zahrnout wp-load.php a jsem mimo svou třídu, což je nepříjemné, a v mém konkrétním případě mě obzvláště chyby, protože jsem jen instanciating moje třídy plugin anonymně tak, že nikdo nemůže přístup zvenčí.

Takže po tomto dlouhém příběhu ... přišel někdo s dobrým řešením pro načtení další stránky přes zpětné volání bez s tím, že celé administrační rozhraní je již nastaveno?

(Vím o řešení ... Mohu zavést funkci do load-...., která kontroluje akční parametr a provádí zpracování a přesměrování. Ale přemýšlím, jestli je lepší způsob.)

Dík.

21
wyrfel

Jako pravidlo, měli byste použít POST požadavek na většinu akcí, abyste se ujistili, že nejsou provedeny náhodou . Ale je to také dobrá praxe přesměrovat na normální stránku po POST požadavku, aby se zabránilo duplicitnímu provedení, když uživatel stránku aktualizuje.

Takže tok je takto:

  1. Stránka pluginu s formulářem POST, který je odeslán
  2. Stránka, která zpracovává požadavek, na který se přesměruje
  3. Stránka pluginu, která zobrazuje výsledek akce

Střední stránka nemusí být vaše stránka pluginu. To znamená, že můžete použít "obecný POST handler" , který byl zařazen před třemi lety, 'admin_action_' . $_REQUEST['action'] HOOK V admin.php .

Příkladem uživatele je plugin Akismet . Pokud ho chcete použít spolehlivě, musíte předat soubor admin.php přímo , nikoli jiné stránce, která obsahuje admin.php.

Zde je velmi základní příklad použití:

add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
    // Do your stuff here

    wp_redirect( $_SERVER['HTTP_REFERER'] );
    exit();
}

add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
    add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}

function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
    <input type="hidden" name="action" value="wpse10500" />
    <input type="submit" value="Do it!" />
</form>
<?php
}
28
Jan Fabry

Přistoupil jsem k tomu trochu jinak, jednoduše přidáním noheader = true k url akce na stránce, kde uživatel odešle akci.

Moje handler pak provede akci (tj. Typicky doplnění, aktualizaci nebo smazání) a pak skončí s akcí wp_redirect () na další stránku akce (např. Přidat stránku -> upravit stránku, odstranit stránku -> seznam stránek, upravit stránku -> upravit stránku ). Na adresu URL také předávám zprávu, abych mohl úspěšně zobrazit stav, jako je aktualizace nebo selhal.

Tento přístup udržuje všechny akce: seznam, přidávat, upravovat, mazat, hromadně mazat, atd. Ve stejné třídě a se stejným administrátorem, takže je snadno udržovatelný a pochopitelný.

3
Russell Jamieson

Další odlišný přístup je pouze přidání skrytého vstupního pole do formuláře:

<input type="hidden" name="page" value="your-page-slug" />

Tímto způsobem se zdá, že WordPress zvládá přesměrování automaticky.

0
simonthesorcerer