¿Es posible actualizar la publicación meta desde la matriz en una sola llamada?

4 minutos de lectura

avatar de usuario
mejor programador del mundo

Fragmento de código:

$save_dbarray = array(
    'email'         => '[email protected]',
    'adress'        => 'adress'
);

//Save values from created array into db
foreach($save_dbarray as $meta_key=>$meta_value) {
   update_post_meta($post_id, $meta_key, $meta_value);
}

¿Hay alguna forma de optimizar el código anterior? En este escenario simple, no importaría, pero si tengo una matriz grande, ¿supongo que podría haber problemas de rendimiento al actualizar?

Me gustaría hacer algo como:

update_post_meta($post_id, $save_dbarray);

es posible?

  • Creo que esta es la mejor manera de hacerlo si desea que cada elemento tenga su propia clave (por supuesto, si todo puede estar bajo una clave, simplemente pase toda la matriz y luego use maybe_unserialize Por otro lado. Sin embargo, creo que usar varias claves es mejor hasta cierto punto porque hace que eliminarlas sea más fácil, etc. Usaría su ciclo casi como está, pero agregue una verificación si la clave existe y use add_post_meta si no es así También puede incluir una verificación de cadenas vacías en su matriz y luego llamar delete_post_meta Si te gusta. Depende de lo que quieras hacer con estos datos más adelante.

    – Máx.

    19 de marzo de 2014 a las 11:20

Si bien las otras respuestas son soluciones creativas a su problema, no parecen abordar el problema real ni responder a su pregunta.

La respuesta

No. WordPress update_post_meta solo funciona en un campo a la vez. Su mejor apuesta es seguir con el método que está usando arriba, con el foreach círculo. Las otras respuestas brindan formas de almacenar ese meta en un solo campo, lo que probablemente esté bien para algunos, pero (como en mi caso) algunos necesitan consultar esos valores, y tener una matriz codificada en JSON o serializada no es suficiente.

Desafortunadamente, WP no proporciona un método de “metaactualización masiva”, y si lo hiciera, probablemente sería un foreach círculo. Siempre puede escribir una función para ayudar a que su código sea más limpio, al menos:

<?php
function update_post_meta_array( $post_id, $meta ) {
    if ( ! get_post( $post_id ) || ! is_array( $meta ) || empty( $meta ) ) {
        return false;
    }

    foreach ( $meta as $meta_key => $meta_value ) {
        update_post_meta( $post_id, $meta_key, $meta_value );
    }

    return true;
}

  • wp_update_post() lo hace Tomar un meta_input argumentopero internamente es solo un bucle, por lo que no hay impacto en el rendimiento.

    – Ian Dunn

    8 de marzo a las 22:31

avatar de usuario
jose colton

phatskat es correcto en el sentido de que no hay una forma integrada de hacer esto y se requiere un bucle foreach.

Este es el más eficiente que he encontrado; también escribí sobre él en una publicación de blog:

add_action('init', 'bulk_update_post_meta_data');

function bulk_update_post_meta_data() {
    $args = array(
        'posts_per_page' => -1,
        'post_type' => 'POSTTYPEHERE',
        'suppress_filters' => true 
    );

    $posts_array = get_posts( $args );

    foreach($posts_array as $post_array) {
        update_post_meta($post_array->ID, 'POSTMETAKEY', 'NEWVALUE');
    }
}

avatar de usuario
jogesh_pi

¿Por qué no probar con publicar por fascículos() como esto:

De acuerdo a actualizar_post_meta() documentación puede pasar $meta_value como matriz, que se serializará en una cadena.

$save_dbarray = array(
  'email'         => '[email protected]',
  'adress'        => 'adress'
);


update_post_meta($post_id, 'my_custom_fields', $save_dbarray);

  • ¡Gracias por tu respuesta! ¿Qué quieres decir con que debería ser $meta_key? Se supone que la meta_key es el correo electrónico, la dirección, etc.

    – mejor programador del mundo

    19 de marzo de 2014 a las 10:17

  • @bestprogrammerintheworld actualicé el código, donde my_custom_fields es el nombre de la clave que le devuelve la matriz de serialización, simplemente deserialícela y utilícela con la matriz.

    – jogesh_pi

    19 de marzo de 2014 a las 10:20


  • Hm. Sí realiza la parte de serialización/desserialización, pero en realidad no realiza las actualizaciones de la base de datos. Y luego descubrí que debería usar may_serialize() y may_unserialize() en su lugar cuando usa WP. ¡¿Y descubrí que esta serialización se hizo automáticamente?! nacin.com/2010/04/18/wordpress-serializing-data

    – mejor programador del mundo

    19 de marzo de 2014 a las 10:33

  • @bestprogrammerintheworld aah me perdí esto (mixed) (required) The new value of the custom field. A passed array will be serialized into a string. para el valor meta, de la documentación .. codex.wordpress.org/Function_Reference/update_post_meta

    – jogesh_pi

    19/03/2014 a las 10:40

  • Sí, el nuevo VALOR se pasaría a una cadena. En su caso, la CLAVE ‘my_custom_fields’ guardaría la matriz $ save_dbarray en una cadena serializada (si entiendo el documento correctamente). Desafortunadamente, no tengo tu código para que funcione.

    – mejor programador del mundo

    19 de marzo de 2014 a las 12:24

Posible valor múltiple a la vez puedes generar tu valor escaped_json

$escaped_json = '{"key":"value with \\"escaped quotes\\""}';

update_post_meta( $id, 'double_escaped_json', wp_slash($escaped_json) );

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad