it-swarm.com.de

Abfrage zwischen zwei Metawerten?

Wie beschränke ich die Abfrage auf zwei benutzerdefinierte Metafelder, ein Startdatum und ein Enddatum? So sehen meine Daten aus:

 meta_key | meta_value | 
 ------------------------ | 
 start_date | 20100131 | // 15. Januar 2010 
 Enddatum | 20100206 | // 6. Februar 2010 
 ------------------------ '
 
 $ Today = date (JJJJMMTT); 

Der Beitrag zeigt an, ob start_date = $today und läuft ab, wenn end_date = $today.

aktualisieren

Hier ist die Struktur auf meiner single.php

Erste Frage Ich verwende hier Ihre Antwort

<?php
query_posts( $query_string );
if (have_posts()) : while (have_posts()) : the_post();
    ?><a href="<?php the_permalink() ?>"><?php the_title() ?></a><br /><?php
endwhile; endif;
wp_reset_query();
?>

und Zweite Abfrage mit regulärer WordPress-Funktion, aber diese zweite Abfrage funktioniert nicht richtig

<?php
query_posts('showposts=5&meta_key=start_date&meta_compare=>&meta_value='.date("Ymd"));
if (have_posts()) : while (have_posts()) : the_post();
    ?><a href="<?php the_permalink() ?>"><?php the_title() ?></a><br /><?php
endwhile; endif;
wp_reset_query();
?>
2
Gerald

Erneut bearbeitet, um das Hinzufügen und Entfernen von Filtern zu demonstrieren:

Fügen Sie diese allgemeinen Funktionen in Ihre Datei functions.php ein. Dies sind die Filter, die Sie für die Schleifen aufrufen, in denen Sie Ihre Abfrage durch diese beiden Metawerte einschränken möchten:

function date_check_join( $join ) {
    global $wpdb;
    $join .= " JOIN ".$wpdb->postmeta." AS startdate ON 
        (".$wpdb->posts.".ID = startdate.post_id AND
        startdate.meta_key = 'start_date')
        JOIN ".$wpdb->postmeta." AS enddate ON 
        (".$wpdb->posts.".ID = enddate.post_id AND
        enddate.meta_key = 'end_date')";
    return $join;
    }

function date_check_where( $where ) {
    $today = date('Ymd');
    $where .= " AND startdate.meta_value <= $today
    AND enddate.meta_value >= $today";
    return $where;
    }

Fügen Sie sie nun auf den Seiten, auf denen Sie diese Filter einfügen möchten, vor den Schleifen hinzu, die Sie filtern möchten, und entfernen Sie sie anschließend. Zum Beispiel:

add_filter( 'posts_join', 'date_check_join' );
add_filter( 'posts_where', 'date_check_where' );

query_posts( "yourqueryhere" );
if (have_posts()) : while (have_posts()) : the_post();
// This loop will only includes where today is between start_date and end_date
endwhile; endif;

query_posts( "anotherqueryhere" );
if (have_posts()) : while (have_posts()) : the_post();
// This loop also only includes where today is between start_date and end_date
endwhile; endif;

remove_filter( 'posts_join', 'date_check_join' );
remove_filter( 'posts_where', 'date_check_where' );

query_posts( "thirdqueryhere" );
if (have_posts()) : while (have_posts()) : the_post();
// This loop is not affected by the filters, so you can query for posts 
// where start_date is in the future, or end_date in the past, etc.
endwhile; endif;

Sie müssen lediglich Ihre Bedingungen vor Ihrer Suche zu den Filtern "posts_join" und "posts_where" hinzufügen und diese anschließend entfernen (andernfalls werden diese Bedingungen auf alle Ihre Websites angewendet, einschließlich Seiten, Menüs usw.).

Wenn Sie dies vereinfachen können, indem Sie nur mit einem Feld vergleichen, können Sie das meta_compare -Attribut verwenden, das in das WP_Query-Objekt integriert ist. Sie können Ihre Posts für das Startdatum planen (sodass sie nicht vor dem Zeitplan angezeigt werden) und dann das Datum mit dem benutzerdefinierten Feld "Enddatum" vergleichen, wenn Sie eine Abfrage durchführen.

3
goldenapples

Die Antwort auf diese Frage: Ändern der Reihenfolge von Beiträgen nach Ansichten (mit dem Plugin "wp-postviews") zeigt Ihnen, wie Sie nach einem benutzerdefinierten Feld sortieren.

Schauen Sie sich die Codex-Dokumente für query_posts () an: http://codex.wordpress.org/Template_Tags/query_posts , und sehen Sie sich die benutzerdefinierten Feldabschnitte an.

Dann müssen Sie nur noch einen Test in die Schleife einfügen, um zu überspringen, ob ($ today <start_date oder $ today> end_date)

0
anu