J'utilise actuellement un WP_Query
qui déclenchera un appel AJAX lorsqu'un bouton est enfoncé. Les champs post-méta lat
lng
seront utilisés comme données de localisation pour une carte Google. La requête génère très bien sans AJAX mais ne semble pas pouvoir l’obtenir pour renvoyer les résultats.
La réponse que je reçois - [{name: "", lng: null, lat: null}, {name: "", lng: null, lat: null}]
Maintenant, je crois que l’erreur est lors de la transformation des résultats en JSON au stade json_encode
, mais vous n’êtes pas trop sûr? Toute aide serait formidable, assez nouvelle pour AJAX!
Function.php
<?php
//Search Function
function ek_search(){
$args = array(
'orderby' => 'date',
'order' => $_POST['date'],
'post_type' => 'property',
'posts_per_page' => 20,
'date_query' => array(
array(
'after' => $_POST['property_added']
),
),
);
$query = new WP_Query( $args );
$posts = $query->get_posts();
foreach( $posts as $post ) {
$locations[] = array(
"name" => get_the_title(),
"lng" => get_field('loc_lng'),
"lat" => get_field('loc_lat')
);
}
$location = json_encode($locations);
echo $location;
die();
}
add_action( 'wp_ajax_nopriv_ek_search', 'ek_search' );
add_action( 'wp_ajax_ek_search', 'ek_search' );
Forme
<form id="filter">
<button>Search</button>
<input type="hidden" name="action" value="ek_search">
</form>
JS
jQuery(function($){
$('#filter').submit(function(){
var filter = $('#filter');
var ajaxurl = '<?php echo admin_url("admin-ajax.php", null); ?>';
data = { action: "ek_search"};
$.ajax({
url: ajaxurl,
data:data,
type: 'post',
dataType: 'json',
success: function(response) {
console.log(response);
}
});
return false;
});
});
Admin-AJAX n'est pas optimisé pour JSON. Si vous avez besoin que votre réponse soit en JSON, utilisez plutôt l'API REST. Cette API génère une réponse JSON par défaut.
Tout ce que vous avez à faire est d’enregistrer une route de repos et d’accéder à l’URL:
add_action( 'rest_api_init', function () {
//Path to REST route and the callback function
register_rest_route( 'scopeak/v2', '/my_request/', array(
'methods' => 'POST',
'callback' => 'my_json_response'
) );
});
Maintenant, la fonction de rappel:
function my_json_response(){
$args = array(
'orderby' => 'date',
'order' => $_POST['date'],
'post_type' => 'property',
'posts_per_page' => 20,
'date_query' => array(
array(
'after' => $_POST['property_added']
),
),
);
$query = new WP_Query( $args );
if($query->have_posts()){
while($query->have_posts()){
$query->the_post();
$locations[]['name'] = get_the_title();
$locations[]['lat'] = get_field('loc_lng');
$locations[]['lng'] = get_field('loc_lat');
}
}
//Return the data
return $locations;
}
Maintenant, vous pouvez obtenir votre réponse JSON en visitant l'URL suivante:
wp-json/scopeak/v2/my_json_response/
À des fins de test, vous pouvez modifier la méthode POST
en GET
et accéder directement à cette URL. Si vous obtenez une réponse, remettez-la de nouveau en POST
et travaillez sur votre javascript.
C'est tout.
Tout d’abord, comment obtenez-vous les variables $_POST
? vous devez les transmettre dans votre objet data
lors de votre appel ajax. Exemple:
jQuery(function($){
$('#filter').submit(function(){
var filter = $('#filter');
var ajaxurl = '<?php echo admin_url("admin-ajax.php", null); ?>';
data = { action: 'ek_search', date: date, property_added: property};
$.ajax({
url: ajaxurl,
data:data,
type: 'post',
dataType: 'json',
success: function(response) {
console.log(response);
}
});
return false;
});
});
Voir ceci Article pour référence.
Tout d'abord, je suis vraiment désolé d'avoir répondu un peu en retard.
Deuxièmement, vous devez obtenir les valeurs de votre formulaire à l'aide de la méthode sérialiser. Consultez l'exemple ci-dessous.
<form id="filter">
<input type="button" name="smt" value="Submit" id="smt" />
<input type="hidden" name="action" value="ek_search">
</form>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
var form=$("#filter");
$("#smt").click(function(){
$.ajax({
type:"POST",
url:form.attr("action"),
data:form.serialize(),
success: function(response){
console.log(response);
}
});
});
});
</script>