Die richtige Methode zum Erstellen einer benutzerdefinierten statischen Seite

Ich bin ziemlich neu in WordPress. Ich erstelle eine Seite mit einem Formular. Es funktioniert, aber so neu zu sein, ich frage mich, ob ich es auf die beste Weise mache. Ich werde Twenty Twelve als Beispiel verwenden.

  1. kopiere ‘page.php’ von Twenty Twelve (wir verwenden ‘xxx.php’ als neuen Template-Seitennamen);
  2. arbeite in xxx.php von hier aus, füge ‘// Template Name: Meine Vorlage’ oben hinzu;
  3. ‘require’ meine classndatei (die das Zeichnen des Formulars, die Verarbeitung von $ _POST, usw.) und das Erstellen einer Instanz übernimmt;
  4. kopiere den Inhalt von ‘content-page.php’ in ‘xxx.php’ und überschreibe, wo ‘get_template_part (‘ content ‘,’ page ‘) steht;’
  5. direkt unter ‘the_content ()’, rufe meine classnmethode auf, die entweder das Formular zeichnet oder die Ausgabe nach der Verarbeitung von $ _POST anzeigt;
  6. Erstelle eine neue Seite im Admin mit “Meine Vorlage”

Also, ist das der “normale” Weg, um das zu tun, was ich versuche, oder gibt es einen besseren Weg? Wo sollte ich auch die classndatei und verwandte css / js speichern? Wenn ich sie im Design-Verzeichnis ablege, muss ich daran denken, sie zu verschieben, bevor ich das Design lösche.

Solutions Collecting From Web of "Die richtige Methode zum Erstellen einer benutzerdefinierten statischen Seite"

Wie bereits erwähnt, funktioniert Ihr Weg, aber es gibt einige Möglichkeiten, wie Sie das Formular von der Vorlage entkoppeln können, um mehr Flexibilität zu ermöglichen.

Die Shortcode-API ermöglicht es Ihnen, einen Shortcode für Ihr Formular zu erstellen. Sie können also einfach [my_form] in den Inhalt der Seite [my_form] Innerhalb der function, die Ihren Shortcode verarbeitet, können Sie das Formular rendern und die erforderlichen Skripts in die Warteschlange stellen. Für das CSS können Sie eine Aktion haken, bevor die Vorlage gerendert wird, um einige Regex auf dem Inhalt der angeforderten Seite auszuführen, um zu sehen, ob sie den Shortcode enthält, sodass Sie das Stylesheet nur bei Bedarf in die Warteschlange stellen.

Im Allgemeinen sollten Sie sich mit Filtern und Aktionen vertraut machen, diese sind die Grundlage für fast alles, was Sie in WordPress tun möchten. Um beispielsweise Ihre Formulardaten zu verarbeiten, könnten Sie init eine Aktion hinzufügen, um zu überprüfen, ob Ihre POST-Variablen vorhanden sind und welche Verarbeitung, databaseschreibvorgänge, Umleitung usw. Sie durchführen und Ihr Formular unabhängig von der Vorlage oder Seite, auf der es gerendert wird, oder Sie können the_content filtern , um die aktuell angeforderte Seite zu überprüfen und Ihr Formular auf diese Weise zu rendern.

Das ist ein akzeptabler Weg, wenn es funktioniert, funktioniert es richtig :).

Aber wenn Sie möchten, dass die Dinge nicht von der Vorlage abhängig sind. Um zu antworten “wo”, um es zu setzen. Sie können besser ein Plugin für Ihr Formular erstellen. Auf diese Weise können Sie Ihr Formular zu jeder gewünschten Seite hinzufügen. Es hängt also von Ihren Bedürfnissen ab.

Wenn Sie ein vollständig angepasstes Thema erstellen, nur für sich selbst, glaube ich, dass es am besten ist, es so zu halten, wie Sie es am angenehmsten finden. Oder ist das freigeistig? 🙂

