web-dev-qa-db-de.com

Abfrage zwischen Datumsangaben mithilfe von Filterumbrüchen in der Datumsauswahl in Wordpress 4.2.1

Ursprünglicher Beitrag: Abfrage zwischen Datumsangaben mithilfe von Datumsauswahlfeldern

Ich habe letztes Jahr ursprünglich einen Beitrag zu diesem Thema verfasst, aber das Update auf WP v4.2.1 scheint meinen Filter gebrochen zu haben. Zusammenfassend verwende ich ACF und Datumsauswahl-Plugin in einem benutzerdefinierten Beitragstyp "Ereignisse". Ich versuche Ereignisse zwischen einem Start- und einem Enddatum abzufragen. Ich habe auch Ereignisse, die mehrere Monate umfassen können. Beispielsweise kann eine Veranstaltung im April beginnen, aber im Juni enden. Ich möchte, dass dieses Ereignis im April, Mai und Juni angezeigt wird.

Ich hatte diese Arbeit mit einem Filter, als auf v3.9 von WordPress. Ich versuche, WordPress auf allen meinen Websites zu aktualisieren, aber dieser Filter bricht nach der Aktualisierung auf Version 4.2.1 ab. Dies brach nach dem Update von WP 4.2.1 und auch nach dem Update von ACF auf die neueste Version von 4. Ich habe seitdem auf ACF PRO v5.2.3 aktualisiert

Kennt jemand einen Fix?

Hier ist der Code, der unter WP v3.9 hervorragend funktioniert hat.

Meine Event Widge Vorlage:

<?php
/* Template Name: Events Widget */
$today = date('Ymd');

if (isset($_GET['_m'])) {

    $current_month = str_pad($_GET['_m'], 2, '0', STR_PAD_LEFT);
    $current_day = "01"; // day one
    $current_year = $_GET['_y'];

    $get_last_day = $current_year.$current_month.$current_day;
    $lastday = date("t", strtotime($get_last_day));

    $tempstartday = $current_year.$current_month.$current_day;
    $tempendday = $current_year.$current_month.$lastday;

    $startday = date('Ymd', strtotime($tempstartday));
    $endday = date('Ymd', strtotime($tempendday));

} else {

    $current_month = str_pad(date('m'), 2, '0', STR_PAD_LEFT);
    $current_day = "01"; // day one
    $current_year = date('Y');

    $get_last_day = $current_year.$current_month.$current_day;
    $lastday = date("t", strtotime($get_last_day));

    $tempstartday = $current_year.$current_month.$current_day;
    $tempendday = $current_year.$current_month.$lastday;

    $startday = date('Ymd', strtotime($tempstartday));
    $endday = date('Ymd', strtotime($tempendday));
}

add_filter( 'get_meta_sql', 'get_meta_sql_date', 10, 2 );

$qryevents = array(
    'post_type' => 'events',
    'posts_per_page' => 50,
    'status' => 'published',
    'meta_key' => 'event_start_date',
    'orderby' => 'meta_value',
    'order' => 'ASC',

    // produces meta join and where clauses for the query
    // which will be filtered in functions.php
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key'     => 'event_start_date',
            'compare' => '>=',
            'value'   => $startday,
            'type' => 'DATE'
        ),
        array(
            'key'     => 'event_end_date',
            'compare' => '<=',
            'value'   => $endday,
            'type' => 'DATE'
        )
    )
);

$loop = new WP_Query( $qryevents );
remove_filter( 'get_meta_sql', 'get_meta_sql_date', 10, 2 );

if ( $loop->have_posts() ) :
while ( $loop->have_posts() ) : $loop->the_post();

// Let's format the dates
$get_start_date = get_field('event_start_date');
$get_end_date = get_field('event_end_date');
$event_start_date = DateTime::createFromFormat('Ymd', $get_start_date);
$event_end_date = DateTime::createFromFormat('Ymd', $get_end_date);
// End of date definitions

// Let's get the event start and end times
$get_start_time = get_field('event_start_time');
$get_end_time = get_field('event_end_time');
// end of times

// Let's get the times of the events now
$specify_event_time = "";

$show_event_times = get_field('specify_event_times');
if($show_event_times){
        foreach($show_event_times as $specify_event_time){
            // Do nothing; this puts the yes value into the varible for us to later on the page.
            // echo $specify_event_time;
        }
}
// End of the specify times


$event_month_spans = get_field('event_month_span');
?>

<div class="<?php echo (++$j % 2 == 0) ? 'full row' : 'full row alt'; ?>">
<p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
    <?php if($specify_event_time == "yes"): ?>
    <p class="event-date"><a href="<?php the_permalink(); ?>"><?php echo $event_start_date->format('M d, Y'); ?> <?php echo $get_start_time; ?> - <?php echo $event_end_date->format('M d, Y'); ?> <?php echo $get_end_time; ?></a></p>
  <?php else: ?>
    <p class="event-date"><a href="<?php the_permalink(); ?>"><?php echo $event_start_date->format('M d, Y'); ?> - <?php echo $event_end_date->format('M d, Y'); ?></a></p>
  <?php endif; ?>
