Pregunta sobre Developing with WordPress de Wordpress:

Funciones de llamada m煤ltiple AJAX

Un usuario pregunt贸 馃憞

驴Puedo tener varias funciones de recuperaci贸n de AJAX dentro del mismo plugin?

He creado un plugin que permite a los miembros registrarse o cancelar un evento creado con el plugin Calendario de eventos (Tribe Events). La funci贸n rsvp_callback se activa presionando varios botones y funciona correctamente. Luego cre茅 una funci贸n eventid_callback para enviar el evento analizado desde la p谩gina del evento espec铆fico que se est谩 viendo al lado del servidor. Esta funci贸n crea un error de consola que dice:

HTTP400: BAD REQUEST: el servidor no pudo procesar la solicitud debido a una sintaxis no v谩lida.

He revisado el c贸digo decenas de veces y no veo lo que me pasa, aparte de que quiz谩s no puedo hacer lo que estoy tratando de hacer.

Coloqu茅 el archivo JS y la URL ajax en la parte superior del plugin de la siguiente manera:

add_action( 'wp_enqueue_scripts', 'event_rsvp_enqueue_scripts' );
function event_rsvp_enqueue_scripts() {

	wp_enqueue_script( 'rsvp', plugins_url( '/js/rsvp.js', __FILE__ ), array('jquery'), '1.0', true );

	wp_localize_script( 'rsvp', 'ajax_rsvp', array(
		'ajax_url' => admin_url( 'admin-ajax.php' )
	));
};

El c贸digo JS es para eventid_callback (tenga en cuenta que utilic茅 la misma URL AJAX para ambas funciones y me preocupa que no pueda hacer eso). La alerta muestra el evento parsed_ correctamente justo antes de la llamada AJAX:

	if($jq("#tribe-events-content").hasClass("tribe-events-single")) {
		// alert ("on single event page");
		$jq(".tribe-events-nav-pagination").hide();
		var event_category = ($jq( ".tribe-events-event-categories" ).text());
		// alert ("Event Category is " + event_category);
		var event_start = ($jq( ".tribe-events-start-date" ).attr("title"));
		// alert ("Event Start Date is " + event_start);
		var event_id = event_category.substring(0,1) + event_start.substring(0,4) + event_start.substring(5,7) + event_start.substring(8,10);
		alert ("Event ID is " + event_id);

		$jq.ajax({
			url : ajax_rsvp.ajax_url,
			type : 'post',
			data : {
				action: 'eventid_callback',
				event_id_name : event_id
			},
			success:function(data) {
				// This outputs the result of the ajax request
				console.log(data);
				// Return response to client side
				$jq('#rsvp_response').html( data );
				return false;
			},
			error: function(errorThrown){
				console.log(errorThrown);
			}
		}); // End of AJAX function
	};

La funci贸n de eventid_callback es:

add_action( 'wp_ajax_eventid_callback', 'eventid_callback' );

function eventid_callback() {
	$event_id = $_POST[event_id_name];
	echo "<p>Event ID from eventid_callback is: {$event_id} </p>";
}; // end of eventid_callback function

El eco no devuelve valores. Otro problema que no entiendo completamente es el primer par谩metro de la declaraci贸n add_action. Cada ejemplo que vi pone ‘wp_ajax_’ delante de cada nombre con una funci贸n de recuperaci贸n que decidas usar. No entiendo qu茅 representa esa primera variable.

Cualquier comentario o sugerencia ser铆a muy apreciada. Gracias

(@jakept)

Hace 2 a帽os, 1 mes

El primer argumento de add_action es el nombre del gancho. El segundo argumento es la funci贸n que se ejecutar谩 en ese ladr贸n. Cuando env铆a una aplicaci贸n a admin-ajax.php WordPress ejecuta un gancho con el nombre wp_ajax_ y luego no importa que action enviar par谩metro enviar con solicitud.

Entonces, en su ejemplo, est谩 enviando estos datos a admin-ajax.php:

data : {
	action: 'eventid_callback',
	event_id_name : event_id
},

En ese ejemplo el action es eventid_callback, as铆 que cuando WordPress recibe la solicitud, ejecuta el wp_ajax_eventid_callback acci贸n.

Cuando usas add_action() con ese nombre de gancho, le permite ejecutar una funci贸n en respuesta a solicitudes AJAX con el nombre de acci贸n asociado.

Entonces, para manejar las solicitudes AJAX, debe crear una acci贸n para cada tipo de aplicaci贸n que desee manejar, luego, en su JavaScript, debe nombrar esa acci贸n como parte de la solicitud.

Una cosa que te falta es que el wp_ajax_ El gancho solo se ejecuta para usuarios registrados. Para los usuarios desconectados, WordPress tiene un gancho separado. Es la misma idea, pero el prefijo es wp_ajax_nopriv_.

Entonces, si desea que su AJAX funcione para usuarios que inician y cierran sesi贸n, debe usar ambos botones:

add_action( 'wp_ajax_eventid_callback', 'eventid_callback' );
add_action( 'wp_ajax_nopriv_eventid_callback', 'eventid_callback' );

