Как ускорить admin-ajax.php в WordPress - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть некоторый код для functions.php, который я вызываю через ajax во внешнем интерфейсе, я использую admin-ajax, загрузка которого занимает около 2-2,5 секунды, так как у меня много плагинов, и что обработчик ajax должен загрузить все ядро ​​wpи плагины данных, мне было интересно, как написать собственный обработчик ajax, который загружает только то, что требуется только для запуска моего фрагмента ниже. Суть моего кода в том, что он получает настраиваемые поля woocommerce через метаданные и читает заголовок HTTP для геолокациии реализовать некоторые переменные, которые я определил, чтобы создать кнопку со ссылкой.

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 Ответ

0 голосов
/ 28 сентября 2018

Похоже, вам все еще нужно использовать основные функции и функции WooCommerce в вашем действии Ajax.Итак, в основном вы будете использовать отдельное действие, которое не учитывает другие действия, подключенные к wp_ajax_*.Не уверен, что это сэкономит ваше время, но вы можете попробовать:

<?php
function simple_amz_link_ajax() {
    ?>
    <script>
        jQuery( document ).on( 'ready', function () {
            jQuery.ajax( {
                url: "<?php echo esc_url( home_url( '?amz=get_amz_btn' ) ); ?>",
                type: 'POST',
                data: {
                    postId: <?php echo absint( get_the_ID() ); ?>,
                    nonce: <?php echo wp_create_nonce( 'get_amz_btn' ); ?>,
                },
                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_footer', 'simple_amz_link_ajax' );

function simple_amz_button() {
    if ( check_ajax_referer( 'get_amz_btn', 'nonce', false ) && isset( $_GET['amz'] ) && 'get_amz_btn' === $_GET['amz'] ) {
        // 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 ( 'de' === ICL_LANGUAGE_CODE ) {
            $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>';
        } elseif ( 'en' === ICL_LANGUAGE_CODE )  {
            $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 ( 'DE' === $country_code || 'AT' === $country_code || 'CH' === $country_code || 'LI' === $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 ( 0 != $item->price && null != $item->price ) {
            ?>
            <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 ( 'simple' === $type && 0 != $item->price && null != $item->price ) {    
            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 
            }
        } elseif( 'simple' === $type && 0 == $item->price ) {  
            echo $not_avilable_country;
        }

        if ( is_null( $item->price ) ) {   
            echo $not_avilable_country;
        }

        die(); 
    }
}
add_action( 'template_redirect', 'simple_amz_button' );

Отказ от ответственности: Этот код не был проверен!

То, что вы делаете здесь, эточтобы настроить конечную точку, которая запускает требуемое действие для вашего Ajax, как и другую страницу, но вместо использования постоянной ссылки вы должны использовать пользовательский параметр запроса amz (практически отдельный wp-ajax.php).Вот почему мы используем хук template_redirect, чтобы проверить, определен ли наш пользовательский параметр запроса и имеет ли оно значение, и если это так, прекратить рендеринг чего-либо еще, кроме нашего действия Ajax.

Я также добавил одноразовый номер, потому что вы всегда должны использовать защиту ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...