Ajax membutuhkan 10x selama itu seharusnya / bisa

50

Saya baru saja mencapai masalah serius pertama saya dengan WordPress dan bagi seseorang yang menikmati Ajax ini adalah masalah besar.

Saya memiliki permintaan Ajax yang membutuhkan waktu 1,5 detik untuk selesai saat menggunakan Ajax API.

Jika saya mengambil kode persis yang sama dan menjalankannya dengan skrip khusus (tanpa WordPress) permintaan Ajax hanya membutuhkan 150 milidetik. Hal ini tidak berlebihan

Jika Anda melihat komentar pertama dari http://wp.smashingmagazine.com/2011/10/18/how-to-use-ajax-in-wordpress/ dan percakapan yang mengikuti Anda akan melihat bahwa kelambatan ini disebabkan oleh fakta bahwa atas permintaan Anda, semua WP dimuat ...

Saya berharap ada solusi di luar sana yang akan memungkinkan untuk membuat permintaan Ajax sambil tidak memuat semua WordPress.

Apa pengalaman Anda dengan mempercepat permintaan Ajax dengan WordPress?

Mike
sumber
3
Saya bertanya-tanya apakah plugin caching populer menutupi situasi ini.
Raphael
@ Raphael, saya memikirkan hal itu juga, tetapi belum melihat adanya penyebutan. Itu akan menjadi HEBAT jika mereka melakukannya
Mike

Jawaban:

57

Yap, ini adalah masalah buruk yang harus memiliki lingkungan WordPress penuh Anda perlu menghabiskan banyak waktu memuatnya.

Saya membutuhkan kinerja yang jauh lebih baik (untuk fitur pencarian inkremental yang sangat dinamis) untuk pekerjaan dan yang saya ikuti adalah:

  1. File khusus sebagai penangan Ajax.
  2. Konstanta SHORTINIT untuk beban inti WP yang terbatas.
  3. Bagian inti yang dimuat sangat selektif, hanya yang dibutuhkan untuk tugas itu.

Ini memberikan lingkungan yang sangat terbatas, tetapi kinerja adalah cara yang jauh lebih baik dan tingkat kompatibilitas yang wajar dengan WP (dimulai dengan $wpdb) dipertahankan.

Ini adalah memulai file loader saya, tidak cantik tetapi berfungsi untuk kebutuhan spesifik:

<?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
Jarang
sumber
1
Apa yang Anda maksud dengan kontestan SHORTINIT? Bisakah Anda memberikan contoh? Saya membayangkan bahwa saya akan perlu mengatur penangan saya sendiri dengan berbagai tingkat WP yang dimuat tergantung pada kebutuhan permintaan, tetapi saya ingin melihat beberapa contoh yang telah Anda buat.
Mike
6
@ Mike itu tidak dikenal luas tetapi benar-benar sederhana dalam konsep - jika SHORTINITkonstan diatur WP tidak akan memuat sebagian besar inti (tidak ada sebagian besar API / fungsi, tidak ada plugin, tidak ada tema). Saya akan menambahkan beberapa kode untuk menjawab.
Jarang
1
Itu terlihat oke. Saya hanya tidak menyukai kenyataan bahwa kita harus menggunakan memerlukan '../../../../wp-load.php'; yang membuat ini sangat custom. Saya juga khawatir betapa mudahnya untuk benar-benar menarik sumber daya yang Anda "butuhkan", b / c dari pengalaman saya WordPress tidak terlalu modular.
Mike
@ Mike benar, tetapi bahkan dengan masalah itu jauh lebih baik daripada titik akhir yang tidak memiliki petunjuk tentang WP sama sekali. Ini dapat (dan harus) ditingkatkan lagi tetapi itu bukan tugas yang mendesak bagi saya saat ini.
Paling lambat
Apakah ada metode untuk mendeteksi lokasi wp-load.php dari dalam WordPress? Sebagai contoh, dapatkah saya menulis file statis dengan path ditetapkan sebagai variabel di dalamnya pada beban plugin, kemudian memasukkan file itu dalam file respon Ajax yang berdiri sendiri?
hereswhatidid
0

Saya menemukan ini dan mempercepat ajax saya.

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
sumber