Recuperando datos JSON en una solicitud ajax desde el cargador de medios

3

Tengo algunos problemas para obtener mis datos JSON que se están pasando a través de una solicitud ajax.

Estoy intentando implementar el cargador de medios en una página de configuración de complementos. Lo tengo funcionando correctamente usando este método en lo que respecta a la funcionalidad del cargador de medios. Me gustaría poder recuperar los datos 'adjuntos' en PHP, decodificarlos y luego procesarlos una vez que se cierre el cargador de archivos y se hayan seleccionado las imágenes. La solicitud ajax está funcionando porque puedo devolver una respuesta y recibirla, pero cuando intento descodificar la cadena JSON y ejecuto un vardump, devuelve nulo, y si intento acceder a una clave de matriz, está vacío. Aquí está el código js ...

jQuery(document).ready(function($){

  var file_frame;

  jQuery('.upload_image_button').live('click', function( event ){

    event.preventDefault();

    if ( file_frame ) {
      file_frame.open();
      return;
    }

    file_frame = wp.media.frames.file_frame = wp.media({
      title: jQuery( this ).data( 'uploader_title' ),
      button: {
        text: jQuery( this ).data( 'uploader_button_text' ),
      },
      multiple: true 
    });

    file_frame.on( 'select', function() {

      var selection = file_frame.state().get('selection');
      selection.map( function( attachment ) {
        attachment = attachment.toJSON();
        $.post(ajax_object.ajaxurl, {
           action: 'ajax_action',
           data: attachment
        }, function(data) {
           console.log(data);  
        });
      });
    }); 

    file_frame.open();
  });

});

Y aquí está la función php que se encuentra en el archivo del complemento principal que recibe la solicitud ajax ...

function ajax_action_stuff() {
    $image_data = $_POST['data'];
    $data = json_decode( $image_data, true );
    var_dump( $data );
    // echo $data[url];
    die(); 
}
add_action( 'wp_ajax_ajax_action', 'ajax_action_stuff' );

Y los scripts en cola que se encuentran en el archivo principal del complemento ...

function gzmu_load_scripts() {
    wp_enqueue_media();
    wp_enqueue_script( 'gzmu-media-upload', plugin_dir_url(__FILE__) . 'gzmu-media-upload.js' );
    wp_localize_script( 'gzmu-media-upload', 'ajax_object', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
    wp_enqueue_style( 'admin-styles', plugin_dir_url(__FILE__) . '/css/admin.css' );
}
add_action( 'admin_enqueue_scripts', 'gzmu_load_scripts' );

Nunca he trabajado con JSON antes, así que estoy un poco confundido sobre cómo manejar los datos. Cualquier consejo sobre lo que podría estar haciendo mal sería muy apreciado. Gracias ...

    
pregunta gregz 24.09.2013 - 19:12

3 respuestas

0

estás haciendo algunas cosas incorrectas, 1st $_POST['data']; no contiene ningún dato de publicación. Utiliza las claves de json array para obtener datos de publicación similares.

$data_key1 = $_POST['key1'];
$data_key2 = $_POST['key2'];
// and so on ...

reemplace key1 key2 etc con las claves de datos json que envió su solicitud de ajax.

    
respondido por el Anjum 24.09.2013 - 20:41
0

después de que var_dump en la función ajax_action_stuff, los datos JSON ya no son JSON. Sólo: echo $data;

    
respondido por el Tobias Beuving 29.10.2015 - 16:58
0

En mis llamadas AJAX, encuentro que no necesito codificar / decodificar los datos como JSON al POSTAR los datos. Los datos enviados por jQuery.POST ya están en pares clave-valor, por lo que, en mi opinión, no es necesario que sea JSON, y no es necesario que la decodifique en la función .php antes de trabajar con ella.

SIN EMBARGO, uso JSON antes de enviar los datos a jQuery. Una vez que obtengo mis datos en $content , los codifico como JSON y los devuelvo en una línea:

echo json_encode($content, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);

Luego, en jQuery, decodifico el JSON:

function( content ) {
    var myContent = JSON.parse(content);
    // do what you want with the key-value pairs in myContent
}

Espero que esto funcione para usted como lo hace para mí.

    
respondido por el scott 03.10.2016 - 19:16

Lea otras preguntas en las etiquetas