Supporto » Sviluppare con WordPress » Update usermeta con AJAX

  • Ciao a tutti!

    Ho creato una pagina costum che, dato il link di un file csv caricato nei media, mi aggiorni un meta dato degli utenti. Ho utilizzato jquery(ajax) e php.
    Pensavo di inserire la chiamata ajax post all’interno del loop delle righe del csv per aggiornare progressivamente il metadato per utente. Non credo sia il modo corretto però di procedere, perché in console mi da errore 502 e 429. Cosa sto sbagliando?
    In precedenza avevo gestito il caricamento del csv e l’update degli utenti unicamente tramite php ma con un grande numero di utenti diventa un’operazione molto pesante e mi da un errore 502. Cercavo una soluzione meno pesante possibile

    Jquery

    jQuery(document).ready(function( $ ){
    
     $( "#test-click" ).click(function() {
      
        $.ajax({
            type: "GET",
            url: 'FILE-CSV.csv',
            dataType: "text",
            success: function(data) {processData(data);}
         });
    
     
    function processData(allText) {
        var allTextLines = allText.split(/\r\n|\n/);
        var headers = allTextLines[0].split(';');
        //var lines = [];
    
        for (var i=1; i<allTextLines.length; i++) {
            var data = allTextLines[i].split(';');
            if (data.length == headers.length) {
    
                var tarr = [];
                for (var j=0; j<headers.length; j++) {
                    //tarr.push(headers[j]+":"+data[j]); 
                  tarr[headers[j]] = data[j];
                  //console.log(tarr['n']);
          $.ajax({
                url:"/wp-json/bluenext/updatelesson",
                method: "POST",
                //data: post_id,
                data: {id : tarr['id'], id_lezione : tarr['id_lezione']},
                success: function(response){
                
               console.log(response);
    
                    }
                }) 
                }
                //lines.push(tarr);
            }
        }
         //console.log(lines);
    }
      
      });
    });

    PHP

    function updatelesson(){
      $user_id = json_decode($_POST['id']);
      $idlesson = json_decode($_POST['id_lezione']);
      llms_mark_complete( $user_id, $idlesson, 'lesson');
      return $user_id;
    }
    • Questo topic è stato modificato 1 settimana, 3 giorni fa da saracomin.
