Pregunta sobre Developing with WordPress de Wordpress:

Listados desplegables AJAX

Un usuario preguntó 👇

Estoy desarrollando un plugin personalizado que tiene una lista desplegable que obtiene valor y texto de la base de datos. Luego tengo otra lista desplegable que debe completarse en función del valor desplegable seleccionado anteriormente.

Aquí está mi código para AJAX, pero no parece estar funcionando. Mi código jquery está en un archivo js separado…. /plugindir/customplugin/js/jsscript.js

jQuery(document).ready(function() {
jQuery('#ddlSchool').change(function(){
var school=jQuery('#ddlSchool').val();
jQuery('#ddlResVisit').empty(); //remove all existing options
jQuery.ajax({
			type: 'POST',
       dataType: 'json',
            url: residential_visits.ajaxurl,
            data: {
        	'action' : 'residential_visits',
	        'school' : school
                },
	complete: function( response ) {
		console.log(response );
		alert(response.responseText);
         );
	}
      });
   });
});

Archivo de plugin personalizado que contiene mi php y html

<?php
//Load CSS and Javascript Files
wp_register_style('my_styles', plugins_url('css/styles.css', __FILE__));
wp_enqueue_style('my_styles');
wp_enqueue_script( 'jquery' );
wp_register_script('ajax-script', plugins_url('js/jsscripts.js', __FILE__), array('jquery'),'1.1');
wp_enqueue_script('ajax-script');
wp_localize_script( 'ajax-script', 'residential_visits', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
 // THE AJAX ADD ACTIONS
add_action( 'wp_ajax_residential_visits', 'residential_visits');
add_action( 'wp_ajax_nopriv_residential_visits', 'residential_visits');

//Function to be called from AJAX SCRIPT
function residential_visits() {
ob_clean();
$school = $_POST['ddlSchool'];
global $wpdb;

$result = get_results("select id, group_name from wp_pods_residential_visits where school='$school'");
$main = array('data'=>$result);
echo json_encode($main);
    // Don't forget to stop execution afterward.
wp_die();
}

Y finalmente el código de mi primera lista desplegable

<?php 
//get list of schools
global $wpdb;
$schools = $wpdb->get_results("Select abbr_code, school_name from wp_pods_schools order by school_name;");
?>
<label for"ddlSchools">School Attending:</label>
<select name="ddlSchool" id="ddlSchool">
<?php
foreach ($schools as $school){
?>
<option value="<?php echo $school->abbr_code ?>"><?php echo $school->school_name ?></option>
 <?php
}
  ?>
</select>

Agradeceríamos cualquier ayuda ya que no veo por qué no está funcionando.

gracias Jamie

Este tema fue modificado hace 3 años, 2 meses por. Motivo: código fijo – bbcode no funciona

(@bcworkz)

Hace 3 años, 2 meses

En la función residence_visits (), ¿se declara get_results () en algún lugar de su código? No es una función estándar de WP o PHP. Es posible que haya querido que fuera así: $result = $wpdb->get_results('your SQL here');?

FYI, como bbcode [code] Aquí no funciona. Utilice comillas invertidas o el botón de código. Agradecemos el esfuerzo de un buen formato 🙂

Lanzador de hilos

(@jamiesw)

Hace 3 años, 2 meses

lo siento, está destinado a ser $result = $wpdb->get_results('your SQL here'); pero incluso una actualización que no marcó la diferencia, ¿dónde más me he perdido algo o he escrito mal algo? muchas gracias Jamie

Lanzador de hilos

(@jamiesw)

Hace 3 años, 2 meses

En la salida de mi consola, ahora recibo 400 solicitudes incorrectas (VM2647: 1 http://my.desktopserver.dev/wp-admin/admin-ajax.php 400 Petición Incorrecta))

Llamar a mi función php directamente en la página funciona y hacer eco de la información correcta en la página, así que sé que la función funciona. también en mi jsscript.js hice el alert(residential_visits.ajaxurl); y muestra la URL admin-ajax.php según lo previsto.

ARCHIVO JSSCRIPTS:

jQuery(document).ready(function() {
jQuery('#ddlSchool').change(function(){
//var st=$('#category option:selected').text();
var school=jQuery('#ddlSchool').val();
jQuery('#ddlResVisit').empty(); //remove all existing options
jQuery.ajax({
			type: 'POST',
			dataType: 'json',
			contentType: "application/json",
			url: residential_visits.ajaxurl,
			data: {
				'action' : 'residential_visits',
				'school' : school
			},
			complete: function( response ) {
				console.log(response);
				//alert(response.responseJSON.body);				
			}
		});
	});
});

Archivo PHP en mi carpeta de plugins personalizados (este archivo php crea el contenido utilizado en la página como acceso directo, no sé si esto hace una diferencia) ¿Mi función PHP debe estar en otro lugar para ver el controlador ajax?


<?php
// Registration form
//Load CSS and Javascript Files
wp_register_style('reg_styles', plugins_url('css/styles.css', __FILE__));
wp_enqueue_style('reg_styles');

wp_register_script('ajax-script', plugins_url('js/jsscripts.js', __FILE__), array('jquery'),'1.1');
wp_enqueue_script('ajax-script');
wp_localize_script( 'ajax-script', 'residential_visits', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
 // THE AJAX ADD ACTIONS
add_action( 'wp_ajax_residential_visits', 'residential_visits');
add_action( 'wp_ajax_nopriv_residential_visits', 'residential_visits');
//residential_visits(); -WHEN ENABLED IT SHOWS THE DATA SO IT WORKS

function residential_visits() {
ob_clean();
// Handle request then generate response using WP_Ajax_Response
global $wpdb;
$result = $wpdb->get_results("select id, group_name from wp_pods_residential_visits ");
//$main = array('data'=>$result);
echo json_encode($result);
// Don't forget to stop execution afterward.
wp_die();
}
}
if (!empty($_POST)){
//Pass Form Data to Save Function
saveRegData($_POST);
echo "<h2>Thank you for submitting the registration information.</h2>";
}
else{
//Display Registration Form
?>
<form method="post" name="frmVisit" id="frmVisit">
<table id="tblRegistration" name="tblRegistration" class="tblRegForm">
<!-- Other form Fields -->
<tr>
<td colspan="2"><h3>School Details</h3></td>
</tr>
<tr>
<td colspan="2">
<?php 
// Get list of schools
global $wpdb;
$schools = $wpdb->get_results("Select abbr_code, school_name from wp_pods_schools order by school_name;");
?>
<label for"ddlSchools">School Attending:</label>
<select name="ddlSchool" id="ddlSchool">
<?php
foreach ($schools as $school){
?>
<option value="<?php echo $school->abbr_code ?>"><?php echo $school->school_name ?></option>
<?php } ?>
</select>

<select id="ddlResVisit" name="ddlResVisit">
</select>
   <!-- Rest of HTML, PHP to save data etc -->

¿Algun consejo?

Jamie

(@bcworkz)

Hace 3 años, 2 meses

Si su función está disponible en código WP estándar, por ejemplo, en una plantilla, estará disponible para los controladores Ajax, asumiendo que la solicitud Ajax se envía a través de admin-ajax.php.

Creo que tu problema es el encabezado contentType. Los datos enviados no son JSON, son texto sin formato. Er, bueno, algo así. Captura un objeto simple como datos: y jQuery lo convierte automáticamente en una cadena de datos. Entonces, cuando el servidor recibe los datos, es texto sin formato. Intenta correr text/plain o el predeterminado application/x-www-form-urlencoded en lugar de. Tenga en cuenta que dataType json está bien, por lo que lo necesita de nuevo.

¿Solucionó tu problema??

0 / 0

Deja una respuesta 0

Tu dirección de correo electrónico no será publicada.