Cum să creezi un endpoint PHP personalizat pentru un apel AJAX într-un plugin WordPress
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?

Î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 șiwp_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,
...
})

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.

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()
.

î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

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

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

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