¿Cómo busco una matriz almacenada en un campo personalizado usando WP_Query?

2

Tengo un tipo de publicación personalizada llamada "en el aire" que incluye un campo personalizado llamado "daysonair". El formulario para esto tiene casillas de verificación para cada día de la semana.

Cuando agrega / actualiza una publicación, los elementos marcados se almacenan como una matriz en el campo personalizado.

No puedo descubrir cómo agregar ese campo personalizado a mi búsqueda WP_Query ():

array( 'key' => 'daysonair',
       'value' => 'Thursday',
       'compare' => 'IN' )

He probado numerosos tipos de comparaciones sin suerte.

Los datos en la base de datos son:

a:5:{s:6:"Monday";s:6:"Monday";s:7:"Tuesday";s:7:"Tuesday";s:9:"Wednesday";s:9:"Wednesday";s:8:"Thursday";s:8:"Thursday";s:6:"Friday";s:6:"Friday";}

Donde se han comprobado todos los días de la semana. Solo estoy mirando para ver si el jueves está en la matriz.

    
pregunta Dave Navarro 27.09.2013 - 00:36

2 respuestas

5

La búsqueda dentro de una matriz serializada es difícil e ineficiente, es decir, lento. El siguiente SQL puro lo hará:

SELECT *
FROM 'wp_postmeta'
WHERE 'meta_key' LIKE 'daysonair'
AND 'meta_value' LIKE '%thursday%'
LIMIT 0 , 100

Algo como esto debería hacer que WP_Query haga algo similar:

$args = array(
  'post_type' => 'post',
  'meta_query' => array(
    array(
      'key' => 'daysonair',
      'value' => 'thursday',
      'compare' => 'LIKE',
    )
  )
);
$q = new WP_Query($args);
var_dump($q);

Pero las consultas LIKE con comodines, % , son muy lentas. La consulta debe verificar cada fila de la tabla para encontrar una coincidencia.

Además, esto será propenso a errores, ya que cualquier ocurrencia de "jueves" coincidirá, por ejemplo, con algo en una imagen adjunta alt de texto.

El problema es que una cadena serializada es una construcción PHP. MySQL no sabe qué hacer con él más que tratarlo como cualquier otra cadena.

La única solución realmente buena, y no sé si es posible en su caso, es cambiar la forma en que se almacenan los datos en la base de datos. Si necesita buscar los datos, no debe almacenarse como una cadena serializada. Cada dato debe almacenarse como un par de clave / valor independiente.

    
respondido por el s_ha_dum 27.09.2013 - 01:28
1

Una consulta LIKE personalizada funcionará , no funcionará, pero personalmente no confiaría en ella para nada más que la implementación más simple (como dijo s_ha_dum en los comentarios).

Una mejor solución es crear una taxonomía personalizada para "días de la semana" y ejecutar una consulta fiscal basada en eso. Este es exactamente el tipo de cosas para las que está diseñado el sistema de taxonomía.

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'days_of_week',
            'field' => 'slug',
            'terms' => 'wednesday'
        )
    )
);
$query = new WP_Query( $args );
    
respondido por el MathSmath 02.05.2014 - 17:12

Lea otras preguntas en las etiquetas