Almacenamiento de arreglos de PHP en la metabase de datos de usuarios de WordPress

3 minutos de lectura

avatar de usuario
chuuke

Esto debería ser fácil para un experto en PHP. Tengo problemas para almacenar y extraer matrices en WordPress a través de la función update_user_meta.

Entonces tengo una matriz asociativa construida así:

Array
(
    [film_genres] => Array
        (
            [action] => 50
            [comedy] => 50
            [crime] => 50
            [documentary] => 50
            [drama] => 50
            [family] => 50
            [horror] => 50
            [romantic] => 50
            [sci-fi] => 50
            [thriller] => 50
        )

    [film_types] => Array
        (
            [blockbuster] => 0
            [independent] => 0
        )

    [film_eras] => Array
        (
            [1920s_1940s] => 0
            [1950s_1960s] => 0
            [1970s_1980s] => 0
            [1990s_2000s] => 0
            [post_2010] => 0
            [pre_1920s] => 0
        )

    [last_updated] => 2011-10-12 21:21:28
)

Pero cuando voy a actualizar estos datos en la metatabla del usuario a través de:

update_user_meta( $id_usuario, $meta_clave, $meta_valor, $anterior_valor)

Los datos se colocan en la base de datos correctamente, pero cuando vuelvo a llamar a los datos e imprimo la nueva matriz en la pantalla, tiene una clave de matriz anidada de [0] dentro de la matriz, así:

Array
(
    [0] => Array
        (
            [film_genres] => Array
                (
                    [action] => 50
                    [comedy] => 50
                    [crime] => 50
                    [documentary] => 50
                    [drama] => 50
                    [family] => 50
                    [horror] => 50
                    [romantic] => 50
                    [sci-fi] => 50
                    [thriller] => 50
                )

            [film_types] => Array
                (
                    [blockbuster] => 0
                    [independent] => 0
                )

            [film_eras] => Array
                (
                    [1920s_1940s] => 0
                    [1950s_1960s] => 0
                    [1970s_1980s] => 0
                    [1990s_2000s] => 0
                    [post_2010] => 0
                    [pre_1920s] => 0
                )

            [last_updated] => 2011-10-12 21:21:28
        )

)

¿Cómo puedo hacer que almacene la matriz exactamente como mi primera matriz? Estoy extrayendo la matriz de valores meta a través del comando WP:

$wp_user_film_prefs_arr = get_user_meta( $wp_user_id, $wp_user_film_prefs_key_label, false );

¿Hay algo que estoy haciendo mal? ¡¡¡Gracias por adelantado!!!

avatar de usuario
hakré

Debe establecer el último parámetro de false a true:

$wp_user_film_prefs_arr = get_user_meta( $wp_user_id, $wp_user_film_prefs_key_label, true );

Ese tercer parámetro es $single:

(booleano) (opcional) Si es verdadero, devuelve el valor del campo de metadatos, si es falso, devuelve una matriz.

Predeterminado: falso

Eso puede sonar contraproducente a sus ojos, pero el campo de metadatos puede contener múltiples valores. En tu caso no necesitas eso, sino el valor único. El valor único es su matriz.

Ver también: get user metaCódice

  • ¡Sí, tenías razón! Inicialmente elegí falso pensando que luego devolvería la matriz, como en mi matriz de valores, pero está devolviendo una matriz DEL campo de metadatos. Cambió a verdadero para devolver el valor y luego lo almacenó como una matriz con “maybe_unserialize($wp_user_film_prefs_val);” ¡Gracias hombre!

    – chuuke

    13/10/2011 a las 15:55

  • Es difícil hacerse a la idea de pensar en una matriz como un valor único

    – henry wright

    11 de marzo de 2014 a las 11:28

  • Seguro que es un diseño de API pobre, ¡gracias por tu respuesta!

    – Maciej Krawczyk

    17 de marzo de 2018 a las 11:39

¿Has considerado serialize() como una cadena y almacene esta cadena en su base de datos, y unserialize() el str en matriz después de obtener de db?

  • WordPress hace la serialización por ti detrás de escena. @harkra tenía la respuesta correcta.

    – Jaime

    27/09/2012 a las 20:53

¿Ha sido útil esta solución?