I just spent awhile tracking down some odd AJAX behavior that was puzzling me, so I thought I’d share the solution. I was working on a plugin to extend P2 and my AJAX requests were always responding with -1. After a lot of digging and some trial-and-error, I figured out that it was happening because I was using P2’s ajaxUrl variable.
Normally it’d be better to reuse the existing variable than create a redundant one, but P2 adds a ‘p2ajax=true‘ parameter to the URL, which triggers a condition in P2Ajax::dispatch() which short-circuits any other AJAX calls.
if ( defined('DOING_AJAX') && DOING_AJAX && isset( $_REQUEST['p2ajax'] ) ) { add_action( 'admin_init', array( 'P2Ajax', 'dispatch' ) ); } // [...] function dispatch() { $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : ''; do_action( "p2_ajax", $action ); if ( is_callable( array( 'P2Ajax', $action ) ) ) call_user_func( array( 'P2Ajax', $action ) ); else die( '-1' ); exit; }
The solution is to use _wpUtilSettings.ajax.url from Core’s utils script, or do something like this in the request:
ajaxUrl.replace( 'p2ajax=true', 'p2ajax=false' )