Wie gesagt, das ist ein guter Weg, Dinge zu tun – aber es bindet deine Seite mit dem Formular an das Thema. Es gibt einige anständige Plugins, die ein Formular auf einer Seite ziemlich einfach bereitstellen.

Ich weiß, dass WordPress Jetpack (kostenlos) ein einfaches Kontaktformular hat, das normalerweise die Aufgabe erledigt.

Es gibt auch Gravity Forms (bezahlt), die fast jede mögliche function unter der Sonne bietet.

Was das Styling betrifft, ist es kein Problem, die Formstile in das Thema zu integrieren, da Styling ein Thema ist. Denken Sie daran, dass Sie diese Anpassung vorgenommen haben, und wenn Sie das Thema wechseln, müssen Sie Ihrem Stylesheet neue Formularstile hinzufügen (und werden es wahrscheinlich sowieso tun).

Ich werde ein paar Gedanken zu den exzellenten, vorhandenen Antworten hinzufügen:

  1. Ich schlage vor , Ihre Template-Datei mit der Konvention template-foobar.php . Dies erleichtert die Unterscheidung von anderen Vorlagen- und Vorlagen-Teildateien.
  2. Sofern Sie nicht den Post-Editor für Ihre Vorlagendatei verwenden möchten, müssen Sie nicht den Standard-Loop in Ihrer benutzerdefinierten Vorlagendatei ausgeben. Wenn Sie beispielsweise Ihr Formular und nichts als Ihr Formular möchten, möchten Sie mit der folgenden Codebasis beginnen:

     < ?php /** * Template Name: Foobar Form */ get_header(); // Your custom code goes here get_footer(); 
  3. Angenommen, Sie arbeiten mit Ihrem eigenen Theme (oder einem untergeordneten Theme, wie in Ihrem Beispielfall, in dem Sie Twenty Twelve ändern), würden Sie den functionscode entweder direkt in der Datei oder über eine enthaltene Datei in functions.php einfügen .

  4. Wenn Sie möchten, dass dieser Code außerhalb eines bestimmten Theme verfügbar ist, möchten Sie Ihren Code wahrscheinlich über das Plugin implementieren. In diesem Fall möchten Sie wahrscheinlich keine benutzerdefinierte Seitenvorlage verwenden, sondern möchten einen benutzerdefinierten Shortcode verwenden.
  5. Trotzdem können Sie immer noch eine benutzerdefinierte Themenseitenvorlage verwenden. Sie müssten nur ein neues für jedes von Ihnen verwendete Theme erstellen, und ich würde dringend empfehlen, dass Sie jeden Plugin-functionsaufruf in ein if ( function_exists() ) -Konditional umbrechen.
  6. Sie können eine benutzerdefinierte Seitenvorlage in Ihrem Plugin definieren und dann mithilfe eines Callbacks in template_redirect , template_include oder page_template bestimmen, wann sie verwendet werden soll (z. B. basierend auf einem bestimmten Seiten-Slug oder noch besser über benutzerdefinierte Post-Meta-Definition) durch das Plugin).

Ich werde diesen letzten Punkt durchgehen.

In Ihrem Plugin müssen Sie ein benutzerdefiniertes Post-Meta für statische Seiten definieren:

 function wpse77991_add_meta_boxes( $post ) { add_meta_box( 'wpse77991_display_form', __( 'Display Form', 'textdomain' ), 'wpse77991_display_form_meta_box', 'page', 'side', 'default' ); } // Hook meta boxes into 'add_meta_boxes_page' add_action( 'add_meta_boxes_page', 'wpse77991_add_meta_boxes' ); 

Definieren Sie dann den callback:

 function wpse77991_display_form_meta_box() { global $post; $custom = ( get_post_custom( $post->ID ) ? get_post_custom( $post->ID ) : false ); $display_form = ( isset( $custom['_wpse77991_display_form'][0] ) ? 'true' : 'false' );  value="true" />  } 

