XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   $_POST Variablen in WP (http://xhtmlforum.de/showthread.php?t=68128)

Hook 16.09.2012 21:03

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

David 18.09.2012 20:34

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.

Hook 18.09.2012 23:53

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

David 19.09.2012 16:44

Zitat:

Zitat von Hook (Beitrag 520769)
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.

Hook 19.09.2012 20:34

Hi David,

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

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

protonenbeschleuniger 20.09.2012 00:50

Zitat:

Zitat von Hook (Beitrag 520815)
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

Hook 20.09.2012 07:57

Hi,

danke für die Links.

Peter

David 20.09.2012 10:38

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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:17 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023