it-swarm.com.de

Ändern der Metaabfrage der Hauptabfrage basierend auf benutzerdefinierten Abfragevariablen und unter Verwendung von pre_get_posts

Ich habe benutzerdefinierte Umschreiberegeln und query_vars registriert, um eine Liste von Ereignissen basierend auf dem ISO-Datumsformat anzuzeigen. Wenn ein Benutzer beispielsweise die URL http://site.com/by-date/2013-04-04/ anfordert, ist mein query_var der Datumsanteil und ich möchte eine Liste von Ereignissen anzeigen, deren meta_key von _event_scheduled_date dem ISO-Datumswert im query_var entspricht.

Immer wenn ich den folgenden Code versuche, um den $query in pre_get_posts zu ändern, startet WordPress einen 404 und es werden keine Posts abgefragt. Ich konnte pre_get_posts verwenden, um andere Taxonomie-Listen und Archivierungsseiten zu manipulieren, konnte es aber dennoch so einrichten, dass es mit dem benutzerdefinierten query_var, den ich erstellt habe, ordnungsgemäß funktioniert.

function rewrite_rule_by_date() {
    add_rewrite_rule('(by\-date)/([0-9]{4}\-[0-9]{2}\-[0-9]{2})$', 'index.php?pagename=$matches[1]&event_date=$matches[2]', 'top');
}
add_action( 'init', 'rewrite_rule_by_date' );

function query_var_by_date() {
    add_rewrite_tag( '%event_date%', '([0-9]{4}-[0-9]{2}-[0-9]{2})');
}
add_action( 'init', 'query_var_by_date' );

function custom_event_query( $query ) {
    if (  is_page( 'by-date' ) && get_query_var( 'event_date' ) && is_main_query() ) {
        $query->set( 'post_type', 'event' );
        $query->set( 'post_status', 'publish' );
        $query->set( 'meta_key', '_event_scheduled_date' );
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'order', 'ASC' );
        $query->set( 'post_per_page', -1 );

        $meta_query = array(
            array(
                'key' => '_event_scheduled_date',
                'value' => get_query_var( 'event_date' ),
                'type' => 'DATE',
                'compare' => '='
            )
        );

        $query->set( 'meta_query', $meta_query );
    }

    return $query;
}
add_filter( 'pre_get_posts', 'custom_event_query' );
4
hsatterwhite

Anstatt zu versuchen, alle übereinstimmenden Ereignisse auf Ihrer by-date-Seite anzuzeigen, können Sie auch versuchen, ?post_type=event folgendermaßen anzuzeigen:

function rewrite_rule_by_date() {
    add_rewrite_rule('by\-date/([0-9]{4}\-[0-9]{2}\-[0-9]{2})$', 'index.php?post_type=event&event_date=$matches[1]', 'top');
}
add_action( 'init', 'rewrite_rule_by_date' );

function query_var_by_date() {
    add_rewrite_tag( '%event_date%', '([0-9]{4}-[0-9]{2}-[0-9]{2})');
}
add_action( 'init', 'query_var_by_date' );

function custom_event_query( $query ) {
    if ( get_query_var( 'event_date' ) && is_main_query() ) {
        $query->set( 'post_type', 'event' );
        $query->set( 'post_status', 'publish' );
        $query->set( 'meta_key', '_event_scheduled_date' );
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'order', 'ASC' );
        $query->set( 'post_per_page', -1 );

        $meta_query = array(
            array(
                'key' => '_event_scheduled_date',
                'value' => get_query_var( 'event_date' ),
                'type' => 'DATE',
                'compare' => '='
            )
        );

        $query->set( 'meta_query', $meta_query );
    }

    return $query;
}
add_filter( 'pre_get_posts', 'custom_event_query' );

Dies funktioniert auf meiner Wordpress-3.5.1-Installation mit dem standardmäßigen Twenty Twelve-Theme, mit einer URL wie dieser:

http://example.com/by-date/2013-04-04/
8
birgire