Estoy trabajando en un proyecto en el que estoy creando un tipo de publicación personalizada y datos personalizados ingresados a través de meta cuadros asociados con mi tipo de publicación personalizada. Por alguna razón, decidí codificar los meta cuadros de tal manera que las entradas en cada meta cuadro sean parte de una matriz. Por ejemplo, estoy almacenando longitud y latitud:
<p>
<label for="latitude">Latitude:</label><br />
<input type="text" id="latitude" name="coordinates[latitude]" class="full-width" value="" />
</p>
<p>
<label for="longitude">Longitude:</label><br />
<input type="text" id="longitude" name="coordinates[longitude]" class="full-width" value="" />
</p>
Por alguna razón, me gustó la idea de tener una entrada de postmeta singular para cada metabox. En el save_post
gancho, guardo los datos así:
update_post_meta($post_id, '_coordinates', $_POST['coordinates']);
Hice esto porque tengo tres metaboxes y me gusta tener solo 3 valores postmeta para cada publicación; Sin embargo, ahora me he dado cuenta de un problema potencial con esto. Es posible que desee usar WP_Query para extraer solo ciertas publicaciones basadas en estos meta valores. Por ejemplo, es posible que desee obtener todas las publicaciones que tengan valores de latitud superiores a 50. Si tuviera estos datos en la base de datos individualmente, tal vez usando la clave latitude
, haría algo como:
$args = array(
'post_type' => 'my-post-type',
'meta_query' => array(
array(
'key' => 'latitude',
'value' => '50',
'compare' => '>'
)
)
);
$query = new WP_Query( $args );
Como tengo la latitud como parte de la _coordinates
postmeta, esto no funcionaría.
Entonces, mi pregunta es, ¿hay alguna manera de utilizar meta_query
para consultar una matriz serializada como la que tengo en este escenario?
fuente
También me encuentro con esta situación. Aquí lo que hice:
Espero que esto ayude
fuente
$value
también es una identificación. En ese caso, sugiero crear funciones para agregar un carácter a cada elemento de la matriz antes de guardar los datos y otra función para eliminar el carácter antes de usar los datos. Este wat, eli:2
índice serializado no se confundirá con eli:D2
de los datos "reales". ¡El parámetro de meta consulta entonces se convertirá'value' => sprintf(':"D%s";', $value),
y mantendrá la funcionalidad correcta de esta maravillosa respuesta!LIKE
es una manera excelente y rápida de desactivar su servidor (sin mencionar los falsos positivos) es mejor que tenga un muy buen almacenamiento en caché.Realmente va a perder la capacidad de consultar sus datos de manera eficiente al serializar entradas en la base de datos de WP.
El ahorro general de rendimiento y la ganancia que cree que está logrando con la serialización no se notará en gran medida. Es posible que obtenga un tamaño de base de datos un poco más pequeño, pero el costo de las transacciones SQL será alto si alguna vez consulta esos campos e intenta compararlos de una manera útil y significativa.
En su lugar, guarde la serialización para datos que no tiene la intención de consultar de esa naturaleza, sino que solo accedería de manera pasiva mediante la llamada directa a la API de WP
get_post_meta()
: desde esa función también puede desempaquetar una entrada serializada para acceder a sus propiedades de matriz.De hecho, se le asigna el valor de verdadero como en;
$meta = get_post_meta( $post->ID, 'key', true );
Devolverá los datos como una matriz, accesible para que pueda iterar de la forma habitual.
Puede centrarse en otras optimizaciones de bases de datos / sitios, como el almacenamiento en caché, la minificación CSS y JS y el uso de servicios como CDN si lo requiere. Por nombrar solo algunos ... WordPress Codex es un buen punto de partida para descubrir más sobre ese tema: AQUÍ
fuente
Acabo de tratar con campos serializados y podría consultarlos. No usando meta_query sino usando una consulta SQL.
La consulta primero busca la publicación con el post_type correspondiente, por lo que la cantidad de registros wp_postmeta será menor para filtrar. Luego agregué una instrucción where para reducir aún más las filas al filtrar
meta_key
Los ID terminan muy bien en una matriz según sea necesario para get_posts.
PD. Se necesita MySQL v5.6 o superior para un buen rendimiento de subconsulta
fuente
Este ejemplo realmente me ayudó. Es específicamente para el complemento S2Members (que serializa los metadatos del usuario). Pero le permite consultar una parte de una matriz serializada dentro de la meta_key.
Funciona utilizando la función MySQL REGEXP.
Aquí esta la fuente
Aquí está el código que consulta a todos los usuarios que viven en los EE. UU. Lo modifiqué fácilmente para consultar uno de mis campos de registro personalizados y lo hice funcionar en poco tiempo.
fuente
Creo que hay 2 soluciones que pueden tratar de resolver el problema de los resultados almacenados como String e Integers. Sin embargo, es importante decir, como señalaron otros, que no es posible garantizar la integridad de los resultados almacenados como Integer, ya que estos valores se almacenan como matrices serializadas, el índice y los valores se almacenan exactamente con el mismo patrón. Ejemplo:
se almacena como una matriz serializada, como esta
Tenga en cuenta el
i:0
como la primera posición de la matriz yi:37
como el primer valor. El patrón es el mismo. Pero vamos a las soluciones1) Solución REGEXP
Esta solución funciona para mí independientemente del metavalor que se guarde como cadena o número / id. Sin embargo, usa
REGEXP
, que no es tan rápido como usarLIKE
2) COMO solución
No estoy seguro de la diferencia de rendimiento, pero esta es una solución que usa
LIKE
y también funciona para números y cadenasfuente
REGEXP
es bueno en ciertas situaciones, pero si puedes usarloLIKE
, creo que es el método preferible. Un viejo enlace, pero todavía bastante útil, en mi opinión: thingsilearn.wordpress.com/2008/02/28/… :-)LIKE
es más rápido. Pero esta es una solución que funciona tanto para cadenas como para númerosLIKE
pero funciona tanto para números como para cadenas. No estoy seguro sobre el rendimiento porque tiene que comparar los resultados usandoOR
Después de leer un montón de consejos para ejecutar un
WP_Query
filtrado por matrices serializadas, así es como finalmente lo hice: creando una matriz de valores separados por comas mediante implode junto con una$wpdb
consulta SQL personalizada que utilizaFIND_IN_SET
para buscar en la lista separada por comas el valor solicitado.(Esto es similar a la respuesta de Tomás, pero requiere un poco menos de rendimiento para la consulta SQL)
1. En functions.php:
En su archivo functions.php (o donde sea que esté configurando el cuadro meta) en la
yourname_save_post()
función usepara crear la matriz que contiene valores separados por comas.
También querrá cambiar su variable de salida en la
yourname_post_meta()
función de construcción de meta cuadro de administrador a2. En el archivo PHP de plantilla:
Prueba: si ejecuta un
get_post_meta( $id );
, debería vercheckboxArray
como una matriz que contiene sus valores separados por comas en lugar de una matriz serializada.Ahora, construimos nuestra consulta SQL personalizada usando
$wpdb
.Observe el
FIND_IN_SET
, ahí es donde sucede la magia.Ahora ... ya que estoy usando
SELECT *
esto, devuelve todos los datos de la publicación y dentro de élforeach
puedes hacer eco de lo que quieres de eso (hazloprint_r($posts);
si no sabes lo que está incluido. No configura "el bucle" para usted (lo prefiero de esta manera), pero se puede modificar fácilmente para configurar el bucle si lo prefiere (eche un vistazo alsetup_postdata($post);
códice, probablemente tendrá que cambiarSELECT *
para seleccionar solo ID de publicaciones y$wpdb->get_results
el$wpdb
tipo correcto ) - Consulte el códice para obtener$wpdb
también información sobre ese tema).¡Cielos, tomó un poco de esfuerzo, pero como
wp_query
no admite hacer'compare' => 'IN'
valores serializados o separados por comas, esta cuña es su mejor opción!Espero que esto ayude a alguien.
fuente
Si usa el
like
operador de comparación en su meta consulta, debería funcionar bien mirar dentro de una matriz serializada.resultados en:
fuente
Si mis metadatos son de tipo matriz, usaré este método para consultas por meta:
fuente
Tengo curiosidad por las respuestas anteriores, donde
meta_query
apuntaron la clave enlatitude
lugar de_coordinates
. Tuve que ir y probar si realmente era posible en meta consultas para apuntar a una clave específica dentro de una matriz serializada. :)Obviamente ese no fue el caso.
Entonces, tenga en cuenta que la clave correcta para apuntar es en
_coordinates
lugar delatitude
.NOTAS
Este enfoque solo permite apuntar a coincidencias exactas. Así que cosas como todas las latitudes mayores de 50 no son posibles.
Para incluir coincidencias de subcadenas, se podría usar
'value' => sprintf(':"%%%s%%";', $value),
. (no lo he probado)fuente
Tengo la misma pregunta. ¿Quizás necesita el parámetro 'tipo'? Consulte esta pregunta relacionada: Consulta de campo personalizada : el valor meta es matriz
Quizás intente:
fuente
Me encontré con algo similar mientras usaba el complemento Magic Fields. Esto podría hacer el truco
fuente
serialize()
no es necesario en este caso ...