Cum să creezi un endpoint PHP personalizat pentru un apel AJAX într-un plugin WordPress

27 iul. 2016, 11:57:39
Vizualizări: 13.6K
Voturi: 4

Scriu un plugin pentru prima dată și am o problemă.

Folosesc AJAX în plugin-ul meu. Fișierul JavaScript este în folderul ../wp-content/plugins/myplugin/js/, iar în el încerc să apelez un fișier PHP care se află în folderul ../wp-content/plugins/myplugin/

jQuery.ajax({
    url: "/wp-content/plugins/myplugin/myfile.php?myparam=" + myparam,
    context: document.body
});

Întrebarea mea este: Cum pot face această referință URL să funcționeze independent de locul în care utilizatorul a instalat plugin-ul?

De exemplu, când un utilizator instalează acest plugin în http://localhost/subdir/, referința nu este corectă.

Pot să creez cumva un link relativ?

0
Toate răspunsurile la întrebare 3
5

În primul rând, nu ar trebui să apelezi propriul tău fișier PHP. Ar trebui să folosești endpoint-ul admin-ajax. Documentație

Pe partea de administrare, poți folosi variabila ajaxurl pentru a obține URL-ul pentru apelurile AJAX. Pe partea de front-end trebuie să declari manual variabila cu URL-ul. Acest lucru este menționat în documentație:

Notă: Spre deosebire de partea de administrare, variabila globală javascript ajaxurl nu este definită automat pentru tine, decât dacă ai BuddyPress sau alt plugin care se bazează pe Ajax. Așadar, în loc să te bazezi pe o variabilă globală javascript, declară un obiect namespace javascript cu propria sa proprietate, ajaxurl. Poți folosi și wp_localize_script() pentru a face URL-ul disponibil scriptului tău, generându-l cu această expresie: admin_url('admin-ajax.php')

Această soluție ar trebui să rezolve problema:

add_action('wp_head', 'front_ajaxurl');
function front_ajaxurl() {
    wp_register_script('admin_ajax_front', plugin_dir_url(__FILE__) . 'script.js');
    $translation_array = array(
        'ajaxurl' => admin_url('admin-ajax.php')
    );
    wp_localize_script('admin_ajax_front', 'front', $translation_array);
    wp_enqueue_script('admin_ajax_font', false, array(), false, true); // ultimul parametru setat la true va încărca scriptul în footer
}

Și apoi în fișierul tău JS:

$.ajax({
    url: front.ajaxurl,
    ...
})
27 iul. 2016 12:03:51
Comentarii

Amestecarea codului JavaScript și PHP nu este o practică bună. După cum spune citatul din documentație, aș opta pentru wp_localize_script(). Acest lucru asigură că variabila va fi definită înainte ca scriptul care depinde de ea să fie încărcat.

David David
27 iul. 2016 12:16:36

Chiar mai bine decât wp_localize_script() poți folosi wp_add_inline_script() începând cu WordPress 4.5. Această funcție permite tipărirea scripturilor inline în cadrul excelentului sistem de gestionare a dependențelor WordPress și nu este limitată doar la un Obiect JavaScript ca în cazul wp_add_inline_script().

cybmeta cybmeta
27 iul. 2016 12:25:37

încă nu înțeleg... încă nu știu cum să mă refer la myfile.php și unde? trebuie să-l transform într-o funcție sau cum? te rog dă-mi un indiciu, sunt pierdut

user3199063 user3199063
27 iul. 2016 14:02:41

Dacă chiar trebuie să apelezi un fișier din pluginul tău, poți face acest lucru folosind plugin_dir_url(__FILE__)

Krzysztof Grabania Krzysztof Grabania
27 iul. 2016 14:28:44

am nevoie să apelez myfile.php în JavaScript-ul meu, așa cum am arătat în întrebare, desigur, pentru asta am nevoie de ajax. De asemenea, nu mi-e clar dacă ar trebui să pun admin-ajax.php în ajaxurl, sau dacă ar trebui să pun myfile.php acolo?

user3199063 user3199063
27 iul. 2016 15:03:02
0

Sunt începător, dar asta a funcționat pentru mine

Adăugați următoarele în functions.php. Rețineți că 'wp_ajax' este un prefix prin convenție și 'do_something' este numele acțiunii ales arbitrar de mine:

add_action( 'wp_ajax_do_something', 'do_something' );

function do_something() {
    //serios, haideți, faceți ceva
    die("returnează ceva");
}

Pentru a face apelul ajax din browser (partea de client), am reușit să găsesc endpoint-ul meu folosind wp.ajax.settings.url. Variabila globală wp este definită pe obiectul window.

//do_something aici trebuie să se potrivească cu cel de mai sus, puteți adăuga alți parametri acestui obiect
var data = { action: 'do_something' };
jQuery.post(wp.ajax.settings.url, data, function(response) {
    console.log('Rezultat: ' + response);
});

Am WordPress 4.6.1 (ultima versiune la momentul scrierii) și câteva plugin-uri instalate. M-am referit la această referință care spune incorect că ajaxurl este definit, dar în cazul meu nu este: https://codex.wordpress.org/AJAX_in_Plugins

4 dec. 2016 17:38:55
0

Am întâmpinat aceeași problemă.

Am vrut să folosesc propriul meu endpoint în loc de admin-ajax deoarece am reguli de rescriere care populază toate variabilele necesare pentru a rula acțiunile AJAX.

Astfel, folosind (așa cum este menționat în codex):

jQuery(document).ready(function($) {
    var data = {
        'action': 'my_action',
        'whatever': ajax_object.we_value      // Transferăm valorile PHP diferit!
    };
    jQuery.post(ajax_object.ajax_url, data, function(response) {
        alert('Am primit acest răspuns de la server: ' + response);
    });
});

și

add_action( 'wp_ajax_my_action', 'my_action' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action' );

doar complică codul meu.

Am ajuns să fac asta și pare să funcționeze:

    jQuery.ajax({
        type: "post",
        url: MYCUSTOMENDPOINT?ajax_action,
        dataType: 'json',
        ...

combinate cu:

    add_action( 'init', 'rewrite_rules');
    add_filter( 'template_include','handle_ajax_action');

function rewrite_rules(){
    add_rewrite_tag(
        '%ajax_action%',
        '([^&]+)'
    );
}

function handle_ajax_action($template){

    $success = null;

    // deoarece variabila de interogare "ajax" nu necesită o valoare, trebuie să verificăm existența ei
    if ( !$action = get_query_var( 'ajax_action' ) ) return $template; //acțiunea ajax nu există

    $result = array(
        'input' =>  $_REQUEST,
        'message'=> null,
        'success'=> null,
    );

    $success = ...

    if ( is_wp_error($success) ){
        $result['success'] = false;
        $result['message'] = $success->get_error_message();

    }else{
        $result['success'] = $success;
    }

    header('Content-type: application/json');
    send_nosniff_header();
    header('Cache-Control: no-cache');
    header('Pragma: no-cache');

    wp_send_json( $result );  

}
10 dec. 2018 11:48:09