Ich verwende derzeit einen WP_Query
, der durch einen AJAX -Aufruf ausgelöst wird, wenn eine Taste gedrückt wird. Die Post-Meta-Felder lat
lng
werden als Standortdaten für eine Google-Karte verwendet. Die Abfrage gibt einwandfrei ohne AJAX aus, scheint jedoch nicht zu veranlassen, dass die Ergebnisse damit zurückgegeben werden.
Die Antwort, die ich erhalte - [{name: "", lng: null, lat: null}, {name: "", lng: null, lat: null}]
Jetzt glaube ich, dass der Fehler bei der Umwandlung der Ergebnisse in JSON in der json_encode
-Phase liegt, aber nicht zu sicher ist? Jede Hilfe wäre großartig, ziemlich neu für 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' );
Bilden
<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 ist nicht für JSON optimiert. Wenn Sie eine Antwort in JSON benötigen, verwenden Sie stattdessen die REST-API. Diese API generiert standardmäßig eine JSON-Antwort.
Sie müssen lediglich eine Restroute registrieren und auf die URL zugreifen:
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'
) );
});
Nun die Rückruffunktion:
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;
}
Jetzt können Sie Ihre JSON-Antwort erhalten, indem Sie die folgende URL aufrufen:
wp-json/scopeak/v2/my_json_response/
Zu Testzwecken können Sie die Methode POST
in GET
ändern und direkt auf diese URL zugreifen. Wenn Sie eine Antwort erhalten, ändern Sie diese in POST
und arbeiten Sie an Ihrem Javascript.
Das ist alles.
Wie erhalten Sie zuerst die Variablen $_POST
? Sie müssen sie bei Ihrem Ajax-Aufruf in Ihrem Objekt data
übergeben. Beispiel:
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;
});
});
Siehe diesen Artikel als Referenz.
Erstens tut es mir sehr leid, dass ich etwas spät antworte.
Zweitens müssen Sie die Werte Ihres Formulars mithilfe der Serialisierungsmethode abrufen. Überprüfen Sie das folgende Beispiel.
<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>