Ändern der Metaabfrage der Hauptabfrage basierend auf benutzerdefinierten Abfrageradungen und Verwendung von Vorabsetzposten

Ich habe benutzerdefinierte Rewrite-Regeln und query_vars , die zur Anzeige einer Liste von Ereignissen auf der Grundlage des ISO-Datumsformats verwendet werden. Wenn beispielsweise ein Benutzer die URL anfordert, http://site.com/by-date/2013-04-04/ , ist meine query_var der query_var und ich möchte eine Liste von Ereignissen anzeigen, deren meta_keymeta_key von _event_scheduled_date gleich ist der ISO-Datumswert in der query_var .

Immer wenn ich den folgenden Code versuche, um die $query in pre_get_posts zu ändern, pre_get_posts WordPress einen 404 ein und es werden keine Posts abgefragt. Ich konnte pre_get_posts , um andere Taxonomielisten und pre_get_posts zu manipulieren, aber ich konnte sie mit dem benutzerdefinierten query_var ich erstellt habe, richtig arbeiten lassen.

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

Solutions Collecting From Web of "Ändern der Metaabfrage der Hauptabfrage basierend auf benutzerdefinierten Abfrageradungen und Verwendung von Vorabsetzposten"

Anstatt zu versuchen, alle übereinstimmenden Ereignisse auf Ihrer Seite by-date zu zeigen, könnten Sie versuchen, durch ?post_type=event wie ?post_type=event 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 Standard Twenty Twelve Theme, mit URL wie dieser:

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