zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden $_POST Variablen in WP

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 16.09.2012, 20:03
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 14.09.2009
Beiträge: 88
Hook befindet sich auf einem aufstrebenden Ast
Standard $_POST Variablen in WP

Hi,

ich versuche gerade ein eigenes Kontakt-Formular (Affenformular) in WP einzubinden.

Folgende Vorgehensweise habe ich genommen:
  • Eigenes Seitentemplate erstellt
  • In dieses Template den Formular-Code mit PHP-Code eingetragen
  • Eine leere Seite in WP kreiert mit dem Titel Kontakt und dem entsprechenden Seitentemplate
Das Kontaktformular wird richtig angezeigt aber es wird immer (nach dem submit) als "leer" deklariert. Und es kommt immer diese Warnung:
Zitat:
Warning: array_map() [function.array-map]: The first argument, 'Formular_Daten', should be either NULL or a valid callback in /homepages/18/d35164384/htdocs/siebenstein/wp-content/themes/treasure_quest/kontakt_template.php on line 36
Das sind die relevanten PHP-Codes:
PHP-Code:
if($Formular_abgeschickt = !empty($_POST)) {
  
$Formular_leer true
  
set_magic_quotes_runtime(0);
  
$_POST array_map('Formular_Daten'$_POST); //das ist Zeile 36
}
//die dazu gehörige Funktion:
function Formular_Daten($val) {
  global 
$Formular_leer;
  if(
is_array($val)) return array_map('Formular_Daten'$val);
  if(
get_magic_quotes_gpc()) $val stripslashes($val);
  if(
$val trim($val)) $Formular_leer false;
  return 
$val;

Da ich mich mit den Interna von WP nicht auskenne, brauche ich Denk-/Hilfs-Anstöße von Kennern.

Link zur Seite: Kontakt « Siebensteins Taktiken

Das Kontaktformular beruht auf Ingos "einfachem Formmailer".

Ich bin für jede Hilfestellung dankbar.

Peter

Geändert von Hook (16.09.2012 um 20:27 Uhr)
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 18.09.2012, 19:34
Benutzerbild von David
auch, ja!
XHTMLforum-Kenner
 
Registriert seit: 08.11.2007
Beiträge: 2.626
David ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer Anblick
Standard

Wo wird denn der Code ausgeführt, bzw. wo die Funktion definiert? (Zeig mal das komplette Page-Template)

Ich würde sowas in ein Plugin auslagern. Erstelle ein Shortcode, welches das HTML zusammen stellt (und ggf. mit Fehlermeldungen oder Bestätigungen ergänzt.)

Die Auswertung trennst Du am besten von der Darstellung und sammelst das in einer Callbackfunktion auf der Action 'template_redirect'. An dem Punkt kannst Du - abhängig von der Auswertung - noch http-Header senden. Ist im Moment vielleicht nicht nötig, aber man möchte ja vorrausdenken

PHP-Code:
set_magic_quotes_runtime() 
Wird dir nichts bringen, sofern es nicht auf alles Superglobalen ein 'stripslashes' anwendet. Denn WP forkt die magic-quotes leider.
Nimm Function Reference/stripslashes deep « WordPress Codex um die slashes zu entfernen.
__________________
github | http://dnaber.de
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 18.09.2012, 22:53
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 14.09.2009
Beiträge: 88
Hook befindet sich auf einem aufstrebenden Ast
Standard

Hi David,

der Code steht im Seitentemplate selbst drin. Das Formular ruf sich selber auf (Affenformular):
PHP-Code:
<form action="<?php echo $_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING']; ?>" method="post" enctype="multipart/form-data" accept-charset="<?php echo CHARSET?>">
Das Seitentemplate ist eigentlich die index.php des Template, ergänzt um den Formmailer.

Hier mal der komplette Code:
PHP-Code:
<?php 
/*
Template Name: Kontakt-Template
*/
wp_get_header(); ?>
<div id="pbody">
    <div id="content">
    <?php if (have_posts()) : ?>
        <?php while (have_posts()) : the_post(); ?>
            

<div class="posttop"><div class="date"><?php the_time('j M '?></div></div>
<div <?php post_class() ?> id="post-<?php the_ID(); ?>">
<div class="ptitle"><h2>
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2></div>
            <div class="entry">
<?php the_content('<p class="serif">Read the rest of this entry &raquo;</p>'); ?>
<?php
//****************************************************
// Hier beginnt die Auswertung des Kontaktformulares
//****************************************************
define ('MAILTO'"meine@adresse.eu"); // Empfänger hier eintragen
define ('MAILFROM'"Siebensteins Taktiken"); // ggfls. Absender hier eintragen
define ('CHARSET'"UTF8"); // Zeichenkodierung ggfls. anpassen
$Pflichtfelder = array('Name','Email','Nachricht'); // ggfls. weitere Pflichtfelder angeben

//Ab hier braucht nur etwas geändert werden, wenn das Formular angepasst werden soll   
$mail_header 'Content-Type: text/plain; charset='.CHARSET;
$mail_body "";
if(
MAILFROM$mail_body .= chr(13).chr(10).'Von: '.MAILFROM;
$mail_body .= print_r($_POST,true);
     


if(
$Formular_abgeschickt = !empty($_POST)) {
  
$Formular_leer true
  
set_magic_quotes_runtime(0);
  
$_POST array_map('Formular_Daten'$_POST);
}
function 
Formular_Daten($val) {
  global 
$Formular_leer;
  if(
is_array($val)) return array_map('Formular_Daten'$val);
  if(
get_magic_quotes_gpc()) $val stripslashes($val);
  if(
$val trim($val)) $Formular_leer false;
  return 
$val;
}

function 
Formular_Pflichtfelder() {
  global 
$Pflichtfelder;
       
$Fehler '';
       foreach (
$Pflichtfelder as $Feld) {
         
$key str_replace(' ','_',$Feld);
         if(!(isset(
$_POST[$key]) && trim($_POST[$key]))) {
           if(
$Fehler$Fehler .= '<br />';
           
$Fehler .= 'Pflichtfeld "' $Feld '" nicht ausgefüllt.';
         }
       }
  return 
$Fehler;
}

function 
Formular_neu($log='.htPOSTdata.txt') {
  if(
file_exists($log) && is_readable($log)
   && 
file_get_contents($log) == print_r($_POST,true))
  return 
false;
  if(
$handle=@fopen($log'w')) {
    
fwrite($handleprint_r($_POST,true)); fclose($handle);
  }
  return 
true;
}

function 
checkEmail($adr) {
  
$regEx '^([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|(\d{1,3}\.){3}\d{1,3})$';
  return (
preg_match("/$regEx/",$adr,$part)) ? $part false;
}

function 
Formular_Check() {
  global 
$Formular_leer;
  if(
$Formular_leer$Fehler 'Keine Daten eingetragen.';
  elseif(!empty(
$_POST['Mail'])) $Fehler 'Die Spam-Falle wurde ausgefüllt!';  //Fehlerausgabe wenn das Feld "Mail" (Bot-Falle) ausgefüllt ist
  
elseif($_FILES['anhang']['size'] > 1024000$Fehler 'Der Dateianhang ist zu groß!'//Fehlerausgabe wenn der Dateianhang größer als 1MB ist
  
elseif(!$Fehler Formular_Pflichtfelder()) {
    if(!
checkEmail($_POST['eMail'])) $Fehler 'E-Mail fehlerhaft.';
    elseif(!
Formular_neu()) $Fehler 'Nachricht war bereits verschickt.';
  }
  return 
$Fehler;
}

function 
Formular_Eingabe($Feldname$def='') {
  if(!empty(
$_POST[$Feldname])) echo htmlspecialchars($_POST[$Feldname]);
  else echo 
$def;
}
?>
<!-- Ab hier kommt er HTML-Code -->
<form action="<?php echo $_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING']; ?>" method="post" enctype="multipart/form-data" accept-charset="<?php echo CHARSET?>">
<fieldset>
<legend>Kontaktformular</legend>
<div class="left">
<p><label for="Name">Ihr Name <span>*</span>:</label><br /><input name="Name" id="Name" size="66" value="<?php Formular_Eingabe('Name'); ?>" /></p>
<p><label for="eMail">Ihre Emailadresse <span>*</span>:</label><br /><input name="eMail" id="eMail" size="66" value="<?php Formular_Eingabe('eMail'); ?>" /></p>
</div>    
<p><label for="Nachricht">Nachricht <span>*</span>:</label><br /><textarea name="Nachricht" id="Nachricht" rows="8" cols="50"><?php Formular_Eingabe('Nachricht'); ?></textarea></p>
<p id="bot">   <!-- Spam-Bot-Falle -->
<label for="Mail" style="display: none;">Mail*:</label><input name="Mail" id="Mail" size="66" value="" style="display: none;" /></p>
<h3>Bitte beachten!</h3>
<p class="bemerkung">Alle mit einem  "<span>*</span>"  versehenen Felder sind Pflichtfelder und müssen ausgefüllt werden.</p>            
<?php 
if($Formular_abgeschickt) { ?>
<div id="status">
<p>Formularstatus:</p>
<?php                   
if($Formular_abgeschickt) {
if(
$Formular_Fehler Formular_Check())
echo 
'<p class="Meldung" id="Fehler">',$Formular_Fehler,'</p>';
else {
if(@
mail(MAILTO"Nachricht von meiner Website"$mail_body$mail_header))
echo 
'<p class="Meldung" id="OK">Nachricht verschickt.</p>';
else echo 
'<p class="Meldung" id="Fehler">Server-Fehler !</p>';
}
}               
?>
</div>
<?php ?>
<p id="senden"><input type="submit"  id="submit" value="abschicken" style="width: 80px;"/></p>
</fieldset>
</form>
<!-- Ende des Kontaktformulares -->

</div>
<p class="postmetadata">Posted in <?php the_category(', '?> </p><div class="compost"><?php comments_popup_link('0''1''%'); ?></div>

</div>
        <?php endwhile; ?>
        <div class="navigation">

<?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } 
            else { 
?>

            <div class="alignleft"><?php next_posts_link('&laquo; Older Entries'?></div>
            <div class="alignright"><?php previous_posts_link('Newer Entries &raquo;'?></div>
                <?php ?>

        </div>
    <?php else : ?>
        <?php include(TEMPLATEPATH."/404.php");?>
          <?php endif; ?>
        
</div>
 <?php include(TEMPLATEPATH."/s2.php");?>
 <?php include(TEMPLATEPATH."/s1.php");?>
</div>
<?php wp_get_footer(); ?>
Es stehen noch einige Sachen drin, die ich bisher nur mit CSS ausblende und im Formmailer-Code sind auch noch Sachen drin, die ich hier nicht brauche, die aber auch nicht stören sollten.

Mein Problem ist, dass ich noch nie etwas speziell für WP programmiert habe und keine OoP behersche.
Ich hatte einfach nach einer Möglichkeit eigenen PHP-Code in WP einzubinden bei Google gesucht und den Hinweis zum Seitentemplate gefunden und versucht umzusetzten.

Peter
Mit Zitat antworten
  #4 (permalink)  
Alt 19.09.2012, 15:44
Benutzerbild von David
auch, ja!
XHTMLforum-Kenner
 
Registriert seit: 08.11.2007
Beiträge: 2.626
David ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Hook Beitrag anzeigen
PHP-Code:
<form action="<?php echo $_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING']; ?>" method="post" enctype="multipart/form-data" accept-charset="<?php echo CHARSET?>">
Wenn Du das so machst, dann solltest Du wenigstens den Query-String einmal durch die Funktion esc_attr() filtern, sonst baust Du dir eine XSS-Lücke ein. Das ist aber nicht notwendig, du bist schließlich im "Loop" und kannst die URL zur aktuellen Seite mit der Funktion the_permalink() ausgeben.

Zitat:
Mein Problem ist, dass ich noch nie etwas speziell für WP programmiert habe und keine OoP behersche.
Ich hatte einfach nach einer Möglichkeit eigenen PHP-Code in WP einzubinden bei Google gesucht und den Hinweis zum Seitentemplate gefunden und versucht umzusetzten.
Du brauchst kein OOP beherschen, du kannst es schritweise lernen.
In dem Fall reichen aber ein paar Funktionen.

Zuerst einmal würde ich alle Funktionen dahin schreiben, wo sie hingehören: in die functions.php. Das schafft Übersicht und du kannst sicher sein, dass sie zur rechten Zeit im Theme verfügbar sind.

Wenn du schon mit Globalen arbeitest, dann gib ihnen möglichst eindeutige Präfixe, die sich aus deinem Projekt oder deinen Initialen zusammensetzten. Besser ist, du setzt gleich auf PHP5.3 und nutzt Namespaces.

Wie schon gesagt, die Auswertung würde ich machen, bevor irgend etwas an den Browser gesendet wird. Beispiel
PHP-Code:
<?php
function hk_evaluet_contact_form() {

    if ( 
'POST' != $_SERVER'REQUEST_METHOD' ] )
        return;

    
// sicher stellen, dass das Formular auch vorher aufgerufen wurde
    
if ( ! wp_verify_nonce$_POST'hk_contact_nonce' ], 'hk_contact' ) )
        return;

    
// hier die Auswertung
    // ggf. Fehlermeldungen/Status etc. in Globaler Variable speichern
}
add_action'template_redirect''hk_evaluate_contact_form' );
Die Darstellung des Formulars packst Du auch in eine Funktion:
PHP-Code:
<?php
function hk_contact_form() {

    
?>
    <form method="post" action="<?php the_permalink(); ?>" accept-charset="utf-8">
    <?php wp_nonce_field'hk_contact''hk_contact_nonce' ); ?>
    <?php
     
// abfrage auf Globale Variable  mit Fehlermeldungen und ggf. Fehlermeldung ausgeben
    
?>
   <!-- Formularfelder oder Bestätigungsmeldung --> 
   <?php
}
Die Funktion rufst Du dann im Theme an der entsprechenden Stelle einfach auf. Das ganze ist nur sehr grob, aber ich hoffe, das Prinzip wird deutlich. Wenn nicht, frag nach.
__________________
github | http://dnaber.de

Geändert von David (19.09.2012 um 15:47 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 19.09.2012, 19:34
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 14.09.2009
Beiträge: 88
Hook befindet sich auf einem aufstrebenden Ast
Standard

Hi David,

vielen Dank für deine Hinweise und Beispiele. Da muss ich wohl noch einiges lernen ...

Funktionen in die functions.php einfügen dürfte das einzige sein, was ich auf Anhieb umsetzen kann. Auch die HTML-Ausgabe in eine Funktion einzubauen sollte kein Problem sein.
Womit ich aber, auf Grund von Unwissenheit, Probleme habe sind die anscheinend WP-spezifischen Funktionen (z. B. wp_verify_nonce(...) oder wp_nonce_field(...) oder the_permalink() ), die kenne ich einfach noch nicht.

Gibt es eine Auflistung dieser Funktionen, die komprimiert deren Aufgabe und Ausgabe Beschreibt? (Sorry, ich frage hier einfach mal den Experten ohne vorher gegoogelt zu haben, was ich sonst nicht mache)

Auf jeden Fall werde ich mich mit deiner Hilfestellung beschäftigen und versuchen zu einem positivem Ergebnis zu kommen. Das kann zwar etwas dauern ... aber bisher habe ich es immer geschafft. Wenn ich gar nicht mehr weiterkomme, frage ich hier natürlich wieder nach.

Peter
Mit Zitat antworten
  #6 (permalink)  
Alt 19.09.2012, 23:50
Benutzerbild von protonenbeschleuniger
Verbesserer
XHTMLforum-Kenner
 
Registriert seit: 06.09.2007
Beiträge: 4.964
protonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Hook Beitrag anzeigen
Gibt es eine Auflistung dieser Funktionen, die komprimiert deren Aufgabe und Ausgabe Beschreibt? (Sorry, ich frage hier einfach mal den Experten ohne vorher gegoogelt zu haben, was ich sonst nicht mache)
Ja, Main Page « WordPress Codex die Funktioen findest du z.b. hier Function Reference « WordPress Codex
Mit Zitat antworten
  #7 (permalink)  
Alt 20.09.2012, 06:57
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 14.09.2009
Beiträge: 88
Hook befindet sich auf einem aufstrebenden Ast
Standard

Hi,

danke für die Links.

Peter
Mit Zitat antworten
  #8 (permalink)  
Alt 20.09.2012, 09:38
Benutzerbild von David
auch, ja!
XHTMLforum-Kenner
 
Registriert seit: 08.11.2007
Beiträge: 2.626
David ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer Anblick
Standard

Hättest Du mal gegoogelt

Da die Auswertungsfunktion bei jedem (POST)Request aufgerufen wird, dein Formular aber nicht das einzige auf deiner Site sein wird, musst du irgendwie Prüfen, ob es die Daten deines Kontaktformulars sind. Das kann man mit einer Nonce machen.
Alternativ kannst du mit isset() auch auf die Existenz der von dir benannten Formularvariablen prüfen und das Nonce weglassen.
__________________
github | http://dnaber.de
Mit Zitat antworten
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Lokale und globale Variablen und Konstanten AndreasB Serveradministration und serverseitige Scripte 42 27.09.2010 21:26
globale variablen kampfgnom Javascript & Ajax 58 20.05.2009 14:05
2 PHP Variablen in XHTML übergeben - Valdierung fehlgeschlagen der_Praktikant (X)HTML 7 13.12.2007 12:13
Variablen beim Zurück im Browser aktualisieren 2001amo Serveradministration und serverseitige Scripte 1 12.04.2007 14:13
Variablen erzeugen Server-Probleme [gelöst!] heiko_rs Serveradministration und serverseitige Scripte 15 18.03.2006 15:08


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:32 Uhr.