Definieren Sie anschließend den callback nach dem Speichern:

 function wpse77991_save_display_form_meta_data() { global $post; $custom = ( get_post_custom( $post->ID ) ? get_post_custom( $post->ID ) : false ); $display_form = ( isset( $_POST['_wpse77991_display_form'][0] ) ? 'true' : 'false' ); update_post_meta( $post->ID, '_wpse77991_display_form', $display_form ); } add_action( 'publish_page', 'wpse77991_save_display_form_meta_data' ); add_action( 'draft_page', 'wpse77991_save_display_form_meta_data' ); 

Jetzt wird auf der Edit-Post-Seite eine Metabox für statische Seiten angezeigt, mit der der Benutzer ein Kontrollkästchen für "Form anzeigen" aktivieren kann.

Sie können diese benutzerdefinierten Metadaten dann in einem Callback zu template_redirect , template_include oder besser page_template :

 function wpse77991_page_template_include( $template ) { global $post; $custom = ( get_post_custom( $post->ID ) ? get_post_custom( $post->ID ) : false ); $display_form = ( isset( $custom['_wpse77991_display_form'][0] ) ? 'true' : 'false' if ( 'true' == $display_form ) { return( plugin_dir_path( __FILE__ ) . 'template-foobar.php' ); } } add_filter( 'page_template', 'wpse77991_page_template_include', 1, 1 ); 

Alles oben genannte ist ungetesteter Code, der hier als Proof-of-Concept für den process verwendet wird.

Danke euch allen dafür, dass ihr euch die Zeit genommen habt, zu antworten, besonders woony & Milo, dass ihr mich auf den Weg gebracht habt, den ich letztendlich gewählt habe – ein Plugin. Genauer gesagt, ein mu-plugin. Während ich den Shortcode-Pfad gestartet habe, habe ich mich entschieden, stattdessen den_content zu filtern.

Die einzige Schwierigkeit, die ich beim Filtern fand, war, dass meine Form in einer eigenen Datei ist – Standard-HTML mit eingestreutem PHP. required’ing es (im Filter) würde es sowohl unmittelbar nach als auch nach dem_content ausgeben.

Ich habe file_get_contents in form.php ausprobiert, aber das erlaubt nicht die PHP-Variablen, die dort gecodiert werden. Ich wollte es nicht stringieren, da es eine ziemlich lange Form ist – ich hasse es, HTML zu bearbeiten, während es in einer PHP-Zeichenkette ist. Dann bin ich über ob_start gestolpert, von dem ich gehört hatte, aber bis jetzt noch nie benutzt hatte. Folgendes habe ich mir letztendlich ausgedacht:

Zuerst der vollständige mu-plugin-Code:

 // exit plugin if not on the page I want to output to if ( $_SERVER['SCRIPT_URL'] != '/option-page-starter/' ) return; // instantiate class; __construct either handles the $_POST or initializes form vars require('ops/class.php'); $akt_ops = new akt_opsForm(); add_filter('the_content', array($akt_ops, 'output')); 

und $akt_ops->output (zur Verdeutlichung abgekürzt)

 ob_start(); // buffer output require('form.php'); $text .= ob_get_contents(); // $text is the_content; copy from buffer to string now that it's correctly populated with my vars ob_end_clean(); // cancel the buffered content return $text; 

Diese Lösung ist viel besser als meine ursprüngliche Idee, es in dem Thema zu tun. Zu viel Pflege beim Ändern von Themen. Jetzt muss ich nur noch das CSS reparieren, wenn ich mich dazu entscheide, die Themen zu ändern.

PS – Ich bin brandneu bei StackExchange. Ich dachte, ich hätte beschlossen, mir alle 3 Stunden eine Zusammenfassung der Antworten per E-Mail zukommen zu lassen, aber keine E-Mails von den Antworten erhalten. Wie abonniere ich eine Frage, die ich erstellt habe, damit ich benachrichtigt werde, wenn jemand antwortet?