¿Cómo evitar que jQuery ajax agregue barras a la cadena JSON?

2 minutos de lectura

avatar de usuario
benn

Estoy enviando un objeto JSON en cadena a una acción de wordpress

console.log( JSON.stringify(alloptions) );

$.ajax({
    type: "post",
    dataType: "json",
    url: ajaxurl,
    processData: false,
    data: {
        'action': 'create_preset',
        'preset': JSON.stringify(alloptions)
    },
    success: function( response ) {

        console.log( response );

    }
});

el registro de la consola del objeto en cadena antes de enviarlo a través de ajax es este

http://prntscr.com/7990ro

para que la cadena se procese correctamente,

pero por el otro lado sale con barras

function _create_preset(){

    if(!is_admin() && !isset($_POST['preset'])) return;

    print_r($_POST['preset']);

}

add_action("wp_ajax_create_preset", "_create_preset");

da

{\"get_presets\":\"eedewd\",\"site_width\":\"1400px\",\"layout_type\":...

Sé que puedo usar

stripslashes( $_POST['preset'] )

para limpiarlo, pero eso es lo que estoy tratando de evitar. Necesito que la cadena JSON se envíe a la acción tal como está antes del ajax, sin barras.

cualquier ayuda es apreciada!

y las citas mágicas no están activadas

http://prntscr.com/7996a9

*ACTUALIZACIÓN Y SOLUCIÓN

Jesse lo logró y WP estaba causando el problema. Desde el wp_unslash() está en camino de arreglar esto en 5.0
https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards/issues/172
Agregué esto a mi código

global $wp_version;
$new_preset_options = $_POST['preset'];

if ( version_compare( $wp_version, '5.0', '<' ) ) {

    $new_preset_content = wp_unslash( $new_preset_options );

}else{

    $new_preset_content = $new_preset_options ;
}

  • brrrrrrrr, suena como citas mágicas: php.net/manual/en/security.magicquotes.what.php

    – jeroen

    25 mayo 2015 a las 16:51

  • @jeroen no, no lo es, prntscr.com/7996a9

    – Benn

    25 mayo 2015 a las 16:52

  • Parece que tienes razón, pero ¿puedes confirmar que verificar el valor de get_magic_quotes_gpc()?

    – jeroen

    25 mayo 2015 a las 16:55

  • ¿Miró la solicitud real para ver si se escapó allí? (como en, mira la pestaña Net del navegador o charles proxy o w/e)

    – Crayon Violento

    25 mayo 2015 a las 16:57


  • @Benn Pasan todos los datos de entrada globales a través de wp_slash, pero parece que eso podría parchearse en 5.0 para que se elimine automáticamente cuando se solicite: github.com/WordPress-Coding-Standards/…

    –Jesse Kernaghan

    25 mayo 2015 a las 17:08


WordPress tomó la decisión hace mucho tiempo de agregar automáticamente barras a todas las variables de entrada globales ($_POST, etc.). Lo pasan por un interior wp_slash() función. La forma oficial recomendada de eliminar estas barras es usar su wp_unslash:

wp_unslash( $_POST['preset'] );

Aquí está la referencia del códice.

** Nota: se ve así podría estar arreglado en la versión 5.0donde estarán haciendo el wp_unslash para usted cuando solicita valores de las variables de entrada globales.

  • Eso fue todo, solo probé en php ajax normal, no en WP y mi cadena salió como se esperaba. prntscr.com/799kl6

    – Benn

    25 mayo 2015 a las 17:22

  • Gracias, fue útil.

    – shasi kanth

    31 de marzo de 2016 a las 14:25

  • ¿Y si el json tiene que contener algún “?

    – rastrano

    30 sep 2021 a las 15:51

¿Ha sido útil esta solución?