</div>   

<?php
endwhile;

else:
?>
<p>No scheduled events.</p>
<?php endif; wp_reset_query(); ?>

In meiner functions.php Datei habe ich diese Funktion:

function get_meta_sql_date( $pieces, $queries ) {
    global $wpdb;

    // get start and end date from query
    foreach ( $queries as $q ) {

        if ( !isset( $q['key'] ) ) {
            return $pieces;
        }

        if ( 'event_start_date' === $q['key'] ) {
            $start_date = isset( $q['value'] ) ?  $q['value'] : '';
        }
        if ( 'event_end_date' === $q['key'] ) {
            $end_date = isset( $q['value'] ) ?  $q['value'] : '';
        }
    }

    if ( ( '' === $start_date ) || ( '' === $end_date ) ) {
        return $pieces;
    }

    $query = "";

    // after start date AND before end date
    $_query = " AND (
        ( $wpdb->postmeta.meta_key = 'event_start_date' AND ( CAST($wpdb->postmeta.meta_value AS DATE) >= %s) )
        AND ( mt1.meta_key = 'event_end_date' AND ( CAST(mt1.meta_value AS DATE) <= %s) )
    )";
    $query .= $wpdb->prepare( $_query, $start_date, $end_date );

    // OR before start date AND after end date
    $_query = " OR (
        ( $wpdb->postmeta.meta_key = 'event_start_date' AND ( CAST($wpdb->postmeta.meta_value AS DATE) <= %s) )
        AND ( mt1.meta_key = 'event_end_date' AND ( CAST(mt1.meta_value AS DATE) >= %s) )
    )";
    $query .= $wpdb->prepare( $_query, $start_date, $end_date );

    // OR before start date AND (before end date AND end date after start date)
    $_query = " OR (
        ( $wpdb->postmeta.meta_key = 'event_start_date' AND ( CAST($wpdb->postmeta.meta_value AS DATE) <= %s) )
        AND ( mt1.meta_key = 'event_end_date'
            AND ( CAST(mt1.meta_value AS DATE) <= %s )
            AND ( CAST(mt1.meta_value AS DATE) >= %s )
        )
    )";
    $query .= $wpdb->prepare( $_query, $start_date, $end_date, $start_date );

    // OR after end date AND (after start date AND start date before end date) )
    $_query = "OR (
        ( mt1.meta_key = 'event_end_date' AND ( CAST(mt1.meta_value AS DATE) >= %s ) )
        AND ( $wpdb->postmeta.meta_key = 'event_start_date'
            AND ( CAST($wpdb->postmeta.meta_value AS DATE) >= %s )
            AND ( CAST($wpdb->postmeta.meta_value AS DATE) <= %s )
        )
    )";
    $query .= $wpdb->prepare( $_query, $end_date, $start_date, $end_date );

    $pieces['where'] = $query;

    return $pieces;
}
1
Robbiegod

Der benutzerdefinierte Meta-SQL-Filter ist nicht erforderlich. Das Schöne am Speichern von Datumsangaben im Format Ymd ist, dass Sie sie numerisch behandeln können und MySQL weiterhin Ereignisse in einem bestimmten "Bereich" finden und auf-/absteigend sortieren kann.

Ich habe dies kürzlich auf einer anderen Site mit ACF als Start-/Enddatum getan:

if ( ! empty( $_GET['_y'] ) )
    $year = absint( $_GET['_y'] );
else
    $year = date( 'Y ');

if ( ! empty( $_GET['_m'] ) && in_array( $month = absint( $_GET['_m'] ), range( 1, 12 ) ) )
    $month = zeroise( $month, 2 );
else
    $month = date( 'm' );

$qryevents = array(
    'post_type'      => 'events',
    'posts_per_page' => 50,
    'post_status'    => 'publish',
    'orderby'        => 'meta_value_num', // Ensure order is numerically based
    'order'          => 'ASC',

    'meta_query'     => array(
        'relation' => 'AND',
        array(
            'key'     => 'event_start_date',
            'compare' => '>=',
            'value'   => "{$year}{$month}01",
            'type'    => 'NUMERIC',
        ),
        array(
            'key'     => 'event_end_date',
            'compare' => '<=',
            'value'   => "{$year}{$month}31", // Doesn't matter if there aren't 31 days in this month, will still work,
            'type'    => 'NUMERIC',
        )
    )
);

Keine Notwendigkeit für die übermäßig komplexen Datumszeichenfolgenberechnungen und keine Notwendigkeit für den Filter.

3
TheDeadMedic

Die Dienstprogramme für Datum und Uhrzeit verwenden eine Trennung von Datums- und Uhrzeitmustern. Das Dienstprogramm date () zeigt das Datum in folgendem Muster an: ‘JJJJ-MM-TT’.

SQL Date Funktionen Oracle

0
Swati Sharma