Pergunta de desenvolvimento do WordPress WordPress: vários recursos de chamada AJAX

Um usuário perguntou ?

Posso ter várias funções de restauração AJAX no mesmo plugin?

Eu criei um plugin que permite aos membros registrar ou cancelar um evento criado com o plugin Tribe Events. A função rsvp_callback é ativada pressionando vários botões e funciona corretamente. Em seguida, criei uma função eventid_callback para despachar o evento analisado da página de evento específica que aparece ao lado do servidor. Esta função cria um erro de console que diz:

HTTP400: DOUBLE REQUEST: O servidor não conseguiu processar o pedido devido a uma sintaxe inválida.

Eu revisei o código dezenas de vezes e não vejo o que está acontecendo comigo, fora isso, talvez eu não consiga fazer o que estou tentando fazer.

Coloquei o arquivo JS e a URL ajax no topo do plugin da seguinte forma:

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' )
	));
};

O código JS é para eventid_callback (observe que usei a mesma URL AJAX para ambas as funções e estou preocupado em não poder fazer isso). O aviso exibe corretamente o evento parsed_ antes da chamada 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
	};

A função eventid_callback é:

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

O eco não retorna valores. Outro problema que não entendo é o primeiro parâmetro da instrução add_action. Cada exemplo que eu vi coloca ‘wp_ajax_’ na frente de cada nome com uma função de reset que você decide usar. Eu não entendo o que essa primeira variável representa.

Qualquer comentário ou sugestão será muito apreciado. Obrigada

(@jakept)

2 anos, 1 mês atrás

O primeiro argumento de add_action é o nome do gancho. O segundo argumento é a função que será executada neste ladrão. Quando você envia uma solicitação para admin-ajax.php, o WordPress executa um gancho com o nome wp_ajax_ e então aconteça o que acontecer action enviar parâmetro enviar com solicitação.

Então, no seu exemplo, você está enviando esses dados para admin-ajax.php:

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

Neste exemplo o action é eventid_callbackentão, quando o WordPress recebe a solicitação, ele executa o arquivo wp_ajax_eventid_callback açao.

Quando você usa add_action() com este gancho de nome, ele permite que você execute uma função em resposta a solicitações AJAX com o nome de ação associado.

Portanto, para lidar com solicitações AJAX, você precisa criar uma ação para cada tipo de aplicativo que deseja manipular, portanto, em seu JavaScript, você precisa nomear essa ação como parte da solicitação.

Uma coisa que você sente falta é isso wp_ajax_ O gancho só funciona para usuários registrados. Para usuários offline, o WordPress tem um gancho separado. É a mesma ideia, mas o prefixo é wp_ajax_nopriv_.

Portanto, se você deseja que seu AJAX funcione para usuários de login e logout, você precisa usar os dois botões:

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

Esta resposta foi modificada há 2 anos, um mês atrás por.

(@gshell)

2 anos, 1 mês atrás

Obrigado Jacob, isso faz sentido e eu entendo melhor o processo do gancho.

No meu caso, as chamadas só devem ser feitas quando um usuário está logado, então não vejo a necessidade do gancho nopriv. Na verdade, se uma pessoa offline realizar essa rotina, ela deve retornar um erro e um evento.

Ainda não entendo por que estou recebendo o erro HTTP400 DRAD REQUEST. Posso usar a mesma URL AJAX (ajax_rsvp.ajax_url) para duas funções de busca separadas (eventid_callback e rsvp_callback) ou preciso ter URLs exclusivos para cada troca AJAX?

(@bcworkz)

2 anos, 1 mês atrás

Admin-ajax.php pode gerenciar todos os recursos de recuperação que você precisa adicionar. É pouco mais do que elaborado switch(){} uma estrutura que requer caminhos para a chamada correta. Mais retornos de chamada são realmente sobre configuração e por que um valor de ação é necessário.

A reversão do driver Ajax deve sair (), morrer () ou encerrar o processo. Caso contrário, o PHP tenta retornar o fluxo para o chamador, o que é completamente inesperado e é a causa do erro.

(@gshell)

2 anos, 1 mês atrás

Oi bcworkz, eu deveria ter agarrado o centro das porcas () na função de reset. Eu adicionei e não fez diferença. Você precisa de um botão de chamada ou uma função AJAX para funcionar? Cada exemplo de chamada AJAX parece ter um botão Enter que o ativa. No meu caso, neste ponto, adicionei a chamada para remover imediatamente as informações da página enquanto a página está carregando se a página tiver o ID e a classe corretos.

(@josh401)

2 anos, 1 mês atrás

Não são necessários botões ou funções de entrada. Você pode executar o ajax a partir de qualquer ação jquery. Além disso, não são necessários nomes comerciais diferentes. Você pode usar a mesma ação repetidamente; enquanto você obtém os dados necessários ao lado do php.

1) Consola de acesso ajax_rsvp.ajax_url javascript e certifique-se de obter o URL do site correto antes de fazer a chamada ajax.

2) Altere a maneira como você encontra seu script do 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' );

Use este comando; registrar, localizar e enfileirar.

Esta resposta foi modificada há 2 anos, um mês atrás por. Esta resposta foi modificada há 2 anos, um mês atrás por.

(@gshell)

2 anos, 1 mês atrás

Josh, obrigado, tentei esta sequência, mas não mudou.

O que seu artigo 1) significa? Eu incluí uma caixa de aviso JS e a variável aparece logo antes da chamada ajax. Há algo mais que eu possa fazer? Estou procurando mais métodos para depurar o processo ajax, pois ainda tenho problemas com ele, como você pode ver.

O que me confunde é se deve alterar a linha de ação no arquivo JS por:

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

UMA:

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

Encontrei um erro ao registrar o console:

HTTP400: BAD REQUEST - The request could not be processed by the server due to invalid syntax.
(XHR)POST - 

Usando a função rsvp_callback, a chamada AJAX funciona perfeitamente, embora essa função faça coisas que nem sempre quero fazer.

O código para a função eventid_callback é bem simples e não vejo o que há de errado comigo.

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)

2 anos, 1 mês atrás

Acho que tenho o problema.

Incluí a nova recuperação event_id dentro de outra função do plugin, quando a removi dessa função no código principal do plugin, funcionou bem.

Obrigado a todos que me ajudaram.

Isto foi útil?

0 / 0

Deixe uma resposta 0

O seu endereço de email não será publicado. Campos obrigatórios são marcados *