De ce wp_mail() nu-mi permite să setez antetul From: când funcția PHP mail() o face?
Când folosesc wp_mail( $to, $subject, $message, $headers )
(cu valori completate, bineînțeles), emailul este trimis cu un nume și o adresă de expeditor care nu sunt setate nicăieri unde pot găsi (nici măcar în setările PHP sau Apache). Totuși, folosind mail( $to, $subject, $message, $headers )
în schimb, funcționează perfect. Ce s-ar putea întâmpla cu wp_mail()
pentru a cauza acest comportament?
Salut @helenyhou:
Poți seta antetul, doar că nu printr-un parametru. WordPress folosește "hook-uri" iar hook-urile de care ai nevoie sunt 'wp_mail_from'
și 'wp_mail_from_name'
.
Iată hook-urile pe care le-ai putea adăuga în fișierul functions.php
al temei tale pentru a modifica antetul "From:"
când folosești wp_mail()
pentru adresa de email Helen Hou-Sandi <helenyhou@example.com>
:
add_filter('wp_mail_from','yoursite_wp_mail_from');
function yoursite_wp_mail_from($content_type) {
return 'helenyhou@example.com';
}
add_filter('wp_mail_from_name','yoursite_wp_mail_from_name');
function yoursite_wp_mail_from_name($name) {
return 'Helen Hou-Sandi';
}

Tocmai mă uitam la filtre și ai dreptate, rezolvă problema. Cred că Codex-ul ar trebui actualizat? http://codex.wordpress.org/Function_Reference/wp_mail
Totodată, legat de asta: se pare că afectează multe pluginuri de formulare, inclusiv puternicul GravityForms. Momentan scriu un formular custom, dar dacă așa ar trebui să se comporte WP, de ce funcționează setarea headerelor prin metoda veche pentru alții (și chiar pentru unele dintre celelalte site-uri ale mele)?

@helenyhou - Pentru a nu afecta alte formulare, ar trebui să adaugi filtrele în pluginul tău chiar înainte de a apela wp_mail()
și apoi să le elimini imediat după. În ceea ce privește funcționarea setării headerelor, nu știu care sunt celelalte cazuri de utilizare ale tale, dar aș fi surprins dacă wp_mail()
ar funcționa în acest fel.

Ahaaa, am înțeles ce se întâmpla - un alt plugin adăuga filtrele global pentru ceva ce nu am cerut și de care nu pot renunța - rău, rău, rău. Deci acum header-ile normale funcționează până la urmă. Se pare că folosirea acestor filtre ar fi cea mai bună practică, dacă sunt deja acolo.

Doar o notă aici că orice filtru adăugat de un plugin poate fi eliminat prin remove_filter(HOOK, FUNCTION).

Dacă folosești formatul From: "Numele Tău" <emailultau@exemplu.com>\r\n
în anteturile tale, nu ar trebui să ai nicio problemă (cu excepția cazului în care ai un plugin instalat care suprascrie funcția wp_mail).
Cu toate acestea, așa cum a menționat Mike, poți filtra valorile finale cu acele filtre sau poți pur și simplu instala acest plugin:
Îți va oferi o setare de opțiuni pentru a determina ce nume și email să folosești în wp_mail()
.

Îmi cer scuze că reînviu o întrebare veche, dar nu ar fi mai bine să setați prin antete astfel:
$subject = "MyPlugin: Alertă (".get_bloginfo('wpurl').")";
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=".get_bloginfo('charset')."" . "\r\n";
$headers .= "From: MyPlugin <".$this->settings['from_address'].">" . "\r\n";
wp_mail($this->settings['notify_address'], $subject, $alertMessage, $headers);
În acest fel, nu trebuie să vă faceți griji cu privire la utilizarea unui filtru și apoi eliminarea lui după wp_mail()
.

Nu eu am setat filtrul, ci un alt plugin. Filtrul are prioritate față de header. De asemenea, ar fi bine să folosești site_url()
în loc de get_bloginfo('wpurl')

Dar atunci acel plugin este prost pentru că nu curăță după sine... nu prea ai ce face în acest caz :( în această situație, mai bine modific plugin-ul meu să folosească filtre pentru orice eventualitate în care un alt plugin l-a stricat.

@helenyhou - +1 pentru că mi-ai reamintit de site_url(). De asemenea, am modificat plugin-ul meu să folosească filtre în loc să utilizeze $headers. În plus, m-am asigurat să elimin acele filtre după ce am trimis emailul ca să nu interfereze cu altceva :)

da, e vina acelui plugin că nu îmi oferă opțiunea de a nu folosi acele filtre, dar din fericire comentarea filtrelor a funcționat în cazul meu. Probabil voi întreba în jur pentru a afla care este mai bun de utilizat în viitor - un filtru pe utilizare sau headerele mai familiare. Headerele sunt probabil mai eficiente, dar atunci de ce există acele filtre? Întotdeauna mai multe întrebări :)

În versiunea actuală, este perfect acceptabil să folosești get_bloginfo('wpurl')
: Aceasta returnează deja site_url()
. get_bloginfo('home')
și get_bloginfo('siteurl')
sunt învechite. https://developer.wordpress.org/reference/functions/get_bloginfo/

Este un pic de hack, dar poți folosi și header-ul Reply To
:
$headers = 'Reply-To: "Aaren A. Aarenson" <aaron@somemail.com>';
Din păcate, acest lucru adaugă adresa de email la lista From, iar răspunsul înseamnă că va trebui să eliminați manual adresa configurată în filtrul wp_mail_from
.

Am avut aceeași problemă. În cazul meu, a rezultat că furnizorul de hosting (BlueHost) împiedică modificarea câmpului "from". Ei explică acest lucru aici https://my.bluehost.com/cgi/help/206.
Am rezolvat problema prin adăugarea adresei de email în căsuțele poștale din cPanel, exact cum recomandă ei.
