Cómo llamar correctamente las fechas de campos personalizados en un filtro posts_where utilizando sentencias SQL

wordpress.stackexchange https://wordpress.stackexchange.com/questions/5546

  •  16-10-2019
  •  | 
  •  

Pregunta

Actualmente tengo el bucle listado de mensajes entre dos fechas utilizando el filtro de posts_where:

 function filter_where( $where = '' ) {
  $where .= " AND post_date >= '2000-01-01' AND post_date <= 2004-12-31' ";
  return where;
 }
 add_filter('posts_where', 'filter_where');
 query_posts($query_string);
 while (have_posts()) :
   the_post();
   the_content();
 endwhile;

En una llamada meta_key original_date me han almacenado una fecha diferente para cada puesto que deseo utilizar en lugar de la post_date. ¿Cómo me llamo correctamente este meta_key en la consulta $where para cumplir el mismo propósito que el post_date?

$where .= " AND [meta_key=original_date] >= '2000-01-01' AND [meta_key=original_date] <= '2004-12-31' ";

Por ejemplo, la siguiente consulta SQL no parece trabajo, a pesar de que los valores correctos (2001-10-29, 2004-11-03, etc.) están presentes en la original_date meta_key de los mensajes:

global $wpdb;
 $where .= " AND (SELECT meta_value FROM $wpdb->postmeta WHERE meta_key='original_date' ) >= '2000-01-01' AND (SELECT meta_value FROM $wpdb->postmeta WHERE meta_key='original_date' ) <= '2004-12-31' ";

mientras que el siguiente trabaja muy bien en los mismos mensajes usando su post_date como referencia:

$where .= " AND post_date >= '2000-01-01' AND post_date <= 2004-12-31' ";

Tal vez la matriz meta_value necesita ser despojado de algunos materiales extraños con el fin de dar formato a los resultados en la misma forma que post_date? ¿Cómo podemos abordar esto?

¿Fue útil?

Solución

Gracias a AmbitiousAmoeba por la respuesta. El siguiente código mejorada resuelve el problema:

function filter_where( $where = '' ) {
   global $wpdb;

   $where .= " AND (($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value >= '2000-01-01') AND ($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value <= '2004-12-31')) ";
   return where;
}
add_filter('posts_where', 'filter_where');
query_posts($query_string);
while (have_posts()) :
   the_post();
   the_content();
endwhile;

Otros consejos

Si usted tiene Desconocido wp_postmeta.meta_key columna en la cláusula where

Es posible que desee unirse a la mesa $wpdb->postmeta en esta consulta:

function custom_posts_join($join){
     global $wpdb;

     $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";

     return $join;
}
add_filter( 'posts_join' , 'custom_posts_join');
Licenciado bajo: CC-BY-SA con atribución
scroll top