Error fatal al intentar obtener el correo del administrador en el formulario de contacto
Estoy construyendo un formulario de contacto que necesita enviar todas las consultas a la dirección de correo del administrador.
El archivo PHP que procesa los datos ingresados y envía el correo electrónico solo contiene este código:
<?php
$admin_email = get_option('admin_email');
if($_POST["name"] != "" && $_POST["contact"] != "" && $_POST["comments"] != "")
{
echo "¡Su mensaje ha sido enviado! ";
$name = $_POST["name"];
$contactOption = $_POST["contactoption"];
$msg = "Mensaje de: \n";
$msg .= "Nombre: " .$name;
$msg .= "\nEmail o Teléfono: " .$contactOption;
$msg .= "\n\n";
$msg .= "Mensaje: \n";
$msg .= $_POST["comments"];
$msg .= "\n\n";
$subject = utf8_decode("Mensaje del Formulario de Contacto");
$headers = utf8_decode("De: " .$name."\r\n");
mail($mailTo, $subject, utf8_decode($msg), $headers);
}
?>
El problema es que no puedo usar get_option o get_bloginfo para obtener la dirección de correo del administrador. Esto siempre devuelve un error fatal.
Este archivo reside en mi carpeta del tema hijo. ¿Por qué no puedo usar estas funciones? También he intentado agregar get_header() y get_footer() al archivo, pero estas funciones tampoco son reconocidas.
Soy relativamente nuevo en WordPress. ¿Me estoy perdiendo algo obvio aquí?
Ya tienen esto en su código, lo cual no funciona por las razones descritas en la respuesta aceptada.

Quizás para el tipo que preguntó, pero no para las 18k personas que vinieron aquí buscando esta respuesta y no la encontraron, ¿verdad?

Simplemente tener un archivo en la carpeta del tema no significa que WordPress cargará el archivo, o que cuando se acceda, el archivo se cargará en un contexto de WordPress.
Hay dos enfoques que puedo pensar para esto:
Para usar las funciones de WordPress, WordPress necesita cargarse. La forma más fácil de hacerlo es permitir que WordPress cargue el archivo. Coloca tu código anterior en la misma plantilla que contiene tu formulario (presumiblemente es accesible, por lo que WordPress conoce la página). Simplemente envía el formulario a la misma página en lugar de a una diferente. A falta de razones fuertes para hacerlo de otra manera, esto es lo que yo haría.
También podrías usar la API de AJAX para procesar tu formulario.
Nota: Existe una especie de truco para cargar WordPress en archivos externos incluyendo wp-load.php
, pero no juegues con eso a menos que tengas una idea muy clara de lo que estás haciendo.
Edición:
Basado en información adicional, ahora creo que una mejor solución es crear un widget adecuado para el formulario.
class Form_Widget_wpse_104728 extends WP_Widget {
function __construct() {
$opts = array(
'description' => 'Mostrar y Procesar Mi Formulario'
);
parent::WP_Widget(
'my-form-content',
'Algo de PHP',
$opts
);
}
function widget($args,$instance) {
// Código PHP aquí
// Tu código para procesar el formulario
// El formulario en sí
}
}
function register_my_widgets() {
register_widget('Form_Widget_wpse_104728');
}
add_action('widgets_init','register_my_widgets');
Incluso mejor sería poner todo esto en un plugin para que puedas procesar el formulario de forma independiente mediante un hook al inicio de la carga de la página.

Para tu primera solución, ¿quieres decir que puedo poner este código en mi page.php? La página que contiene el formulario no es un archivo php físico. Déjame saber si eso es lo que quisiste decir. Mientras tanto, echaré un vistazo a la API AJAX y al hack wp-load :)

Puedes poner el código en el archivo de plantilla que procesa el formulario, preferiblemente una plantilla personalizada solo para el formulario. Tu formulario no es un shortcode, ¿verdad?

No, el formulario reside en un textwidget dentro del plugin (pagebuilder)[http://wordpress.org/plugins/siteorigin-panels/]. Pero intentaré crear un archivo de plantilla. Te avisaré si funciona :)

No creo que esto vaya a funcionar. ¿Quieres poner todo el formulario de contacto en la nueva plantilla o solo este código que publiqué arriba? Todo el formulario de contacto no va a funcionar ya que no puedo simplemente llamar a la plantilla desde dentro de un widget de texto :P

El hecho de que tu formulario esté en un widget de texto complica las cosas. La solución AJAX es la mejor de las dos-- que estés lidiando con un widget cuenta como "fuertes razones para hacerlo de otra manera". Aún así, esto es un poco desordenado dado ese imprevisto del widget de texto. Editaré la respuesta con lo que ahora parece ser la mejor solución.

Bueno, lo he resuelto ahora usando wp-load.php. Sé que lo desaconsejarías, pero como lo uso estrictamente para este sitio, y la ubicación de wp-load nunca cambiará, esta es la opción más simple :)

Sin embargo, queda un problema: si el usuario no llena el formulario correctamente, se le muestra una página en blanco. Tengo validación, por supuesto, pero ¿hay alguna forma de enviar retroalimentación de validación al formulario de contacto dentro del widget de texto? ¿Se puede hacer esto con JavaScript de alguna manera?

Olvidé mirar tu edición, jaja. Publicaste algunas cosas interesantes allí, tal vez sea mejor que use esa.

Con ese widget tuyo puedo procesar la validación en el propio formulario :P ¡Eso es genial! ¡Gracias s_ha_dum!
