Admin-ajax.php'de yalnızca wp_enqueue_scripts eylem kancası kullanılarak 400 hatalı istek


16

Son zamanlarda ajax üzerinde çalışıyorum. İnternette bulduğunuz öğreticilerin hepsi çok benzer ve uygulaması oldukça kolaydır. Ama her zaman dosyamda kötü bir istek 400 alıyorum ajax-admin.php.

Uzun ve yoğun bir araştırmadan sonra, bunun entegrasyon zamanı yüzünden olduğunu öğrendim.

Ben initkomut dosyası başlatmak için eylem kanca kullanırsanız, ve wp_localize_scripther şey iyi çalışıyor. Bu yüzden kodun kendisi doğru olmalıdır.

benim sayfalık test-functions.php

function ajax_login_init(){
   wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
   wp_enqueue_script('ajax-login-script');
   wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
   add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
}

if(!is_user_logged_in()){
   add_action('init','ajax_login_init');
}

function ajax_login(){
    //nonce-field is created on page
    check_ajax_referer('ajax-login-nonce','security');
    //CODE
    die();
}

Ama örneğin wp_enqeue_scriptseylem kanca kullanırsanız her zaman kötü istek alırım.

if(!is_user_logged_in()){
    add_action('wp_enqueue_scripts','ajax_login_init');
}

Bununla ilgili sorun:

Ekstra bir php dosyasında fonksiyonları var ve sadece belirli bir sayfada gerekli ise onları yüklemek istiyorum. Bunun için mesela ihtiyacım var is_page(). Ama is_page()ben parse_queryeylem kanca içine fonksiyonu ile kanca zaman en erken çalışır :

functions.php

function sw18_page_specific_functions(){
    if(is_page('page-test')){
        include_once dirname(__FILE__).'/includes/my-page-test-functions.php';
    }
}

add_action('parse_query','sw18_page_specific_functions');

O zaman dosyaya initkanca çengel fonksiyonları my-page-test-functions.phptetiklemez, sanırım, çünkü initdaha önce geliyor parse_query.

Bunu organize etmek için en iyi uygulamalar var, bu yüzden işe yarıyor mu? Veya eylem kancasını admin-ajax.phpkullanırken kötü isteği nasıl düzeltebilirim wp_enqeue_scripts?

Yanıtlar:


13

Bence burada eksik olan tek şey add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');dışarı çıkmanız gerektiğidir ajax_login_init.

Bu kod Ajax işleyicinizi kaydeder, ancak yalnızca çalıştırdığınızda wp_enqueue_scriptszaten çok geç ve wp_ajax_nopriv_kancalar zaten çalışır.

Yani, böyle bir şey denediniz mi:

function ajax_login_init(){
  if ( ! is_user_logged_in() || ! is_page( 'page-test' ) ) {
    return;
  }

  wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
  wp_enqueue_script('ajax-login-script');
  wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
}

add_action( 'wp_enqueue_scripts','ajax_login_init' );

add_action( 'wp_ajax_nopriv_ajaxlogin','ajax_login' );

function ajax_login(){
  //nonce-field is created on page
  check_ajax_referer('ajax-login-nonce','security');
  //CODE
  die();
}

Düzenle:

Artık JavaScript'i yalnızca o sayfaya yüklemek istediğiniz daha açıktır. Bu, koymak gerektiği anlamına gelir is_page()içini ajax_login_init(). Kodu buna göre güncelledim.

Peki, çözümünüz neden işe yaramadı?

is_page()Çek senin fonksiyonları dosya sadece o belirli sayfada yüklenen anlamına geliyordu. ajax_login_init()çağrılır ve komut dosyalarınız sıralanır. Çok uzak çok iyi.

Şimdi betiğiniz ajax çağrısını yapıyor. Yorumlarda belirtildiği gibi, ajax çağrıları bulunduğunuz sayfanın farkında değildir. Dosyanın oturmasının bir nedeni var wp-admin/admin-ajax.php. Hiçbir var WP_Queryve bu nedenle is_page()bir ajax isteği sırasında çalışmaz.

Bu işe yaramadığından, sw18_page_specific_functions()ajax bağlamında hiçbir şey yapmaz. Bu, işlevler dosyanızın yüklü olmadığı ve ajax işleyicinizin mevcut olmadığı anlamına gelir.

Bu yüzden her zaman bu işlevler dosyasını eklemeniz ve bu is_page()denetimi içeri taşımanız gerekir ajax_login_init().

Yani doğrudan sw18_page_specific_functions() { … }koşmak yerine include_once dirname(__FILE__).'/includes/my-page-test-functions.php';. Herhangi bir add_action( 'parse_query' )çağrı olmadan .


İyi öneri. Bunu değiştirdim (hala aynı hata), ancak sorun hala işlevleri içeren dosya çok geç yüklenecek olmasıdır. Ancak hangi sayfanın kullanıldığını ayırt etmenin bir yoluna ihtiyacım var. - şu anda bunu yukarıda açıklandığı gibi is_page () ile deniyorum.
Sin

Çalıştırmak çalışıyorsunuz is_page()içinden ajax_login()veya içinden ajax_login_init(). Birincisi çalışamıyor çünkü Ajax bağlamında.
swissspidy

Yukarıdaki tanımlayıcı metin olarak işlevlerin bulunduğu dosyaları numaralandırdım. İs_page (), function.php dosyasında kullanılır ve dosyayı yalnızca gerektiğinde ajax işlevlerine dahil etmeye yarar.
Sin

@Sin Yine, is_page()Ajax bağlamında çalışmaz. Cevabımı buna göre güncelledim.
swissspidy

0

'Action' işlev adının wp_ajax_etikete eklenmesini unutmayın .

function fetchorderrows() { // Want to run this func on ajax submit
  // Do awesome things here all day long
}

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);

-3

sadece kalıp yaz; sonunda aşağıdaki gibi ...resim açıklamasını buraya girin


8
Merhaba Zee Xhan. Siteye hoş geldiniz. Cevabınızın bazı düzeltmelere ihtiyacı var. İlk olarak, cevabınız kodsa, ekran görüntüsü göndermeyin. Bunun yerine kodu snippet olarak gönderin ve kod olarak biçimlendirin ({} düğmesini kullanın). Muhtemelen cevabınızın reddedilmesi ve kabul edilmemesinin nedeni budur. Ayrıca, biraz daha açıklama yardımcı olacaktır - "neden" sadece die () yazın ve bu OP (orijinal posta) koduna göre tam olarak nereye gidiyor?
butlerblog
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.