Menambahkan admin-ajax.php ke frontend. Ide bagus atau buruk?

17

Saya suka admin-ajax.php. Tapi saya benci harus melokalkan untuk menunjuk skrip frontend ke sana, dan saya berharap ada file yang setara, mudah ditemukan untuk tema. (Ini juga hanya mengganggu saya untuk melihat permintaan frontend melalui "/ wp-admin /". Tidak ada alasan praktis, hanya terlihat jelek IMO.)

Jadi saya cukup menyalin admin-ajax.php ke direktori root di "/ajax.php", menyesuaikan path include dan menghapus definisi konstan WP_ADMIN. Tampaknya bekerja seperti gangbusters (sekarang saya bisa mengarahkan semua permintaan AJAX frontend saya ke /ajax.php! Dan saya masih bisa menggunakan kait wp_ajax normal di plugin saya!).

Tetapi apakah ini aman? Apa yang salah? Karena ini tidak dibangun ke dalam inti, saya berasumsi ada alasan bagus mengapa tidak. Tetapi melihat melalui kode, saya tidak dapat melihat masalah langsung

Anda cerdas - beri tahu saya jika pendekatan ini gila. Atau jika ada metode sederhana yang saya abaikan.

MathSmath
sumber
Anda mungkin lupa dan kehilangan file ini selama pembaruan otomatis, yang dapat menyebabkan hal-hal melanggar dan meninggalkan kerentanan keamanan di tempat.
Hemm

Jawaban:

19

Anda bisa menggunakan RewriteRule untuk .htaccess Anda di atas aturan penulisan ulang permalink biasa:

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]

Sekarang kirim permintaan AJAX Anda ke example.com/ajax, dan jangan pernah melewatkan perubahan inti pada file itu setelah peningkatan.

fuxia
sumber
Ide yang hebat! Itu salah satu hal yang, setelah Anda dengar, Anda berpikir "itu sangat sederhana dan jelas!" Terima kasih.
MathSmath
Saya menambahkan aturan penulisan ulang sesuai saran Anda tetapi example.com/ajaxURL 404. Bisakah Anda menguraikan di mana tepatnya dalam .htaccessharus saya tambahkan ini. Saya memilikinya saat ini antara # BEGIN WordPress <IfModule mod_rewrite.c>dan</IfModule> # END WordPress
John
Ini bekerja. Saya melewatkan garis miring. Saya memiliki permalink yang disetel ke /% postname% /
John
7

Pertama: standardisasi. Jika Anda berencana menggunakan plugin komunitas, kemungkinan mereka tidak akan peduli dengan /ajax.phpfile Anda di root dokumen. Jadi mereka tidak akan menggunakannya.

Jika Anda akan memutar semuanya sendiri, ini bukan masalah.

Kedua: bagaimana jika pembaruan inti? Apakah Anda akan memantau dan mengubah file ajax Anda?

Ketiga : meskipun admin-ajax.phpberada di wp-admindalamnya, ia tidak memuat apa pun dari area admin (mis. Tabel daftar, dll). Juga tidak memeriksa auth atau mengekspos sesuatu yang sensitif terhadap pengguna yang tidak login. Dengan kata lain, ini seperti file front-end. Tidak ada yang perlu dikhawatirkan.

Keempat: Terkait dengan masalah pertama, beberapa plugin akan memeriksa sebelum memuat fungsi terkait ajax secara membabi buta. Contohnya di bawah ini. Ajax.php Anda yang dimodifikasi kemungkinan tidak akan menyebabkannya dimuat.

<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
    //  load ajax stuff
}

Akhirnya: Apa yang Anda keluhkan, menggunakan pelokalan untuk mendapatkan URL Ajax adalah hal yang baik untuk dilakukan. Mengapa? Karena file JS Anda tidak mengetahui adanya hal-hal sisi server. Anda akan menyulitkan URL yang akan rusak jika / ketika situs bergerak? Sepertinya ini pilihan yang buruk.

Jika Anda benar-benar tidak ingin melokalisasi setiap skrip yang menggunakan Ajax, kaitkan sederhana menjadi wp_headsangat awal dan keluarkan URL admin ajax. Masalah terpecahkan (ini persisnya yang dilakukan oleh admin area).

<?php
add_action('wp_head', 'wpse83650_lazy_ajax', 0, 0);
function wpse83650_lazy_ajax()
{
    ?>
    <script type="text/javascript">
    /* <![CDATA[ */
    var ajax_url = "<?php echo esc_js(admin_url('admin-ajax.php')); ?>";
    /* ]]> */
    </script>
    <?php
}
chrisguitarguy
sumber
Terima kasih, Chris! Semua poin valid. Hal terbesar yang Anda bantu sadari adalah bahwa, meskipun saya tidak menganggap ini sebagai "peretasan inti" (karena saya menambahkan, bukan memodifikasi file), itu karena tergantung pada fungsi lain di dalam inti yang dapat berubah . Tidak terlalu jauh berbeda dari plugin lain (yang mungkin juga mati setelah perubahan fungsionalitas inti), tetapi secara filosofis berbeda. Terima kasih atas pemikirannya!
MathSmath
Re: " Ketiga: ... Tidak ada yang perlu dikhawatirkan. ", Bagaimana dengan ketika mencoba mengunci direktori wp-admin misalnya menggunakan aturan .htaccess untuk membatasi rentang IP yang diketahui aman? Saya kira beberapa pengecualian perlu dibuat untuk file ajax-admin.php? (Saya katakan "anggaplah" karena saya numpty ketika datang ke aturan .htaccess, dan tidak benar-benar tahu apakah ini mungkin?).
Sepster
Seharusnya dimungkinkan untuk mengizinkan satu file, ya.
chrisguitarguy
@ chrisguitarguy ini adalah jawaban yang brilian, terima kasih. Saya mencoba memiliki admin-ajax dimuat di ujung depan karena saya membalikkan proxy siteurl ke staging / home url saya. Silakan lihat ini: tautan Mungkinkah melakukannya dengan plugin pihak ke-3? Apakah pendekatan saya salah?
paranza
5

Seperti banyak hal di WordPress, ada banyak cara untuk menguliti kucing. Sementara semua metode yang diterima bekerja, saya telah menemukan bahwa mereka kurang "rapi" daripada menggunakan wp_localize_script untuk memasukkan kemampuan ajax di ujung depan.

Lihat ini:

add_action( 'wp_enqueue_scripts', 'se83650_js' );
function se83650_js()
{
    wp_enqueue_script( 'se83650-js', plugin_dir_url( __FILE__ ) . 'js/se83650.js',  'jquery', '1.0.0', true );
    // First param is the name of the script you are attaching it to - in this case
    // it is the name of the custom script we added.  Second param is the name of 
    // the javscript Object that will be attached with your information.
    // Third param is an array of attributes, in this case, ajaxurl
    wp_localize_script( 'se83650-js', 'se83650Ajax', 
        array(
            // You can put any variables here you want for your script
            // such as plugin-specific variables or nonces, etc.
            'ajaxurl'    => admin_url( 'admin-ajax.php' )
        )
    );
}

Dan kemudian dalam se83650.jsfile, Anda akan merujuk variabel Anda dengan se83650Ajax.ajaxurl.

Manfaat dari teknik ini adalah bahwa jika Anda memiliki banyak plugin yang mencoba dan menduplikasi fungsi ini, mereka tidak termasuk atau menimpa variabel yang sama. ajaxurlcukup generik untuk dimasukkan, ini membuat Anda lebih berisi dan bermain lebih baik dengan pengembang lain.

olehbloggers
sumber