Stai visualizzando 7 risposte - dal 1 al 7 (di 7 totali)
  • Ciao @saracomin ,

    Codici di errore 502 e 429 indicano che la tua elaborazione lato server con il php supera i limiti di tempo concessi a php.

    Però non capisco perchè succeda.

    La tua funzione updatelesson() non sembra fare cose lunghissime, a meno che il tempo sia speso da llms_mark_complete( ) , che non so cosa faccia.

    Riguardo alla chiamata ajax, posso notare che è insicura perché manca del nonce di convalida.
    Per il resto io le faccio in js nativo e faccio fatica a leggerla.

    Saluto!

    Ciao @saracomin ,

    ho riguardato un pochino meglio.

    Penso che ci siano degli errori.
    Per iniziare a capirci qualcosa si può provare a sostituire
    function updatelesson() con questa.

    function updatelesson(){
      $user_id = json_decode($_POST['id']);
      $idlesson = json_decode($_POST['id_lezione']);
      llms_mark_complete( $user_id, $idlesson, 'lesson');
      //return $user_id;
      echo $user_id;
      exit;
    }

    Vediamo se ritorna qualcosa in console.log()

    Saluto.

    Chi ha creato la discussione saracomin

    (@saracomin)

    Ciao Luca,

    Grazie mille per la risposta!
    llms_mark_complete( ) è una funzione di un plugin che utilizzo come LMS per fare un update di un metadato degli utenti.

    Ho modificato il codice secondo le tue indicazioni, ma ho gli stessi errori in console (502 e 429) e stampa solo 6 user_id dei 20 che sono all’interno del csv. Probabilmente mettere la chiamata ajax all’interno del loop non è la migliore soluzione, forse è un eccessivo numero di chiamate? Avresti qualche suggerimento o un metodo alternativo per aggiornare i metadati di un certo numero utenti?

    Ciao @saracomin ,

    ho gli stessi errori in console (502 e 429)

    Poichè mi sembra che l’elaborazione lato server che vuoi fare non sia così lunga da giustificarli, temo allora che la chiamata ajax sia da rifare partendo da zero.
    Non è possibile farla nel forum. Posso solo indicare lo schema di una chiamata ajax per wp.

    Uno, WP deve essere avvertito che potrebbe arrivare una chiamata ajax.
    Questo registra una chiamata ajax che arriva da una pagina di frontend, siano visitatori o users loggati.

    
    /*  Frontend page                                       */
    add_action( 'wp_ajax_nopriv_<tua action js>', '<tua funzione php risposta a chiamata>');    /*  non logged users */
    
    add_action('wp_ajax_<tua action js>', '<tua funzione php risposta a chiamata>');            /* also logged users */

    Due. Deve essere passato alla pagina web il javascript per eseguire la chiamata ajax e il javascript per gestire la risposta.
    Che si utilizzi jQuery o js nativo la cosa non cambia.
    E’ indispensabile che js contenga il “nonce” cioè una stringa di convalida chiamata che deve essere precedentemente impostata da php con la funzione wp_create_nonce(var);. Quando arriva la chiamata il server deve per prima cosa verifivare che nonce sia quello giusto e rispondere un codice di errore se si tratta di un nonce sbagliato.
    Deve essere organizzato in js il pacchetto dei dati da inviare al server. Per js nativo il “formdata” è perfetto direi.
    Il punto di accesso in wp, ovvero “ajax_url” dovrebbe essere già presente nella pagina perché WP lo invia d’ufficio. Altrimenti va impostato col php $ajaxurl = admin_url(var, var); e inviato alla pagina web.
    Parimenti deve essere prevista da js la gestione della risposta che arriva dal server a seguito della esecuzione della tua funzione php di elaborazione.

    Spero di non aver dimenticato nulla.

    Saluto e buon lavoro.

    Qualcosa l’ho dimenticata, spero sia unica.

    Bisogna ricordarsi di far partire uno “spinner” – un’icona di loading – quando l’utente fa click e avvia la chiamata ajax.

    Altrimenti rimane perplesso vedendo la pagina immobile.

    Ciao!

    Chi ha creato la discussione saracomin

    (@saracomin)

    Ciao Luca,

    Grazie!
    Anche se la pagina creata è all’interno del backend di wordpress è necessario dichiarare la chiamata ajax con questo?

    /*  Frontend page                                       */
    add_action( 'wp_ajax_nopriv_<tua action js>', '<tua funzione php risposta a chiamata>');    /*  non logged users */
    
    add_action('wp_ajax_<tua action js>', '<tua funzione php risposta a chiamata>');            /* also logged users */

    Ciao @saracomin ,

    se la pagina creata è all’interno del backend …

    E’ necessario di meno. L’aggancio all’hook “…_nopriv…” non si fa.

    
    /*  Administration page                              */
    
    add_action( 'wp_ajax_<the action in javascript code>', '<php function for manage ajax call>' );        /* only logged users */
    
    

    Anche se è backend conviene egualmente usare il nonce.

    La tua funzione php che gestisce il “pacchetto dati ajax” (<php function for manage ajax call> )
    in arrivo, dovrebbe avere come righe iniziali qualcosa come questo:

    
        $nonce = sanitize_text_field( $_POST[ 'ajax_nonce' ]); 
        if( !wp_verify_nonce( $nonce, var )){
            wp_die( '403 forbidden', 403 );
        }
    
    

    Qui i dati arrivano da un “formdata” javascript e php li legge come $_POST[] di un classico form html.

    Se nonce non è quello precedentemente impostato viene inviato un errore come risposta ajax.

    Saluto.
    Buon lavoro!

Stai visualizzando 7 risposte - dal 1 al 7 (di 7 totali)
  • Devi essere collegato per rispondere a questo topic.