Ajax zajmuje 10x tyle, ile powinien / mógłby

50

Właśnie uderzyłem w swój pierwszy poważny problem z WordPress, a dla kogoś, kto lubi Ajax, jest to sprytna sprawa.

Mam żądanie Ajax, którego wypełnienie zajmuje 1,5 sekundy podczas korzystania z interfejsu API Ajax.

Jeśli wezmę ten sam dokładny kod i uruchomię go ze skryptem niestandardowym (bez WordPressa), żądanie Ajax zajmie tylko 150 milisekund. To nie jest przesada

Jeśli spojrzysz na pierwszy komentarz http://wp.smashingmagazine.com/2011/10/18/how-to-use-ajax-in-wordpress/, a następująca rozmowa zobaczy, że ta powolność jest spowodowana przez fakt, że na twoją prośbę wszystkie WP są ładowane ...

Mam nadzieję, że istnieje rozwiązanie, które umożliwi wysyłanie żądań Ajax bez ładowania całego WordPressa.

Jakie są twoje doświadczenia z przyspieszaniem żądań Ajax za pomocą WordPress?

Mikrofon
źródło
3
Zastanawiam się, czy popularne wtyczki pamięci podręcznej obejmują tę sytuację.
Raphael,
@ Rafael, też o tym myślałem, ale nie wspomniałem o tym. Byłoby WIELKIE, gdyby tak zrobili
Mike

Odpowiedzi:

57

Tak, to paskudny problem, że aby mieć pełne środowisko WordPress, musisz poświęcić sporo czasu na jego ładowanie.

Potrzebowałem dużo lepszej wydajności (dla bardzo dynamicznej funkcji wyszukiwania przyrostowego) do pracy, a do tego poszedłem:

  1. Plik niestandardowy jako moduł obsługi Ajax.
  2. Stała SHORTINIT dla ograniczonego obciążenia rdzenia WP.
  3. Bardzo selektywnie ładowane części rdzenia, tylko te potrzebne do zadania.

Zapewnia to bardzo ograniczone środowisko, ale wydajność jest o wiele lepsza i zachowany jest rozsądny stopień zgodności z WP (począwszy od $wpdb).

Oto mój plik ładujący, nie jest ładny, ale działa na określone potrzeby:

<?php

ini_set('html_errors', 0);
define('SHORTINIT', true);

require '../../../../wp-load.php';
require( ABSPATH . WPINC . '/formatting.php' );
require( ABSPATH . WPINC . '/meta.php' );
require( ABSPATH . WPINC . '/post.php' );
wp_plugin_directory_constants();

// stuff goes here
Rarst
źródło
1
Co rozumiesz przez określenie SHORTINIT? Czy możesz podać przykłady? Wyobrażam sobie, że będę musiał skonfigurować własne programy obsługi o różnym stopniu załadowania WP w zależności od potrzeby żądania, ale chciałbym zobaczyć kilka przykładów, które stworzyłeś.
Mike
6
@Mike nie jest powszechnie znany, ale bardzo prosty w koncepcji - jeśli SHORTINITustawiona jest stała WP nie ładowałoby większości rdzenia (brak większości interfejsów API / funkcji, brak wtyczek, brak motywu). Dodam trochę kodu, aby odpowiedzieć.
Rarst
1
To wygląda dobrze. Po prostu nie podoba mi się fakt, że musimy używać wymagają „../../../../wp-load.php”; dzięki czemu jest to dość niestandardowe. Martwię się również, jak łatwo można pobrać zasoby, których „potrzebujesz”, z mojego doświadczenia wynika, że ​​WordPress nie jest bardzo modułowy.
Mike
@Mike poprawne, ale nawet w przypadku problemów jest znacznie lepsze niż punkt końcowy, który nie ma pojęcia o WP w ogóle. Można to (i należy) poprawić jeszcze bardziej, ale w tej chwili nie jest to dla mnie pilne zadanie.
Rarst
Czy istnieją jakieś metody wykrywania lokalizacji pliku wp-load.php z poziomu WordPress? Na przykład, czy mogę zapisać plik statyczny ze ścieżką ustawioną w nim jako zmienną podczas ładowania wtyczki, a następnie dołączyć ten plik do autonomicznego pliku odpowiedzi Ajax?
hereswhatidid
0

Znalazłem to i przyspieszyło to moją aukcję.

function my_deregister_heartbeat() {
    global $pagenow;

    if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
         wp_deregister_script('heartbeat');
         wp_register_script('heartbeat', false);
     }
}
add_action( 'admin_enqueue_scripts', 'my_deregister_heartbeat' );
Lisa Daugherty Thompson
źródło