J'ai du code sur functions.php que j'appelle via ajax sur frontend, j'utilise admin-ajax qui prend environ 2 à 2,5 secondes à charger car j'ai plusieurs plugins et que le gestionnaire ajax doit charger tous les fichiers wp core et plugins , Je me demandais comment écrire un gestionnaire ajax personnalisé qui ne charge que ce qui est nécessaire pour exécuter mon extrait ci-dessous, le résumé de mon code indique qu’il récupère des champs personnalisés woocommerce via les métadonnées et lit l’en-tête HTTP à des fins de géolocalisation et les variables que j'ai définies pour créer un bouton avec un lien.
function simple_amz_link_ajax() {
?>
<script>
jQuery(document).ready(function(){
jQuery.ajax({
url: "<?php echo admin_url('admin-ajax.php?action=get_amz_btn'); ?>",
type: 'POST',
data: {
action: 'get_simple_amz_button',
postId: <?php echo get_post()->ID; ?>
},
dataType: 'html',
success: function(response) {
jQuery("#buy_amz_btn_wrap").html(response);
}
});
});
</script>
<!-- end Ajax call to get_simple_amz_button -->
<div id="buy_amz_btn_wrap">
<div class="spinner">
<div class="bounce1"></div>
<div class="bounce2"></div>
<div class="bounce3"></div>
</div>
</div>
<?php
}
add_action('wp_ajax_get_simple_amz_button', 'simple_amz_button');
add_action('wp_ajax_nopriv_get_simple_amz_button', 'simple_amz_button');
function simple_amz_button() {
// Variables Declaration
$postId = filter_input( INPUT_POST, 'postId', FILTER_SANITIZE_NUMBER_INT );
$de_asin = get_post_meta( $postId, "wccaf_de_asin", true );
$country_code = $_SERVER ["HTTP_CF_IPCOUNTRY"];
$not_avilable_country = '<div id="amz_not_avilable" class="amz_not_avilable">This product is not avilable in your country yet</div>';
// Get Amazon Button Title
if (ICL_LANGUAGE_CODE == "de") {
$amz_btn_title = 'Kaufen auf Amazon';
$not_avilable_country = '<div id="amz_not_avilable" class="amz_not_avilable">Dieses Produkt ist in Ihrem Land noch nicht verfügbar</div>';
}
if (ICL_LANGUAGE_CODE == "en") {
$amz_btn_title = 'Buy on Amazon';
$not_avilable_country = '<div id="amz_not_avilable" class="amz_not_avilable">This product is not avilable in your country yet</div>';
}
//////////////////////////////////////////////
// Geolocation Condition
if ($country_code=="DE" or $country_code=="DE" or $country_code=="AT" or $country_code=="CH" or $country_code=="LI" or $country_code=="EG") {
$associate_id = "bonstato-21";
$access_key = "HDUHWUIDIUWJDWDWDWD";
$secret_key = "HDUIWQDUQWUDJUIQJWDJWQD";
$Amazon_domain = "Amazon.de";
$asin = $de_asin;
}
/**********************************************************************************/
// Get price from Amazon
$Amazon = new AmazonAPI($associate_id , $access_key, $secret_key , $Amazon_domain);
$item = $Amazon->item_lookup($asin)->get_item_data();
if ($item->price != "0" && $item->price != null ) {
?><div class="amz_price_wrap_wrap" >Price: <?php echo $item->price; ?></div><?php
}
global $post;
$product = wc_get_product( $postId );
$type = $product->get_type();
if( $type == 'simple' && $item->price != "0" && $item->price != null ){
if( wp_is_mobile() ) {
// Amazon Link For Mobile
?>
<div class="buy_amz_btn_wrap" >
<button type="button" id="buy_amz_btn" class="buy_amz_btn" onclick="window.location='https://<?php echo $Amazon_domain ?>/dp/<?php echo $asin ?>/?tag=<?php echo $associate_id ?>';"><i class="fa fa-Amazon fa-amz"></i><?php echo $amz_btn_title ?></button>
</div>
<?php
}
else {
// Amazon Link For PC
?>
<div class="buy_amz_btn_wrap" >
<button type="button" id="buy_amz_btn" class="buy_amz_btn" onclick="window.location='https://<?php echo $Amazon_domain ?>/gp/aws/cart/add.html?AssociateTag=<?php echo $associate_id ?>&ASIN.1=<?php echo $asin ?>&Quantity.1=1';"><i class="fa fa-Amazon fa-amz"></i><?php echo $amz_btn_title ?></button>
</div>
<?php
}
}
else if( $type == 'simple' && $item->price == "0"){
echo $not_avilable_country;
}
if(is_null($item->price)){
echo $not_avilable_country;
}
die();
}
Voici la réponse que vous recherchez:
Ajax prend 10x aussi longtemps qu'il devrait/pourrait
Malheureusement, la solution implique une connaissance très détaillée des pièces à charger/à ne pas charger et des raisons pour lesquelles des choses se casseraient. En lisant les problèmes/commentaires de github, il semble que cela ne fonctionne pas avec HTTPS.
Sinon, vous ne pouvez vraiment pas accélérer les choses, j'ai fait beaucoup de recherches à ce sujet.
Mais puis-je suggérer l'API REST? La RA est étonnante pour extraire simplement des données publiques. Pensez aux produits, aux publications et à toute autre information informative.
Cela a accéléré mes scripts d'une tonne lorsque j'ai décidé de basculer.
Essayez, voyez si cela convient à votre cas d'utilisation. D'après l'apparence, c'est le cas. Vous ne divulguez rien, de sorte qu'un terminal reposant sur des fonctions en lecture seule vous conviendrait mieux.
Voici mes tests 1: 1 de Rest API vs AJAX dans mon cas.
Je récupère simplement des données que je vais ensuite utiliser pour afficher -
WP AJAX:
function get_block_help_data(block_identifier) {
return jQuery.ajax({
url: block_help_data.ajax_url,
type: 'POST',
data: {
action: 'parse_block_help_request',
security: block_help_data.ajax_nonce,
block_identifier: block_identifier
},
});
}
Implémenté dans le back-end:
add_action( 'wp_ajax_parse_block_help_request', array( $this, 'parseBlockHelpRequest' ) );
public function parseBlockHelpRequest()
{
check_ajax_referer( 'block_help_nonce', 'security' );
$block_identifier = sanitize_text_field( $_POST['block_identifier'] );
//Check if the data is what we need.
if( ( empty( $block_identifier ) || is_wp_error( $block_identifier ) ) ) {
wp_send_json( 'Invalid data.', 500 );
return;
}
wp_send_json( DataPool::getBlockHelpItem( $block_identifier ) );
}
DU REPOS:
function get_block_help_data(block_identifier) {
return jQuery.ajax({
url: block_help_data.rest_link + block_identifier,
type: 'GET',
dataType: 'JSON'
});
}
Implémenté dans le back-end:
class BlockHelpREST extends \WP_REST_Controller
{
/**
* Holds the namespace for the REST endpoint.
*
* @var string
*/
protected $block_help_namespace = 'block_help/v';
/**
* Holds the version for the REST endpoint.
*
* @var string
*/
protected $block_help_version = '1';
public function __construct()
{
$this->hookRestRouteToServer();
}
/**
* Registers the main routes for the Block Help REST API.
*/
public function registerRoutes() {
$namespace = $this->block_help_namespace . $this->block_help_version;
$base = 'block_identification';
register_rest_route(
$namespace, '/' . $base,
array(
array(
'methods' => \WP_REST_Server::READABLE,
'callback' => array( new DataPool, 'getBlockHelpItemByREST' ),
//'permission_callback' => array( new Privileges, 'canLoadSprout' )
)
)
);
}
public function hookRestRouteToServer(){
add_action( 'rest_api_init', array( $this, 'registerRoutes' ) );
}
}
Plus de 20-30 passages (je sais, pas assez, mais je peux voir clairement avec les yeux que WP AJAX est un peu plus lent):
L’appel REST a pris: MOSTLY 150ms avec un maximum de 215.
L'appel de l'API toujours, sans exception, a pris au moins ~ 400-500ms.
Ne pas tenir compte de cela, ce sont des gains incroyables, mais rappelez-vous, l’échantillon est petit. Je vais continuer à tester et à mettre à jour car cela semble trop beau pour être vrai.