WordPress: get_post_meta() devuelve resultados en orden aleatorio

Una de las funciones más útiles de WordPress es get_post_meta( ), que nos permite obtener alguno de los metadatos asociados a una entrada.

Si deseamos obtener un metadato único, utilizamos get_post_meta( $post->ID, 'meta_key', true ), y si es múltiple, get_post_meta( $post->ID, 'meta_key', false), y aquí nos podemos topar un problema importante, ya que en algunas circunstancias el orden en que devuelve los resultados es aleatorio.

La razón de esto es que al ejecutar la función, WordPress carga la información de todos los metadatos asociados a la entrada en el caché de objetos, pero esta consulta no incluye un ORDER BY que permita determinar el orden, y aunque es posible especificar un orden predeterminado en una tabla, los datos de la tabla no permanecen en el mismo orden al actualizarla (por eso es que el orden es aleatorio)… esto es, si estás utilizando tablas MyISAM.

Sin embargo, existe un workaround para evitar este problema, ya que al utilizar tablas InnoDB, el orden en que se devuelven los resultados al hacer una consulta sin ORDER BY siempre es el mismo: de forma ascendente según su PRIMARY KEY.

O sea, si tienes este problema, te lo puedes ahorrar fácilmente con ALTER TABLE wp_postmeta ENGINE = InnoDB.

¡Ah! Por cierto, este problema ya está reportado como bug, y la solución (o sea, el ORDER BY) debiese venir incluído en WordPress 3.8; ¡yei!

2 comments

    1. Sí, a partir de WordPress 3.8 se especifica un orden para obtener resultados desde $wpdb->post_meta, por lo que ya no se presenta el problema
      slds

Comments are closed.