Kullanıcı arabirimine admin-ajax.php ekleniyor. İyi mi kötü mü?


17

Ben admin-ajax.php seviyorum. Ancak, ön uç komut dosyalarını işaret etmek için yerelleştirmekten nefret ediyorum ve temalar için eşdeğer, bulunması kolay bir dosya olmasını diliyorum. (Ayrıca ön uç isteklerinin "/ wp-admin /" üzerinden geçtiğini görmek beni rahatsız ediyor. Pratik bir neden yok, sadece çirkin IMO görünüyor.)

Bu yüzden admin-ajax.php dosyasını "/ajax.php" deki kök dizinine kopyaladım, içerme yollarını ayarladım ve WP_ADMIN sabit tanımını kaldırdım. Gangbusters gibi çalışıyor gibi görünüyor (şimdi sadece tüm önyüz AJAX isteklerini /ajax.php'ye yönlendirebilirim! Ve hala eklentilerimde normal wp_ajax kancalarını kullanabilirim!).

Ama bu güvenli mi? Ne ters gidebilir? Bu çekirdek içine yerleştirilmediğinden, neden olmasın iyi bir neden olduğunu varsayıyorum. Ama kodu bakarak, herhangi bir acil sorunları göremiyorum.

Akıllısın - bu yaklaşımın çılgın olup olmadığını söyle. Ya da göz ardı ettiğim daha basit bir yöntem varsa.


Otomatik güncellemeler sırasında bu dosyayı unutabilir ve kaçırabilirsiniz, bu da güvenlik açıklarını kırmaya ve yerinde bırakmaya neden olabilir.
Hemm

Yanıtlar:


19

.Htaccess'inizde normal kalıcı bağlantı yeniden yazma kurallarının üstünde bir RewriteRule kullanabilirsiniz:

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

Şimdi AJAX isteklerinizi gönderin example.com/ajaxve yükseltmelerden sonra bu dosyadaki temel değişiklikleri asla kaçırmayın.


İyi fikir! Duyduktan sonra "bu çok basit ve açık!" Diye düşündüğünüz şeylerden biri. Teşekkürler.
MathSmath

Yeniden yazma kuralını önerilerinize göre ekledim ancak example.com/ajaxURL 404'ler. Bunu tam olarak nereye .htaccesseklemeliyim diye açıklayabilir misiniz? Şu anda arasında # BEGIN WordPress <IfModule mod_rewrite.c>ve</IfModule> # END WordPress
John

Bu çalışıyor. Sondaki eğik çizgiyi kaçırıyordum. /% Postname% / olarak ayarlanmış kalıcı bağlantılar var
John

7

Birincisi: standardizasyon. Topluluk eklentilerini kullanmayı planlıyorsanız, bunlar /ajax.phpdosyanın kökünde dosyanızla ilgilenmeyecek olmalarıdır . Yani kullanmayacaklar.

Her şeyi kendiniz devirecekseniz, bu bir sorun değildir.

İkincisi: Ya çekirdek güncellenirse? Ajax dosyanızı izleyip değiştirecek misiniz?

Üçüncüsü : admin-ajax.phpikamet etmesine rağmen wp-admin, yönetici alanlarından hiçbirini yüklemez (örn. Liste tabloları, vb.). Ayrıca, kimlik doğrulamasını kontrol etmez veya oturum açmamış kullanıcılara duyarlı herhangi bir şeyi göstermez. Diğer bir deyişle, bir ön uç dosyası gibi. Endişelenecek birşey yok.

Dördüncü: İlk sorunla ilgili olarak, bazı eklentiler ajax ile ilgili işlevselliği körü körüne yüklemeden önce kontrol edecektir. Aşağıda bir örnek verilmiştir. Değiştirilmiş ajax.php dosyanızın yüklenmesine neden olmaz.

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

Son olarak , şikayet ettiğiniz şey, Ajax URL'sini almak için yerelleştirmeyi kullanmak iyi bir şeydir. Neden? Çünkü JS dosyalarınız hiçbir sunucu tarafı öğesinin farkında değildir. Site taşındığında / taşındığında kırılacak bir URL'yi zorlayacak mısınız? Kötü bir seçim gibi görünüyor.

Ajax kullanan her komut dosyasını gerçekten yerelleştirmek istemiyorsanız, basitçe wp_headerken devreye alın ve yönetici ajax URL'sini tükürün. Sorun çözüldü (bu arada yönetici alanı tam da bunu yapıyor).

<?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
}

Teşekkürler Chris! Tüm geçerli noktalar. Farkına varmama yardımcı olduğunuz en büyük şey, bunu bir "çekirdek kesmek" olarak düşünmeme rağmen (bir dosya eklediğimden, değiştirmediğimden), aslında çekirdeğin diğer işlevlere bağlı olabileceğinden . Diğer eklentilerden çok farklı değil (çekirdek işlevselliğindeki değişikliklerden sonra da ölebilir), ancak kesinlikle felsefi olarak farklıdır. Düşünceleriniz için teşekkürler!
MathSmath

Re: " Üçüncü: ... Endişelenecek bir şey yok. ", Wp-admin dizinini kilitlemeye çalışırken, örneğin bilinen güvenli IP aralıklarını sınırlamak için .htaccess kurallarını kullanarak? Ajax-admin.php dosyası için bir tür istisna yapılması gerektiğini varsayarım? (Ben "varsayılan" diyorum çünkü .htaccess kuralları söz konusu olduğunda ben bir numarayım ve bunun mümkün olup olmadığını gerçekten bilmiyorum?).
Sepster

Tek bir dosyaya izin vermek mümkün olmalı, evet.
chrisguitarguy

@chrisguitarguy Bu harika bir cevap, teşekkürler. Benim evreleme / ev url için siteurl ters proxy gibi yönetici-ajax ön ucunda yüklü çalışıyorum. Lütfen şuna bakın: link 3. taraf eklentisiyle yapmak mümkün mü? Yaklaşımım yanlış mı?
paranza

5

WordPress'teki birçok şeyde olduğu gibi, kediyi kaplamak için neredeyse sonsuz sayıda yol vardır. Kabul edilen tüm yöntemler çalışırken, ben ön uç ajax yeteneği dahil wp_localize_script kullanmak daha az "temiz" olduğunu bulduk .

Şuna bir bak:

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' )
        )
    );
}

Ve sonra se83650.jsdosyada, değişkeninize ile başvurursunuz se83650Ajax.ajaxurl.

Bu tekniğin avantajı, bu işlevselliği çoğaltmaya çalışan birçok eklenti ile sonuçlanırsanız, aynı değişkeni içermez veya üzerine yazmazlar. ajaxurldahil etmek oldukça genel, bu sizi daha fazla kaplar ve diğer geliştiricilerle daha güzel oynar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.