Faster Ajax para WordPress

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!