Skip to content

Instantly share code, notes, and snippets.

@devinsays
Last active July 21, 2024 08:53
Show Gist options
  • Save devinsays/69a305053e35a10584f94d6011bba2d6 to your computer and use it in GitHub Desktop.
Save devinsays/69a305053e35a10584f94d6011bba2d6 to your computer and use it in GitHub Desktop.
Simple WordPress Ajax Example
<?php
function example_ajax_enqueue() {
// Enqueue javascript on the frontend.
wp_enqueue_script(
'example-ajax-script',
get_template_directory_uri() . '/js/simple-ajax-example.js',
array( 'jquery' )
);
// The wp_localize_script allows us to output the ajax_url path for our script to use.
wp_localize_script(
'example-ajax-script',
'example_ajax_obj',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'example-nonce' )
)
);
}
add_action( 'wp_enqueue_scripts', 'example_ajax_enqueue' );
jQuery(document).ready(function($) {
// We'll pass this variable to the PHP function example_ajax_request
var fruit = 'Banana';
// This does the ajax request
$.ajax({
url: example_ajax_obj.ajaxurl,
data: {
'action': 'example_ajax_request',
'fruit' : fruit,
'nonce' : example_ajax_obj.nonce
},
success:function(data) {
// This outputs the result of the ajax request
console.log(data);
},
error: function(errorThrown){
console.log(errorThrown);
}
});
});
<?php
function example_ajax_request() {
$nonce = $_POST['nonce'];
if ( ! wp_verify_nonce( $nonce, 'example-nonce' ) ) {
die( 'Nonce value cannot be verified.' );
}
// The $_REQUEST contains all the data sent via ajax
if ( isset( $_REQUEST ) ) {
$fruit = $_REQUEST['fruit'];
// Let's take the data that was sent and do something with it
if ( $fruit == 'Banana' ) {
$fruit = 'Apple';
}
// Now we'll return it to the javascript function
// Anything outputted will be returned in the response
echo $fruit;
// If you're debugging, it might be useful to see what was sent in the $_REQUEST
// print_r( $_REQUEST );
}
// Always die in functions echoing ajax content
die();
}
add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );
// If you wanted to also use the function for non-logged in users (in a theme for example)
add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );
@erikbml
Copy link

erikbml commented Jul 28, 2020

@jefreylandicho

Updated the gist to include the nonce validation. Hope that's helpful.

it is giving 400 bad error in the latest WordPress version

I had the same thing - first because I didn't had the handler function "example_ajax_request" implemented correctly

After that, I got that error because I was using the nopriv when logged in (or the other way around). When following the code correctly, it did work in the end.

@mTeden
Copy link

mTeden commented Dec 2, 2020

I can't get it to work. It's always returning Error 400 Bad Request.

  • function example_ajax_enqueue() {...} => functions.php (in theme directory with path checked at line 7)
  • js file (with permissions checked - 0755)
  • calling simple-ajax-example.php

Error:
jquery.js?ver=1.12.4-wp:4 GET wp-admin/admin-ajax.php?action=example_ajax_request&fruit=Banana&nonce=ae030e8819 400 (Bad Request)

Wordpress: 5.5.3
Theme: Directory2 (AIT-Themes)

@simpletome
Copy link

wp_verify_nonce( $nonce, 'example-ajax-script' ) should be wp_verify_nonce( $nonce, 'ajax-nonce' )
And your ajax request is missing method/type as post e.g method: "POST"

@gleenk
Copy link

gleenk commented Nov 24, 2021

wp_verify_nonce( $nonce, 'example-ajax-script' ) should be wp_verify_nonce( $nonce, 'ajax-nonce' ) And your ajax request is missing method/type as post e.g method: "POST"

He's right!

@blockifywp
Copy link

@devinsays
Copy link
Author

Sorry about that. Updated the gist to create example-nonce and then verify example-nonce.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment