Cum să folosești AJAX în zona de administrare a unui plugin?

3 sept. 2013, 16:01:28
Vizualizări: 24.3K
Voturi: 2

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?

0
Toate răspunsurile la întrebare 3
6
10

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:

  1. 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.
  2. Î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.
  3. 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 );
 });
3 sept. 2013 17:12:35
Comentarii

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.

gmazzap gmazzap
3 sept. 2013 17:31:57

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.

cybmeta cybmeta
3 sept. 2013 17:39:24

@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.

sun sun
3 sept. 2013 17:50:12

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.

cybmeta cybmeta
4 sept. 2013 00:57:27

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

Waqas Shakeel Waqas Shakeel
17 mar. 2020 14:26:30

în loc de json_encode și header, cred că cea mai bună practică este să folosești wp_send_success sau wp_send_error.

simon simon
27 dec. 2022 18:51:22
Arată celelalte 1 comentarii
1

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".

3 sept. 2013 16:36:33
Comentarii

Nu am reușit să descifrez Codex sau alte coduri conform cunoștințelor mele, de aceea am postat întrebarea aici. Astfel, alții mă pot ajuta să înțeleg ce greșesc. Oricum, mulțumesc.

sun sun
4 sept. 2013 11:58:18
6

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.

3 sept. 2013 16:27:06
Comentarii

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

sun sun
3 sept. 2013 16:49:30

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

J.D. J.D.
3 sept. 2013 17:18:33

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

sun sun
3 sept. 2013 17:51:36

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

J.D. J.D.
3 sept. 2013 21:41:28

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.

kaiser kaiser
30 sept. 2013 19:22:04

Da, dar dacă te uiți la timpuri, am postat eu cu o oră înainte ca el să posteze răspunsul său.

J.D. J.D.
30 sept. 2013 23:08:12
Arată celelalte 1 comentarii