Eroare fatală la încercarea de a obține emailul administratorului în formularul de contact
Construiesc un formular de contact care trebuie să trimită toate solicitările către adresa de email a administratorului.
Fișierul PHP care procesează datele introduse și trimite emailul conține doar acest cod:
<?php
$admin_email = get_option('admin_email');
if($_POST["name"] != "" && $_POST["contact"] != "" && $_POST["comments"] != "")
{
echo "Mesajul dumneavoastră a fost trimis! ";
$name = $_POST["name"];
$contactOption = $_POST["contactoption"];
$msg = "Mesaj de la: \n";
$msg .= "Nume: " .$name;
$msg .= "\nEmail sau Telefon: " .$contactOption;
$msg .= "\n\n";
$msg .= "Mesaj: \n";
$msg .= $_POST["comments"];
$msg .= "\n\n";
$subject = utf8_decode("Mesaj via Formular de Contact");
$headers = utf8_decode("From: " .$name."\r\n");
mail($mailTo, $subject, utf8_decode($msg), $headers);
}
?>
Problema este că nu pot folosi get_option sau get_bloginfo pentru a obține adresa de email a administratorului. Acestea returnează întotdeauna o eroare fatală.
Acest fișier se află în directorul temei copil. De ce nu pot folosi aceste funcții? Am încercat să adaug și get_header() și get_footer() în fișier, dar aceste funcții nu sunt nici ele recunoscute.
Sunt relativ nou în WordPress. Am ratat ceva evident aici?
Ei au deja acest lucru în codul lor, care nu funcționează din motivele descrise în răspunsul acceptat.

Poate pentru tipul care a întrebat, dar nu și pentru cei 18k de oameni care au ajuns aici în căutarea acestui răspuns și nu l-au găsit, nu?

Simplu având un fișier în folderul temei nu înseamnă că WordPress va încărca fișierul sau că, atunci când este accesat, fișierul va fi încărcat într-un context WordPress.
Există două modalități de abordare la care mă pot gândi:
Pentru a folosi funcțiile WordPress, WordPress trebuie să fie încărcat. Cea mai ușoară modalitate de a face acest lucru este să lăsăm WordPress să încarce fișierul. Puneți codul dvs. de mai sus în același șablon care conține formularul dvs. - probabil că acesta este accesibil, astfel încât WordPress să cunoască pagina. Pur și simplu trimiteți formularul către aceeași pagină în loc să-l trimiteți către una diferită. În absența unor motive puternice pentru a face altfel, acesta este ceea ce aș face.
De asemenea, puteți utiliza API-ul AJAX pentru a procesa formularul dvs.
Notă: Există un fel de hack pentru a încărca WordPress în fișiere externe prin includerea wp-load.php
, dar nu vă jucați cu asta decât dacă știți foarte bine ce faceți.
Editare:
Pe baza informațiilor suplimentare, acum cred că o soluție mai bună este să creați un widget corespunzător pentru formular.
class Form_Widget_wpse_104728 extends WP_Widget {
function __construct() {
$opts = array(
'description' => 'Afișează și Procesează Formularul Meu'
);
parent::WP_Widget(
'my-form-content',
'Unele PHP',
$opts
);
}
function widget($args,$instance) {
// PHP aici
// Codul dvs. pentru procesarea formularului
// Formularul în sine
}
}
function register_my_widgets() {
register_widget('Form_Widget_wpse_104728');
}
add_action('widgets_init','register_my_widgets');
Chiar mai bine ar fi să puneți totul într-un plugin, astfel încât să puteți procesa formularul independent pe un hook la începutul încărcării paginii.

Pentru prima ta soluție, vrei să spui că pot pune acest cod în fișierul meu page.php? Pagina care conține formularul nu este un fișier php fizic. Spune-mi dacă asta ai vrut să spui. Între timp, voi arunca o privire la API-ul AJAX și hack-ul wp-load :)

Poți pune codul în fișierul template care procesează formularul - de preferință un template personalizat doar pentru formular. Formularul tău nu este un shortcode, nu-i așa?

Nu, formularul se află într-un widget text în cadrul pluginului (pagebuilder)[http://wordpress.org/plugins/siteorigin-panels/]. Dar voi încerca să creez un fișier template. Îți voi spune dacă funcționează :)

Nu cred că asta va funcționa. Vrei să pui întregul formular de contact în noul template sau doar acest cod pe care l-am postat mai sus? Întregul formular de contact nu va funcționa pentru că nu pot să apelez template-ul direct dintr-un widget de text :P

Faptul că formularul tău se află într-un widget de text complică lucrurile. Soluția cu AJAX este cea mai bună dintre cele două - faptul că ai de-a face cu un widget se încadrează la "motive puternice pentru a face altfel". Totuși, situația este destul de haotică având în vedere particularitatea widget-ului de text. Voi edita răspunsul cu ceea ce acum pare a fi cea mai bună soluție.

Ei bine, am rezolvat acum folosind wp-load.php. Știu că ai recomanda împotriva acestei soluții, dar întrucât o folosesc strict pentru acest site, iar locația fișierului wp-load nu se va schimba niciodată, aceasta este cea mai simplă opțiune :)

Totuși, rămâne o problemă: dacă utilizatorul nu completează corect formularul, i se afișează o pagină goală. Am validare, desigur, dar există vreo modalitate de a trimite feedback-ul de validare către formularul de contact din textwidget? Se poate face acest lucru cumva cu javascript?

Am uitat să mă uit la ediția ta lol. Ai postat niște lucruri interesante acolo, poate ar fi mai bine să folosesc acea variantă.

Cu widget-ul tău pot procesa validarea în formularul în sine :P Este foarte tare! Mulțumesc s_ha_dum!
