Soubor admin-ajax.php, je součástí administrace a používá jej například Heartbeat API. Díky snadnosti jeho použití, jej často využívají pluginy, které jej volají na frontendu. A to třeba i WooCommerce.
Bohužel, snadnost, s jakou se dá tento soubor použít, pro práci s Ajaxem, láká tvůrce pluginů, aby jej nadužívali.
Když jsem pátral, po tom, proč je Musilda.cz tak pomalý, použil jsem test rychlost načítání, na http://www.webpagetest.org/.
Při výpisu testu, máte k dispozici dva výsledky, jeden pro první načtení a druhý, pro opakované načtení. Tento screen je z opakovaného načtení, kde je krásně vidět, že admin-ajax.php, je velkou brzdou načítání. Při opakovaném načtení, jsou statické soubory již nacacheovány, takže se ve výpise nezobrazují.
Abych zjistil, kde může být problém, využil jsem další test rychlosti, tentokrát https://gtmetrix.com/ a výsledek byl stejný.
Jak je vidět, stejný výsledek. Protože mám ověřeno ze dvou zdrojů, že admin-ajax.php brzdí web, budu muset zjistit, co jej tolikrát za sebou volá.
Nevím, zda to je dobře vidět na screenu, ale po rozkliknutí položky, se zobrazí záložky a na záložce Post, je vidět, jaká akce je volaná. V tomto případě mom_post_views. A protože se jedná o Ajax, WordPress má dva hooky, pomocí který můžete zavěšovat funkce, pro zpracování Ajax volání.
Takže jsem věděl, že musím hledat wp_ajax_mom_post_views a wp_ajax_nopriv_mom_post_views. Název hooků se skládá z předpony a názvu samotné akce. Takže pokud je volaná akce mom_post_views, bude hledaný hook wp_ajax_ + mom_post_views.
Protože je však ajax.admin.php primárně určen pro administraci, musím hledat ještě wp_ajax_nopriv_ + mom_post_views. To proto, že tento hook, umožní přístup k volání i pro nepřihlášené návštěvníky.
V jenom souboru jsem našel:
add_action( ‚wp_ajax_mom_post_views‘, ‚getPostViews‘ );
add_action( ‚wp_ajax_nopriv_mom_post_views‘, ‚getPostViews‘);
z čehož vyplývalo, že problémem je zobrazování počtu shlédnutí, které, z nějakého důvodu, volá šablona pomocí Ajaxu.
Což na hlavní straně je minimálně 18x. Náprava už byla jednoduchá, odstranil jsem z js funkci, která výužívala Ajax, v souboru šablony jsem našel místo, kde se získaná data zobrazovala a nahradil jsem tu část, pomocí get_post_meta.
Výsledek už je daleko lepší:
Když řeknu, že jsem zrychlil web o 2 vteřiny, nebude to tak znít, jako když napíšu: