web-dev-qa-db-ja.com

カスタムプラグインページのアクションをどのように処理するのが一番良いですか?

私はいつも同じ煩わしさに遭遇しています、それで私はそこに何かアイデアや経験があるかどうか見るだろうと思った….

私はそれ自身の管理者ページを使うプラグインを作成しました。する必要があります。 WP_List_Table()を整理したので、それは素晴らしいと言わなければなりません...しかし....

カスタムプラグインページは、プラグインディレクトリから直接ロードしたくない限り、常にadmin.php?page=...としてロードされます。そのページから「アクション」を実行した場合は、どういうわけかそれを処理してから、アクションパラメータなしでページにリダイレクトする必要があります。私が実際にGETまたはPOSTを実行しても関係ありません。

すべての内部ページで[WPは同じページでこれを行い、アクションがあるかどうかをチェックし、処理した場合はアクションなしで自分自身にリダイレクトします。これらのページではadmin-headerがまだロードされていないので、これは可能です。

あなたがあなた自身のページでそれをやろうとするなら、しかし、管理者インターフェースの半分がすでにブラウザに送られているので、リダイレクトはもう不可能です。明らかに、解決策は別のページに直接POST/GETし、その上にWPフレームワークをロードし、処理を行ってから元のページにリダイレクトすることです...しかし...これは少し面倒です、なぜなら...私の元のページはコールバックを介してロードされるので、それは私のクラスのメソッド内で実行されるからです。美しいです。

私が別のページをロードする場合、私は手動でwp-load.phpをインクルードしなければならず、これは厄介なことです。そして私の特定のケースでは特に私を悩ませています。外側から。

それで、この長い話の後で...な​​しでコールバックを介して別のページをロードするための優れた解決策を思いついたのですか?

(私は回避策を知っています...私はactionパラメータをチェックし、処理とリダイレクトをするload-....に関数をフックすることができます。しかし私はもっと良い方法があるかどうか疑問に思います。)

ありがとう。

21
wyrfel

経験則として、ほとんどのアクションにPOSTリクエストを使用して、それらが誤って 実行されないようにします 。ただし、POSTリクエストの後に通常のページにリダイレクトして、ユーザーがページを更新したときに実行が重複しないようにすることもお勧めします。

そのため、フローは次のようになります。

  1. に送信するPOSTフォームを含むプラグインページ
  2. にリダイレクトするリクエストを処理するページ
  3. アクションの結果を表示するプラグインページ

中央のページはプラグインページである必要はありません。これは、3年前に含まれていた "generic POST handler" を使用できることを意味します 'admin_action_' . $_REQUEST['action']admin.phpフック

ユーザーの例は Akismetプラグイン です。確実に使用したい場合は、 admin.phpを含む別のページではなく、admin.phpに直接送信する必要があります _。

使用方法の非常に基本的な例を次に示します。

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

ユーザーが送信したページのアクションURLにnoheader = trueを追加するだけで、少し違った方法でこれに取り組みました。

それから私のハンドラはアクション(すなわち、通常追加、更新、削除)を実行し、次のページアクションへのwp_redirect()で終了します(例:追加ページ - >編集ページ、削除ページ - >リストページ、編集ページ - >編集ページ) )また、URLにメッセージを渡して、更新成功または失敗などのステータスを表示できるようにします。

このアプローチでは、同じクラスで同じ管理スラッグを使って、リスト、追加、編集、削除、一括削除などのすべてのアクションを保持するので、保守および理解が非常に簡単です。

3

別の方法としては、隠し入力フィールドをフォームに追加するだけです。

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

このように、WordPressは自動的にリダイレクトを処理するようです。

0