Aquí están los argumentos para mi consulta:
$args = array(
'post_type' => 'news',
'meta_query' => array(
array(
'key' => 'topics',
'value' => 'sports',
)
)
);
Esto funciona cuando topics
es una cadena, pero no cuando es una matriz. Me gustaría que esta consulta funcione cuando topics
es, por ejemplo,array( 'sports', 'nonprofit', etc. )
¿Hay alguna manera de construir meta consultas con matrices como meta_key?
query
meta-query
mike23
fuente
fuente
Respuestas:
Alimentando la consulta una matriz de valores posibles
Si el valor en la base de datos es una cadena y desea alimentar la consulta con varios valores:
Búsqueda de un valor específico en una matriz de datos serializada
Si el valor en la base de datos es una matriz de varios temas y desea buscar un solo tema dentro de esa matriz (tenga en cuenta que una matriz en la base de datos se puede recuperar como tal, pero vive en la base de datos en forma serializada, que es un cadena también):
Usar 'LIKE' como el valor de comparación no es una instrucción tan clara como podría haber esperado, pero es la mejor opción.
Además de eso, su única otra opción sería recuperar todas las publicaciones que tienen los "temas" meta_key establecidos e iterar sobre ellos manualmente o, en otras palabras, verificar el valor dentro del bucle y mostrar las publicaciones en dicha condición.
fuente
Para salirse de la respuesta de Johannes, dado que es una matriz serializada, si está almacenando algo como la identificación del usuario (que era mi caso), es posible que deba manejarlo de manera un poco diferente.
La meta del mensaje se estaba guardando como:
Entonces sí, son enteros, pero a través de
update_post_meta
ellos se guardaron como cadenas.Entonces, en realidad estás haciendo una comparación ME GUSTA con la versión de cadena serializada de lo que estás buscando. Pasé un par de horas tratando de hacer que algo como esto funcionara y hasta ahora fue lo mejor que se me ocurrió.
fuente
'meta_query' => array( array( 'key' => 'my_meta_key', 'value' => ':' . $user_id . ';', 'compare' => 'NOT LIKE' ) )
porque cuando se serializan, todos los valores se guardan como: ' :valor;'Otra ligera mejora de la respuesta de @sMyles.
He tenido casos en los que las ID se han almacenado como cadenas (como cuando se toman de una entrada de formulario) y como enteros (por ejemplo
update_post_meta($post_id, authorized_users', array(get_current_user_id()));
). Esto es algo así como el problema bien conocido con elwp_set_object_terms()
que puede usar ID de términos para establecer los términos, pero si no los convierte como enteros primero, tiene una probabilidad del 50% de crear nuevos términos con esos números como sus nombres en lugar.Esto puede hacer que se almacenen de manera bastante diferente en una matriz serializada, como se puede ver en los extractos de tal caso de la base de datos de mi sitio de prueba:
Ambos de los anteriores, cuando se alimentan, se
print_r()
mostrarán comoPara solucionar esto, realicé un pequeño ajuste al
meta_query
agregar unarelation
y otra versión de la consulta que arrojó el valor como un entero en lugar de una cadena.Aquí está el resultado final:
EDITAR: Acabo de darme cuenta de que este método podría correr el riesgo de colisiones con los índices de la matriz, lo que podría permitir a alguien el acceso ilícito a los materiales si no están en la matriz, pero su ID de usuario aparece como un índice. Como tal, si bien esto funciona si tiene el problema discutido, una mejor práctica es asegurarse de que los valores que desea buscar se conviertan como cadenas antes de guardarlos para que pueda usar el método de @sMyles.
fuente
Iría por la respuesta de Johannes. Sin embargo, quiero mejorar eso porque usando esa meta_query, conocerás un caso como este
tu valor es
cuando buscas
entonces el resultado devolverá 'sport' y 'sport2'.
Para arreglar eso, cambie los argumentos meta_query en
Es porque el valor se serializa en la base de datos, y cada elemento estará separado por punto y coma. Por lo tanto, los argumentos anteriores funcionarán
Si los elementos en el valor son número, solo necesita eliminar la comilla doble "
fuente
Me encontré con algo similar hoy. Tengo que consultar un campo de relación ACF (Campos personalizados avanzados) con múltiples usuarios relacionados (matriz).
Después de actualizar el campo a través de php, la consulta no funcionó. Después de actualizarlo a través de la interfaz de usuario de ACF, la consulta funcionó.
El problema era que mi código php estableció los valores de relación como valores int, la IU lo configuró como valores de cadena. Para asegurarme de que ambos funcionan, uso esta consulta ahora (ajustada al ejemplo aquí):
fuente