WordPress

rozwój motywu — Dlaczego admin-ajax ładuje się powoli i jakie są sposoby na jego przyspieszenie?

  • 4 kwietnia, 2019
  • 5 min read
rozwój motywu — Dlaczego admin-ajax ładuje się powoli i jakie są sposoby na jego przyspieszenie?


Możliwe rozwiązanie

Myślę, że częścią twojego problemu jest \WP_Query call – wysyłanie zapytań do bazy danych nie jest „tanie” w kontekście wykonywania szybkich i wydajnych wywołań AJAX, ale w twojej sytuacji też nie da się tego uniknąć.

Jednym z podejść, jakie możesz zastosować, byłoby buforowanie wyników zapytania przez pewien czas, przynajmniej w takim przypadku będziesz mieć jedną początkowo powolną odpowiedź dla kategorii, a następnie szybkie odpowiedzi na kolejne zapytania.

function educaforma_filter_ajax(){
    $category_filter = "";

    if(isset($_POST['category'])){
        if($_POST['category'] == "todos"){
            $category_filter = "";
        }
        else{
            $category_filter = $_POST['category'];
        }
    }

    $output = "";
    $params = array(
        'product_cat'    => $category_filter,
        'posts_per_page' => 15,
        'post_type'      => 'product',
    );

    // Create a cache key based on the parameters and try to get a transient.
    $cache_key      = "educaforma_filter_results_" . implode( '_', $params );
    $cached_results = get_transient( $cache_key);

    if ( ! empty( $cached_results ) ) {
        echo $cached_results;
        exit;
    }

    $wc_query = new WP_Query($params);
    $count = $wc_query->post_count;
    $cont_post = 0; 
    if ($wc_query->have_posts()) : 
        while ($wc_query->have_posts()) :
            $wc_query->the_post(); 
    global $product;
    if($cont_post == 0): 

        $output .= "<div class="row">"; 

    elseif($cont_post%3 == 0):

        $output .= "</div>"; 
    $output .= "<div class="row">"; 

    endif;

    $output .= "<div class="col-md-4 col-sm-4">";
    // <!-- <div class="container-course"> -->
    $output .= "<a class="list-course" href="".$product->get_permalink()."">";

    // $output .= the_post_thumbnail();
    // $output .= $product->get_image(artiest,1,1); 
    $attachment_id = get_post_thumbnail_id( $product->id );
    $attachment = wp_get_attachment_image_src($attachment_id, 'full' );
    $output .= "<div class="image-product" style="position: relative;
    background-repeat: no-repeat;
    background-position: 50% 50%;
    background-size: cover;
    background-clip: border-box;
    box-sizing: border-box;
overflow: hidden;
height: 180px;
width: 100%;
       background-image: url(".$attachment[0].") !important;
       ">
           <div class="darken-image"></div>
           </div>";
       $output .= "<div class="separator"></div>";
       $output .= "<div class="container-course">";
       $output .= "<h3 class="title-course">";
       // $output .= the_title(); 
       $output .= $product->get_title();

       $output .= "</h3>";
       //the_excerpt(); 
       $output .= "<p class="title-attribute">Curso:  <span class="value-attribute">".$product->get_attribute('Curso')." </span></p>";
       $output .= "<p class="title-attribute">Inicio:  <span class="value-attribute">". $product->get_attribute('Inicio')." </span></p>";
       $output .= "<p class="title-attribute">Finalización:  <span class="value-attribute">". $product->get_attribute('Finalizacion')." </span></p>";
       $output .= "<p class="title-attribute">Precio:  <span class="value-attribute">".$product->get_attribute('Precio')." </span></p>";
       $output .= "<p class="title-attribute">Avalado por: <span class="value-attribute"> ".$product->get_attribute('Avalado')." </span></p>";
       $output .= "</div>";
       $output .= "</a>";
       $output .= "</div>";

       $cont_post++; 
       endwhile; 
       wp_reset_postdata(); 
else:  
       $ouput.= "<li>";
       $ouput .= "No hay cursos";
       $output.="</li>";
       endif; 

    // Set the transient here!
    set_transient( $cache_key, $output, DAY_IN_SECONDS );
    echo $output;

}

W powyższym fragmencie dodałem następujące wiersze:

    // Create a cache key based on the parameters and try to get a transient.
    $cache_key      = "educaforma_filter_results_" . implode( '_', $params );
    $cached_results = get_transient( $cache_key);

    if ( ! empty( $cached_results ) ) {
        echo $cached_results;
        exit;
    }

Spowoduje to utworzenie „klucza” na podstawie parametrów i próbę znalezienia pasującego stanu przejściowego o tej nazwie. Poniżej:

    // Set the transient here!
    set_transient( $cache_key, $output, DAY_IN_SECONDS );
    echo $output;

Ustawia to stan przejściowy, jeśli nie zatrzymaliśmy się wcześniej, kiedy go znaleźliśmy. Teraz, gdy następnym razem ktoś zapyta o tę samą kategorię, stan przejściowy zostanie ustawiony, a wyniki powinny zostać zwrócone bardzo szybko.

Warto przeczytać!  Jak zduplikować bazę danych WordPress za pomocą phpMyAdmin

Zauważ również, że wygaśnięcie jest ustawione na 24 godziny (DAY_IN_SECONDS). Możesz chcieć, aby był krótszy lub dłuższy, a w zależności od tego, jak często aktualizujesz zawartość, możesz potrzebować innego sposobu unieważnienia stanów przejściowych.

O powolności zapytań

Jednym z powodów, dla których zapytanie może działać wolno, jest użycie parametru niestandardowego, product_cat, co, jak zakładam, analizujesz gdzieś w jakimś filtrze w zapytaniu i prawdopodobnie odnosi się to do relacji terminów. Oznacza to, że WordPress DOŁĄCZA kilka tabel, co może być nieco powolne, w zależności od Twojej bazy danych.

Ponadto opóźniasz swoją odpowiedź o 600 milisekund setTimeout – Wiem, że to nie jest dużo, ale weź pod uwagę, że dodajesz więcej niż pół sekundy do i tak już powolnej reakcji.

Nie jestem pewien, co możesz zrobić, aby szybciej udostępniać zawartość poza buforowaniem, przynajmniej bez zagłębiania się w wewnętrzne elementy witryny. Dodanie jakiejś formy wizualnej informacji zwrotnej – takiej jak pokrętło ładowania – mogłoby przynajmniej poinformować użytkowników, że coś się dzieje i przynajmniej pomóc w postrzeganiu czasu ładowania Twojej witryny (nawet jeśli w rzeczywistości nie przebiega szybciej).

Warto przeczytać!  php — Wyświetlanie nazwy podkategorii i łącza zamiast kategorii nadrzędnej


Źródło