web-dev-qa-db-fra.com

Comment accélérer admin-ajax.php dans wordpress

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(); 

} 
1
Islam Mohamed

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.

2
coolpasta