web-dev-qa-db-ja.com

プラグイン管理フォームを作成するための推奨方法は何ですか?

私はWordpressプラグインのカスタムフォームを扱うために私のプラグインにphpスクリプトを追加するために次のテクニックを見て、使っています。

クイズプラグインから:

$code_pages = array('quiz_form.php','quiz_action.php', 'question_form.php', 'question.php');
        foreach($code_pages as $code_page) {
            $hookname = get_plugin_page_hookname("quizzin/$code_page", '' );
            $_registered_pages[$hookname] = true;

たとえば、 'quiz_action.php'は後で管理フォームのターゲットとして使用されます(これらのフォームはwp-adminでのみ使用されます)。

  <form name="post" action="<?php echo $GLOBALS['my_plugin_folder'] ?>/quiz_action.php" method="post" id="post">

更新:この方法はここで説明されています - メニューなしの管理者設定画面

Wordpressのコア開発者による以下の最後のコメントはこれを推奨しないようです。

http://wordpress.org/support/topic/how-can-i-execute-php-scripts-in-my-plugin-folder

それではここでベストプラクティスは何ですか?管理フォームをwp-admin/admin.php?action = fooまたはwp-admin/edit.php?action = barに投稿する必要があります。どのようにこれらの行動を登録するのですか?これはどこかに文書化されていますか?明確にするために、これらのファイルは管理者メニューからリンクされるべきではありません。

Wordpress 3.0.4を使用しています

ありがとうございます。

3
codecowboy

基本的に、これを行うには2つの方法があるようです。

1)元の質問で詳述されている$_registered_pagesの方法。これは少し標準的ではないように見え、あなたのコードを見ている誰かを混乱させるかもしれません。

2)admin_url('admin.php?page=show_form')が登録済みのメニュー項目/機能であるshow_form()のような管理URLにあなたのフォームを投稿してください。 show_form()内では、フォームが送信されたかどうかを切り替えることができます。もしあれば、条件付きで他のphpファイルを含めることができます。

function show_form()
{
    if ( $_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['submit'])) {

        require_once('name_of_your_processing_script.php');

    } else {
        //do something else. 
    }
}

あるいは単にファイルをインクルードしてそこで処理や切り替えをしてください(おそらくよりクリーン)。

作成したファイルをフォームの投稿アクションとして使用しようとすると、エラーが発生します。上記のコメントで述べたように、あなたはあなたのファイルが直接呼ばれるのを防ぎ、ナンスを使ったCSRF攻撃から保護し、守るべきです。

長いコメントスレッドをお詫び申し上げます。人々がこれが彼らが意味するものであることを確認できればありがたいです。

3
codecowboy

私は個人的にメニューリンクを追加し、それがフォームを処理するための関数を追加しました。アクションとして$ _SERVER ['REQUEST_URI']を使用します。以下の例.

add_action("admin_menu", "menu" );
function menu(){
    add_menu_page('Test form', 'Test form', 'manage_options', 'show_form' );
}
function show_form(){
    if ( $_SERVER["REQUEST_METHOD"] == "POST" ){
            print "do stuff";
    } else {
         ?><form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>"><input type="submit" /></form><?php
        }
}
4
Backie

過去12か月間の私のアプローチは、$ _ POSTまたは$ _ GET要求を処理するすべての関数を呼び出すことでした。すべての関数内で、その関数が適用可能なものかどうか、つまりデータ検証も適用できるフォームまたはURLからの特定の値かどうかを判断するために、2つ以上の値がチェックされます。

$ _POSTと$ _GETをすべてnonceをチェックする単一の関数に入れて、nonce関数がすべての関数内で呼び出されないようにします。そのprocess_POST_GET()関数は()フォーム処理関数を含みます。

add_action('admin_init,process_POST_GET');

正常に動作し、パフォーマンス上の問題はありません。 100 x if(isset())と、それをすべてきれいに保つための非常に簡単な方法について話しています。私はすべての関数についてadd_action()を検討し、それがまだすべての関数を呼び出す必要があるので、これが私のアプローチよりもWordpressのためのより多くの仕事を追加することを認識しました。

私はもともとクラスを使っていなかったので、以下の例は "wpecus_"がたくさんあります。そうでなければ、すべてに接頭辞を付ける必要はありません。

eval()

今日は、form_nameを使って関数を呼び出すためにeval()を使うことを考えています。

/**
* $_POST and $_GET request processing procedure.
* 
* Checks nonce from any form or URL, then includes functions that processing submission, then includes the
* file that determines which function to use to process the submission.
*
* @package WP e-Customers
* @since 0.0.1  
*/
public function process_POST_GET(){       

    // form submission
    if(isset($_POST['wpecus_post_processing_required']) && $_POST['wpecus_post_processing_required'] == true){        
        if(isset($_POST['wpecus_admin_referer'])){        
            // a few forms have the wpecus_admin_referer where the default hidden values are not in use
            check_admin_referer( $_POST['wpecus_admin_referer'] );         
        }else{                                       
            // 99% of forms will use this method
            check_admin_referer( $_POST['wpecus_hidden_panel_name'] );
        }        
    }

    // url submission
    if(isset($_GET['wpecusprocess']) && isset($_GET['nonceaction'])){           
        check_admin_referer( $_GET['nonceaction'] );        
    }     

    // arriving here means check_admin_referer() security is positive       
    global $wpecus_debug_mode,$cont,$wpecus_is_free;

    // if $wpecus_debug_mode set to true or 1 on wpecustomers.php we dump $_POST
    if($wpecus_debug_mode){
        echo '<h1>$_POST</h1>';
        wpecus_var_dump($_POST);           
        echo '<h1>$_GET</h1>';
        wpecus_var_dump($_GET);    
    }

    // include form processing functions
    require_once(WTG_WPECUS_PATH . 'processing/wpecus_form_two.php');   
    require_once(WTG_WPECUS_PATH . 'processing/wpecus_form_one.php');

    eval('wpecus_postget_' . $_POST['wpecus_form_name']);                        

}

WP e-Customers _ WP e-Customersには、2015年までに約200の管理フォームがあると思います。管理者がすべてを実行するための多数の "ツール"があります。 Wordpressの管理者を通じてWordpressとphpBBのタスクの種類。

Debug var_dump() 単一の関数を介してすべての要求を処理するという私のアプローチは、ダンプを実行するための良いポイントを作成します。あなたはヘッダなしでこれをしたいかもしれません。私のwpecus_var_dump()関数は、管理者がログインしていることを保証します。これは重要なセキュリティです。考慮すべきもう1つのポイントは、プラグインが開発ブログにある場合にのみ$ wpecus_debug_modeがtrueに設定されることです。プラグインメインファイルのドメインとインストールパスをチェックします。これは私が自分のプラグインのコピーを素早く配布することができ、デバッグが自動的にオフになることを意味します。誤ってそのままにしておくことは致命的であるため、Wordpressの$ _POSTおよび$ _GET要求をデバッグするための手順を設定したい場合は、単にvar_dump()を使用しないでください。あなたは誰もが画面を見ているときにダンプが消えるようにしたいです。

0
Ryan Bayne