Esta respuesta fue modificada hace 2 a帽os, hace un mes por.

(@gshell)

Hace 2 a帽os, 1 mes

Gracias Jacob, eso tiene sentido y entiendo mejor el proceso del gancho.

En mi caso, las llamadas siempre deben ejecutarse solo cuando un usuario est谩 conectado, por lo que no veo la necesidad del gancho nopriv. De hecho, si una persona que no inici贸 sesi贸n ejecut贸 esta rutina, deber铆a devolver un error y un evento.

Sigo sin entender por qu茅 recibo el error HTTP400 DRAD REQUEST. 驴Puedo usar la misma URL AJAX (ajax_rsvp.ajax_url), para dos funciones de recuperaci贸n separadas (eventid_callback y rsvp_callback) o necesito tener URL 煤nicas para cada intercambio AJAX?

(@bcworkz)

Hace 2 a帽os, 1 mes

Admin-ajax.php puede manejar todas las funciones de recuperaci贸n que debe agregar. Es poco m谩s que elaborado switch(){} una estructura que realiza solicitudes de rutas a la llamada correcta. Las llamadas de devoluci贸n m煤ltiples se tratan realmente de configurar y por qu茅 se necesita un valor de acci贸n.

Su recuperaci贸n del controlador Ajax debe salir (), morir () o terminar el proceso. De lo contrario, PHP intenta devolver el flujo a la persona que llama, lo cual es completamente inesperado y es la causa del error.

(@gshell)

Hace 2 a帽os, 1 mes

Hola bcworkz, deber铆a haber atrapado el medio del dado () en la funci贸n de recuperaci贸n. Lo agregu茅 y no hizo ninguna diferencia. 驴Necesita un bot贸n de entrada o funci贸n para llamar a AJAX para operar? Cada ejemplo de una llamada AJAX parece tener un bot贸n Enter que lo activa. En mi caso, en este momento, agregu茅 la llamada para eliminar inmediatamente la informaci贸n de la p谩gina al cargar la p谩gina si la p谩gina tiene la ID y la clase correctas.

(@ josh401)

Hace 2 a帽os, 1 mes

No necesita un bot贸n de entrada o funci贸n. Puede ejecutar el ajax desde cualquier acci贸n de jquery. Tampoco necesitas diferentes nombres de actividades. Puede utilizar la misma acci贸n una y otra vez; mientras obtiene los datos que necesita en el lado de php.

1) Consola para iniciar sesi贸n ajax_rsvp.ajax_url variables de javascript y aseg煤rese de obtener la URL del sitio correcta antes de realizar su llamada ajax.

2) Cambie la forma en que localiza su script desde php:


wp_register_script( 'rsvp', plugins_url( '/js/rsvp.js', __FILE__ ) );
wp_localize_script( 'rsvp', 'ajax_rsvp', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
wp_enqueue_script( 'rsvp' );

Usa ese comando; registrar, luego localizar, luego poner en cola.

Esta respuesta fue modificada hace 2 a帽os, hace un mes por. Esta respuesta fue modificada hace 2 a帽os, hace un mes por.

(@gshell)

Hace 2 a帽os, 1 mes

Josh, gracias, prob茅 esa secuencia, pero no cambi贸.

驴Qu茅 significa su art铆culo 1)? He incluido un cuadro de alerta JS y la variable se muestra justo antes de la llamada ajax. 驴Hay algo m谩s que pueda hacer? Estoy buscando m谩s m茅todos para depurar el proceso ajax ya que todav铆a tengo problemas con 茅l, como puede ver.

Lo que me confunde es si cambio la l铆nea de acci贸n en el archivo JS de:

			data : {
				action: 'rsvp_callback',
				event_id_name : event_id
			},

A:

			data : {
				action: 'eventid_callback',
				event_id_name : event_id
			},

Encuentro un error en el registro de la consola:

HTTP400: BAD REQUEST - The request could not be processed by the server due to invalid syntax.
(XHR)POST - http://localhost:81/wordpress/wp-admin/admin-ajax.php

Usando la funci贸n rsvp_callback, la llamada AJAX funciona perfectamente aunque esa funci贸n hace cosas que no quiero hacer todo el tiempo.

El c贸digo para la funci贸n eventid_callback es bastante simple y no veo qu茅 me pasa.

add_action( 'wp_ajax_eventid_callback', 'eventid_callback' );
function eventid_callback() {
	$event_id = $_POST[event_id_name];
	echo "<p>Event ID from eventid_callback is: {$event_id} </p>";
	die();
}; // end of eventid_callback function

(@gshell)

Hace 2 a帽os, 1 mes

Creo que tengo el problema.

Inclu铆 la nueva recuperaci贸n eventi_id dentro de otra funci贸n del plugin, cuando la mov铆 fuera de esa funci贸n al c贸digo del plugin principal, funcion贸 correctamente.

Gracias a todos los que me ayudaron.

驴Solucion贸 tu problema??

0 / 0

Deja una respuesta 0

Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *