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.
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).