创建插件管理表单的推荐方式是什么?

时间:2011-01-26 作者:codecowboy

我已经看到并一直在使用以下技术将php脚本添加到我的插件中,以便在wordpress插件中处理自定义表单。

来自quizzin插件:

$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;
例如,“quick\\u操作”。php’稍后用作管理表单的目标(这些表单仅在wp admin中使用)

  <form name="post" action="<?php echo $GLOBALS[\'my_plugin_folder\'] ?>/quiz_action.php" method="post" id="post">
UPDATE: 此处讨论此方法-Admin config screen without menu

Wordpress核心开发人员在下面的最后评论似乎不鼓励这样做:

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

那么,这里的最佳实践是什么?管理表格是否应过账给wp admin/admin。php?操作=foo或wp管理/编辑。php?动作=bar。如何注册这些操作?是否有记录在案?要明确的是,这些文件不应该从管理菜单链接。

我正在使用Wordpress 3.0.4

谢谢

3 个回复
最合适的回答,由SO网友:codecowboy 整理而成

基本上,有两种方法可以做到这一点:

1) The$_registered_pages 原始问题中的详细方式。这似乎有点不标准,可能会让查看您的代码的人感到困惑。

2) 将表单发布到管理员url,如admin_url(\'admin.php?page=show_form\')哪里show_form() 是已注册的菜单项/功能。在…内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. 
    }
}
或者只包含文件并在其中进行任何处理/切换(可能更干净)。

如果尝试将创建的文件用作表单的post操作,则会出现错误。如上所述,您应该防止文件被直接调用,并使用nonce保护和防范CSRF攻击。

抱歉评论帖子太长。如果人们能证实这是他们的意思,我将不胜感激。

SO网友:Backie

我个人只是添加了一个菜单链接,并在函数中为其处理表单。将$\\u SERVER[\'REQUEST\\u 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
        }
}

SO网友:Ryan Bayne

在过去的12个月里,我的方法是调用每个处理$\\u POST或$\\u GET请求的函数。在每个函数中,检查两个值,有时检查更多值,以确定该函数是否适用,即表单名称和表单或URL中的特定值,数据验证也可以应用于该值。

我将所有$\\u POST和$\\u GET放在一个检查nonce的函数中,这样就不会在每个函数中调用nonce函数。然后,该process\\u POST\\u GET()函数包含()表单处理函数。

add_action(\'admin_init,process_POST_GET\');
它工作正常,没有性能缺陷。我们只是在讨论100 x if(isset())和一种保持一切整洁的非常简单的方法。我考虑了为每个函数添加一个add\\u action(),并意识到这比我的方法为Wordpress添加了更多的工作,因为它仍然需要调用每个函数。

下面的示例有很多“wpecus\\u0”,因为我最初没有使用类。否则,我们不需要在所有内容前面加前缀。

eval()

今天,我正在考虑使用eval()调用使用form\\u名称的函数。

/**
* $_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我预计到2015年,WP电子客户将拥有大约200份管理表格。将有大量的“工具”供管理员通过Wordpress管理员在Wordpress和phpBB上执行各种任务。

Debug var_dump()我将所有请求放在一个函数中的方法可以很好地进行转储。您可能希望在没有标题的情况下执行此操作。我的wpecus\\u var\\u dump()函数还可以确保管理员登录,这是非常重要的安全性。另一点需要考虑的是,只有当插件位于开发博客上时,$wpecus\\u debug\\u mode才设置为true。它检查插件主文件中的域和安装路径。这意味着我可以快速分发插件的副本,并且调试会自动关闭。意外地将其打开是致命的,因此,如果要设置调试Wordpress$\\u POST和$\\u GET请求的过程,请不要仅使用var\\u dump()。您希望当您的no是查看屏幕的人时,转储消失。

结束

相关推荐

找不到cForms操作处理程序页

我在任何地方都找不到cforms插件的操作处理程序页面。我想使用post值在cforms插件的action handler页面中编写一些函数。