WordPress como uma boa API para lidar com solicitações Ajax, mas em alguns casos é uma grande sobrecarga incluir todo o ambiente WordPress para coisas simples. Portanto, defina sua própria versão leve de um manipulador ajax:
<?php
//mimic the actual admin-ajax
define('DOING_AJAX', true);
if (!isset( $_POST['action']))
die('-1');
ini_set('html_errors', 0);
//make sure we skip most of the loading which we might not need
//http://core.trac.wordpress.org/browser/branches/3.4/wp-settings.php#L99
define('SHORTINIT', true);
//make sure you update this line
//to the relative location of the wp-load.php
require_once('../../../../../wp-load.php');
//Typical headers
header('Content-Type: text/html');
send_nosniff_header();
//Disable caching
header('Cache-Control: no-cache');
header('Pragma: no-cache');
//Include only the files and function we need
require( ABSPATH . WPINC . '/formatting.php' );
require( ABSPATH . WPINC . '/meta.php' );
require( ABSPATH . WPINC . '/post.php' );
wp_plugin_directory_constants();
//and do your stuff
Mas isso é para coisas muito específicas quando você sabe onde estão localizadas as funções de que você precisa e suas dependências, para saber quais arquivos incluir.
Mas se você não fizer isso (que geralmente é o meu caso), aqui está uma versão mais genérica de um manipulador de Ajax personalizado:
<?php
//mimic the actuall admin-ajax
define('DOING_AJAX', true);
if (!isset( $_POST['action']))
die('-1');
//make sure you update this line
//to the relative location of the wp-load.php
require_once('../../../../../wp-load.php');
//Typical headers
header('Content-Type: text/html');
send_nosniff_header();
//Disable caching
header('Cache-Control: no-cache');
header('Pragma: no-cache');
Quase o mesmo, mas a inclusão do arquivo é feita para nós.
Em seguida, precisamos chamar os métodos reais que queremos invocar para:
$action = esc_attr(trim($_POST['action']));
//A bit of security
$allowed_actions = array(
'my_allow_action_1',
'my_allow_action_2',
'my_allow_action_3',
'my_allow_action_4',
'my_allow_action_5'
);
if(in_array($action, $allowed_actions)){
if(is_user_logged_in())
do_action('MY_AJAX_HANDLER_'.$action);
else
do_action('MY_AJAX_HANDLER_nopriv_'.$action);
}
else{
die('-1');
}
Portanto, obtemos MY CUSTOM AJAX.php:
<?php
//mimic the actuall admin-ajax
define('DOING_AJAX', true);
if (!isset( $_POST['action']))
die('-1');
//make sure you update this line
//to the relative location of the wp-load.php
require_once('../../../../../wp-load.php');
//Typical headers
header('Content-Type: text/html');
send_nosniff_header();
//Disable caching
header('Cache-Control: no-cache');
header('Pragma: no-cache');
$action = esc_attr(trim($_POST['action']));
//A bit of security
$allowed_actions = array(
'my_allow_action_1',
'my_allow_action_2',
'my_allow_action_3',
'my_allow_action_4',
'my_allow_action_5'
);
if(in_array($action, $allowed_actions)){
if(is_user_logged_in())
do_action('MY_AJAX_HANDLER_'.$action);
else
do_action('MY_AJAX_HANDLER_nopriv_'.$action);
}
else{
die('-1');
}
Em seguida, só precisamos conectar nossos retornos de chamada a este manipulador, assim:
//For logged in users
add_action('MY_AJAX_HANDLER_{$action_name}','function_callback_name');
//For logged out users
add_action('MY_AJAX_HANDLER_nopriv_{$action_name}','function_callback_name');
E tudo o que resta é simplesmente chamar make sua solicitação ajax para este arquivo recém-criado, assim:
jQuery(document).ready(function($){
var data={
action:'action_name',
otherData: 'otherValue'
};
$.post('http://url/to/your/MY_CUSTOM_AJAX.php', data, function(response){
alert(response);
});
});
Aproveite a velocidade!