Cum să folosești AJAX în zona de administrare a unui plugin?
Am încercat să folosesc AJAX pentru a obține informații dintr-un fișier PHP în plugin-ul meu, dar primesc eroarea "call to undefined function". Ajax
jQuery.ajax({
type: "POST",
url: "<?php echo plugins_url();?>/tester/inc/test.php",
data: { param: 'st1' }
}).done(function( msg ) {
alert( "Data Saved: " + msg );
});
Eroare în alertă
Data Saved: <br />
<font size='1'><table class='xdebug-error xe-fatal-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Eroare fatală: Apel către funcția nedefinită add_action() în E:\wamp1\wamp\www\wp_twentythirteen\wp-content\plugins\tester\inc\test.php la linia <i>7</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Stivă de Apeluri</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Timp</th><th align='left' bgcolor='#eeeeec'>Memorie</th><th align='left' bgcolor='#eeeeec'>Funcție</th><th align='left' bgcolor='#eeeeec'>Locație</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0007</td><td bgcolor='#eeeeec' align='right'>254944</td><td bgcolor='#eeeeec'>{main}( )</td><td title='E:\wamp1\wamp\www\wp_twentythirteen\wp-content\plugins\tester\inc\test.php' bgcolor='#eeeeec'>..\test.php<b>:</b>0</td></tr>
</table></font>
test.php
<?php
function aj()
{
echo "hello";
echo plugins_url();
}
add_action('wp_ajax_my_action','aj');
add_action('wp_ajax_nopriv_myFunction','aj');
?>
Cred că eroarea indică faptul că nu sunt în interiorul WordPress. Aveți vreo idee?

Vă rugăm, evitați utilizarea require('../../../wp-load.php'); și alte metode similare așa cum sunt sugerate în alte răspunsuri. Ar trebui să utilizați întotdeauna metoda AJAX specifică WordPress. Este foarte ușor și veți avea întregul motor WordPress încărcat în scriptul PHP.
Doar trei considerații:
- Trebuie să trimiteți cererea AJAX către ...wp-admin/admin-ajax.php. ajaxurl este o variabilă JavaScript care este întotdeauna definită în zona de administrare și conține URL-ul corect către fișierul admin-ajax.php în instalarea curentă WordPress. Puteți utiliza direct ajaxurl în JavaScript în zona de administrare. Am văzut că trimiteți cererea AJAX către un URL diferit.
- În datele trimise trebuie să includeți variabila action. Variabila action conține numele unei funcții PHP înregistrate anterior de către plugin-ul/tema dumneavoastră. Această funcție va gestiona cererea AJAX. Am citit codul dumneavoastră și ați definit funcția AJAX în PHP, dar lipsește acțiunea în JavaScript.
- Exemplul de mai jos este pentru zona de administrare așa cum ați întrebat despre zona de administrare. Pe frontend este puțin diferit, dar tot foarte ușor; dacă aveți nevoie de un exemplu pentru a face cererea AJAX pe frontend, spuneți-mi și voi posta.
Exemplu:
În PHP (plugin/temă):
add_action('wp_ajax_my_action', 'my_ajax_action_function');
function my_ajax_action_function(){
$response = array();
if ( ! empty($_POST['param'] ) ) {
$response['response'] = "Am primit parametrul și valoarea sa este " . $_POST['param'] . ' iar URL-ul pluginului este ' . plugins_url();
} else {
$response['response'] = "Nu ați trimis parametrul";
}
header( "Content-Type: application/json" );
echo json_encode($response);
// Nu uitați să închideți întotdeauna în funcția AJAX.
exit();
}
JavaScript-ul din backend ar trebui să arate cam așa (rețineți că ajaxurl este întotdeauna definit de WordPress în zona de administrare):
jQuery.ajax({
type: "POST",
url: ajaxurl,
data: { action: 'my_action' , param: 'st1' }
}).done(function( msg ) {
alert( "Date salvate: " + msg.response );
});

Cred că ai înțeles greșit răspunsul lui @s_ha_dum. Răspunsul tău este aproape identic cu răspunsul la care s-a referit el. Sincer și fără supărare, al tău este mai puțin complet.

Ai dreptate. Am citit răspunsul lui Mike Lewek și după aceea nu am petrecut suficient timp să citesc răspunsul lui s_ha_dum.

@cybnet mulțumesc, în funcția my_ajax_action_function() am eliminat tot codul, totuși primesc o alertă de plugin_url. Cum se întâmplă asta, vreau doar să înțeleg acest lucru.

plugin_url() nu există în WordPress, forma corectă este plugins_url(). Vezi răspunsul editat, am adăugat funcția plugins_url() și funcționează perfect.

cum să inițializezi "ajaxurl" pentru backend. nu ai menționat aici

Nu te afli într-un context WordPress. Ai încărcat fișierul pluginului direct. Acel fișier se va încărca, dar nu și restul WordPress.
Folosește API-ul AJAX. Pentru asta a fost creat. Nu folosi solutii improvizate care nu mai sunt necesare precum require
/include
pentru fișierele de bază WordPress (wp-load.php
, wp-blog-header.php
, wp-settings.php
, în funcție de ce "tutorial" ai citit)
Dacă exemplele din Codex nu sunt suficiente pentru a începe, există numeroase exemple pe acest site, inclusiv peste 30 scrise de mine – acesta, în special, care probabil se încadrează la categoria "întrebări duplicate".

Aveți dreptate, din cauza modului în care faceți apelul AJAX, WordPress nu este încărcat. Modul corect este să folosiți ajaxurl
ca URL și să setați acțiunea la my_action
prin transmiterea acesteia ca valoare a parametrului action
în datele cererii dumneavoastră:
jQuery.ajax({
type: "POST",
url: ajaxurl,
data: { action: 'my_action', param: 'st1' }
}).done(function( msg ) {
alert( "Data Saved: " + msg );
});
Consultați AJAX în Plugin-uri pentru mai multe informații.

De ce primesc Date salvate: http://localhost/wp_twentythirteen/wp-content/plugins0 chiar dacă am eliminat plugins_url() din test.php

Trebuie să apelezi exit()
la sfârșitul funcției tale. Încearcă asta și vezi dacă mai apare problema.

dacă folosesc exit() primesc localhost/wp_twentythirteen/wp-content/plugins

Dacă primești această eroare, înseamnă că apelezi plugins_url()
undeva în codul tău înainte de apelul la exit()
.

Acesta ar trebui să fie un comentariu sau o editare la răspunsul lui @cybnet - deoarece este deja o copie/inserare a codului din răspunsul său.
