如何在WordPress中加速admin-ajax.php

时间:2018-09-27 作者:Islam Mohamed

我有一些函数代码。我在前端通过ajax调用的php,我使用的是admin ajax,加载大约需要2到2.5秒,因为我有很多插件,ajax处理程序需要加载所有wp核心和插件数据,我想知道如何编写一个自定义ajax处理程序,只加载运行下面代码段所需的内容,我的代码的要点是,它通过获取元数据和读取HTTP头来获取woocommerce自定义字段,以便进行地理定位,并实现我定义的一些变量来创建带有链接的按钮。

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 个回复
SO网友:coolpasta

以下是您正在搜索的答案:

Ajax takes 10x as long as it should/could

不幸的是,那里的解决方案需要非常详细的知识,包括哪些部件需要加载/哪些部件不需要加载以及为什么东西会断裂。通过阅读github问题/评论,这似乎不适用于HTTPS。

否则,你真的无法加速,我已经对此进行了广泛的研究。

但是我可以推荐REST API吗?RA只需提取公开的数据就可以了。想想产品、帖子和任何其他只是信息性的信息。

当我决定切换时,这使我的脚本速度加快了很多。

尝试一下,看看它是否适合您的用例。从表面上看,确实如此。您没有透露任何信息,因此具有只读函数的rest端点将适合您。

这里是我对Rest API与AJAX的1:1测试。

我只是检索一些数据,然后用它们来显示-

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
        },
    });
}
在后端实现:

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 ) );
}
休息时间:

function get_block_help_data(block_identifier) {

    return jQuery.ajax({
        url: block_help_data.rest_link + block_identifier,
        type: \'GET\',
        dataType: \'JSON\'
    });
}
在后端实现:

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\' ) );
    }
}
超过20-30次运行(我知道,这还不够,但我可以清楚地看到WP AJAX有点慢):

其余通话时间:MOSTLY 150ms with one high of 215.

API调用始终,without exception, took at least ~400-500ms.

忽略这一点,这是难以置信的收获,但请记住,样本很小。我会继续测试和更新,因为它看起来确实太好了,不可能是真的。

结束

相关推荐

为什么我不能通过AJAX获取自定义字段值或帖子ID?

我编写了一个基于访问者位置生成链接的代码,它工作得很好,但我发现生成的代码会被缓存,因为我使用的是全页缓存,所以我认为为了解决这个问题,我可以使用ajax加载该链接。我使用了下面的代码,这些代码在获取一些我需要的变量时非常有效,例如位置变量和链接域变量等。。但是,我无法获取WooCommerce自定义字段数据,甚至无法获取产品id,它只返回空白。我使用这段代码来获取自定义字段,该字段在函数中直接使用时效果很好,但在ajax中无法正常工作$uk_asin = get_post_meta(get_post()