it-swarm.com.de

Was ist der empfohlene Weg, um Administrationsformulare für Plugins zu erstellen?

Ich habe die folgende Technik zum Hinzufügen von PHP-Skripten zu meinem Plug-In für die Bearbeitung benutzerdefinierter Formulare in einem WordPress-Plug-In gesehen und verwendet.

aus dem Quizzin-Plugin:

$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;

Beispielsweise wird die 'quiz_action.php' später als Ziel für ein Administrationsformular verwendet (diese Formulare werden nur in wp-admin verwendet).

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

UPDATE: Diese Methode wird hier beschrieben - Admin-Konfigurationsbildschirm ohne Menü

Der letzte Kommentar eines Wordpress-Core-Entwicklers scheint davon abzuhalten:

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

Was ist hier also die beste Vorgehensweise? Sollten Administrationsformulare unter wp-admin/admin.php? Action = foo oder wp-admin/edit.php? Action = bar veröffentlicht werden. Wie registriert man diese Aktionen? Ist das irgendwo dokumentiert? Aus Gründen der Übersichtlichkeit sollten diese Dateien nicht über ein Admin-Menü verknüpft werden.

Ich benutze Wordpress 3.0.4

Vielen Dank!

3
codecowboy

Grundsätzlich scheint es zwei Möglichkeiten zu geben, dies zu tun:

1) Der in der ursprünglichen Frage beschriebene $_registered_pages-Weg. Dies scheint etwas ungewöhnlich zu sein und könnte jemanden verwirren, der sich Ihren Code ansieht.

2) Senden Sie Ihr Formular an eine Administrator-URL wie admin_url('admin.php?page=show_form'), wobei show_form() ein registrierter Menüpunkt/eine registrierte Funktion ist. In show_form() können Sie einschalten, ob ein Formular gesendet wurde oder nicht. Wenn dies der Fall ist, können Sie eine andere PHP-Datei unter bestimmten Bedingungen einbinden, z.

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

        require_once('name_of_your_processing_script.php');

    } else {
        //do something else. 
    }
}

Oder fügen Sie einfach die Datei hinzu und führen Sie eine Verarbeitung/Umschaltung durch (wahrscheinlich sauberer).

Wenn Sie versuchen, eine Datei zu verwenden, die Sie als Beitragsaktion des Formulars erstellt haben, wird eine Fehlermeldung angezeigt. Wie in den obigen Kommentaren erwähnt, sollten Sie verhindern, dass Ihre Dateien direkt aufgerufen werden, und Sie sollten sich mit Nonces vor CSRF-Angriffen schützen.

Entschuldigung für den langen Kommentarthread. Wäre dankbar, wenn die Leute bestätigen könnten, dass dies das ist, was sie meinten.

3
codecowboy

Ich persönlich füge einfach einen Menülink hinzu und in der Funktion dafür wird das Formular behandelt. Mit $ _SERVER ['REQUEST_URI'] als Aktion. Beispiel unten.

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

Mein Ansatz in den letzten 12 Monaten war es, jede Funktion aufzurufen, die $ _POST- oder $ _GET-Anforderungen verarbeitet. In jeder Funktion werden einige Werte, manchmal mehr, überprüft, um festzustellen, ob diese Funktion anwendbar ist, d. H. Ein Formularname und ein bestimmter Wert aus dem Formular oder der URL, auf die die Datenüberprüfung angewendet werden kann.

Ich setze alle $ _POST und $ _GET durch eine einzige Funktion, die nonce überprüft, so dass die nonce-Funktion nicht in jeder Funktion aufgerufen wird. Diese process_POST_GET () - Funktion enthält dann () - Formularverarbeitungsfunktionen.

add_action('admin_init,process_POST_GET');

Es funktioniert einwandfrei und hat keine Leistungseinbußen. Wir sprechen einfach über 100 x if (isset ()) und eine sehr einfache Möglichkeit, alles in Ordnung zu halten. Ich habe eine add_action () für jede Funktion in Betracht gezogen und festgestellt, dass dies mehr Arbeit für Wordpress bedeutet als mein Ansatz, da immer noch jede Funktion aufgerufen werden muss.

Das folgende Beispiel enthält viel "wpecus_", da ich ursprünglich keine Klassen verwendet habe. Sonst müssten wir nicht alles voranstellen.

eval ()

Heute überlege ich, eval () zu verwenden, um die Funktion mit dem form_name aufzurufen.

/**
* $_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-Kunden Ich erwarte, dass WP E-Kunden bis 2015 ungefähr 200 Administratorformulare haben. Es wird eine große Sammlung von "Tools" geben, mit denen Administratoren alle Aufgaben ausführen können Aufgaben unter Wordpress und phpBB über den Wordpress-Administrator.

Debug var_dump () Mein Ansatz, alle Anfragen über eine einzige Funktion zu stellen, schafft einen guten Punkt, um einen Dump zu machen. Möglicherweise möchten Sie dies ohne die Überschriften tun. Meine Funktion wpecus_var_dump () stellt auch sicher, dass ein Administrator angemeldet ist, wichtige Sicherheit. Ein weiterer zu berücksichtigender Punkt ist, dass $ wpecus_debug_mode nur auf true gesetzt ist, wenn sich das Plugin im Entwicklungsblog befindet. Es überprüft die Domäne und den Installationspfad in der Hauptdatei des Plugins. Dies bedeutet, dass ich schnell eine Kopie meiner Plugins verteilen kann und das Debuggen automatisch deaktiviert wird. Das versehentliche Einschalten ist fatal. Wenn Sie also eine Prozedur zum Debuggen von Wordpress-Anforderungen mit $ _POST und $ _GET einrichten möchten, verwenden Sie nicht nur var_dump (). Sie möchten, dass die Dumps verschwinden, wenn niemand auf den Bildschirm schaut.

0
Ryan Bayne