Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

175
Vistas
Hilo sin acceso a las funciones de WordPress

Un administrador o editor puede enviar correos electrónicos a los usuarios a través de nuestro complemento de WordPress personalizado para el individuo para que los correos electrónicos se envíen individualmente, esto puede hacer que la página espere un tiempo hasta que finalice el proceso de envío. El plan es multiproceso para devolver al usuario a la página y dejar que los correos electrónicos continúen enviándose en el servidor. El problema parece ser la falta de acceso a la función wp_mail() de WordPress desde la función run() del subproceso. Llamar a wp-load.php no parece dar acceso a las funciones de WordPress.

A continuación se muestra una versión simplificada del correo enhebrado. ¿Cómo usamos la función wp-mail() del hilo Test_Mailer?

 class Test_Mailer extends Thread { private $email; public function __construct($emails, $subject, $message) { $this->emails = $emails; $this->subject = $subject; $this->message = $message; } public function run() { require( '../../../wp-load.php' ); foreach($this->emails as $email) wp_mail( $email, $this->subject, $this->message); } } $test_mailer = new test_mailer(array('test@test.com'), 'Subject', 'Message'); $test_mailer->start();

EDITAR: si trato de acceder a una función de WordPress, no sucede nada como se muestra a continuación, lo que me hace pensar que WP no está cargado, pero no obtengo ningún error en el registro de errores de PHP.

 class Test_Thread extends Thread { public function run() { update_option('test', 'two'); } } update_option('test', 'one'); $test_thread = new test_mailer(); $test_thread->start(); // test option is set to 'one'
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Estás cargando WordPress de nuevo con ese require( '../../../wp-load.php' ); . Para eso está el Ajax .

El meollo del siguiente ejemplo son las acciones wp_ajax_ (usuarios registrados) y wp_ajax_nopriv_ (usuarios no registrados). Estas son las acciones de PHP para ejecutar mediante una llamada de JavaScript, en su caso, wp_mail() .

Debe poner en cola el archivo JS en la página correcta y pasar algunas variables a través wp_localize_script (URL de Ajax, nonce de seguridad, cosas personalizadas).

Crea una página de administración con un enlace que solicita un correo electrónico. La dirección se pasa a la función Ajax que envía el correo electrónico y devuelve true o false según el resultado de wp_mail() .

Complemento de ejemplo:

 <?php /** * Plugin Name: (B5F) Test Email * Version: 1.0 * Author: brasofilo */ add_action('admin_menu', 'add_menu_43678305'); add_action( 'wp_ajax_mail_43678305', 'mail_43678305' ); add_action( 'wp_ajax_nopriv_mail_43678305', 'mail_43678305' ); function add_menu_43678305() { $page = add_menu_page( 'sendMail', '<span style="color:#d00;">Send Mail</span>', 'read', 'send-mail', 'menu_page_43678305', 'http://i.imgur.com/Vk42k.png', 6 // position, just after Posts ); add_action( "admin_print_scripts-$page", 'enqueue_scripts_43678305' ); } function enqueue_scripts_43678305(){ wp_enqueue_script( 'ajax_script', plugins_url('/ajax_43678305.js',__FILE__), array('jquery'), TRUE ); wp_localize_script( 'ajax_script', 'myAjax', array( 'url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( "nonce_43678305" ), ) ); } function menu_page_43678305() { echo '<h4><a href="#" id="send-mail">TEST AJAX</a></h4>'; } function mail_43678305(){ check_ajax_referer( 'nonce_43678305', 'nonce' ); if( true ) { // Dummy test $sent = wp_mail( $_POST['email'], "Subject", "message" ); wp_send_json_success( $sent ); } else wp_send_json_error( array( 'error' => $custom_error ) ); }

archivo JS:

 jQuery(document).ready(function($) { $('#send-mail').click(function(e) { e.preventDefault(); var email = window.prompt('Email?'); if ( email === '' || email === null ) return; var data = { action: 'mail_43678305', // Ajax PHP function nonce: myAjax.nonce, // security, passed via wp_localize_script email: email }; $.post( myAjax.url, data, function( response ) { $('#send-mail').html( response.data ); }); }); });
over 4 years ago · Santiago Trujillo Denunciar

0

Al crear un nuevo subproceso, pthreads hará una copia de todas las funciones (así como clases, interfaces, características, etc.) disponibles en el entorno actual (a menos que se hayan utilizado indicadores de herencia selectiva en Thread::start , por supuesto). Esto significa que si ya ha incluido el archivo wp-load.php , entonces no necesita incluirlo nuevamente dentro del nuevo hilo (en Thread::run ). (Si aún no ha incluido este archivo, entonces lo que ha hecho está bien).

Mirando su código de ejemplo, está asignando el parámetro $emails del constructor a la propiedad $this->emails . Sin embargo, foreach está intentando iterar sobre la propiedad $this->email_array , que simplemente será null . Entonces, al menos desde su código de ejemplo, parece que el problema es con la propiedad a la que está accediendo, en lugar de que la función wp_mail no sea accesible.

Dicho todo esto, parece que está intentando usar pthreads en un entorno de servidor web. Esto tiene sus propias ramificaciones y es simplemente una mala idea. Sería mejor poner en cola tales tareas (a través de RabbitMQ o algo así) para manejarlas en otro lugar.

ACTUALIZAR (de su actualización):

Echando un breve vistazo al código base de WordPress, puedo ver que el enhebrado simplemente no va a funcionar aquí. El código base es increíblemente hostil a tales técnicas de concurrencia.

La función update_option no funcionará porque depende de una conexión de base de datos global. Esta conexión no se puede usar en diferentes contextos (subprocesos); en su lugar, se debe crear una nueva conexión por subproceso.

La función wp_mail usa la función get_bloginfo , que a su vez usa la función get_option , que a su vez tiene un acceso global a la base de datos. Así que vas a tener el mismo problema que el anterior.

Dada la ubicuidad de los globales en el código base de WordPress, el enhebrado simplemente no va a funcionar aquí...

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda