So rufen Sie benutzerdefinierte Felddaten mithilfe von SQL-Anweisungen korrekt in einen posts_where-Filter auf

7

Derzeit habe ich die Schleife, in der Beiträge zwischen zwei Daten mithilfe des posts_whereFilters aufgelistet werden:

 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;

In einem meta_keyangerufenen habe original_dateich für jeden Beitrag, den ich anstelle des verwenden möchte, ein anderes Datum gespeichert post_date. Wie rufe ich dies korrekt meta_keyin die $whereAbfrage auf, um den gleichen Zweck wie die zu erfüllen post_date?

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

Zum Beispiel ist die folgende SQL - Abfrage nicht zu funktionieren scheint, obwohl richtige Werte ( 2001-10-29, 2004-11-03usw.) in der Gegenwart sind original_date meta_keydie Beiträge:

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' ";

Das Folgende funktioniert gut für dieselben Beiträge, die post_dateals Referenz verwendet werden:

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

Möglicherweise muss das meta_valueArray von Fremdmaterial befreit werden, um die Ergebnisse in die gleiche Form zu formatieren wie post_date? Wie können wir das angehen?

Maduroblanco
quelle
versuchen$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')) ";
onetrickpony

Antworten:

6

Vielen Dank an AmbitiousAmoeba für die Antwort. Der folgende verbesserte Code löst das Problem:

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;
Maduroblanco
quelle
1
Ich erhalte die folgende Fehlermeldung, wenn ich die letzte Abfrage in phpMyAdmin ausführe #1054 - Unknown column 'wp_postmeta.meta_key' in 'where clause'. Kannst du dabei helfen?
a_fan
3

Wenn Sie eine unbekannte Spalte wp_postmeta.meta_keyin der whereKlausel haben

Sie möchten wahrscheinlich die $wpdb->postmetaTabelle in diese Abfrage einbinden:

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');
Robert Isaev
quelle