Intereting Posts
Автоматически деактивировать ссылку для вложений Как лучше всего создать слайдер jQuery, чтобы отобразить собственную галерею wordpress? Не удалось выровнять боковую панель с секцией содержимого вместо комментариев. Введите имя категории сообщения в миниатюру Корзина Страница – Woocommerce Как получить идентификатор элемента в аудио-плейлисте? В чем разница между term_id и term_taxonomy_id On Multisite: Loop для отображения первых четырех изображений последних сообщений по всей сети Есть ли способ добавить дополнительные функции в 1 пользовательские поля? Например: answer1; answer2; answer3; Запрос WordPress очень медленный, если order_by multi metabox Детский сайт не отображается в меню «Сеть» Можно ли дать пользователю возможность выбрать между двумя отдельными файлами шаблонов для использования в сообщении? Как исключить категории из последних сообщений, последних комментариев и категорий виджетов? Где WordPress получает свое ядро ​​и обновления плагинов Получить размер меньшей версии изображения

Изменение meta_query основного запроса на основе пользовательских query_vars и использование pre_get_posts

Я зарегистрировал пользовательские правила перезаписи и query_vars для использования для отображения списка событий на основе формата даты ISO. Например, когда пользователь запрашивает URL-адрес, http://site.com/by-date/2013-04-04/ , мой query_var является частью даты, и я бы хотел отобразить список событий, у которых meta_key из _event_scheduled_date равно значение даты ISO в query_var .

Всякий раз, когда я пытаюсь выполнить следующий код, чтобы изменить $query в pre_get_posts WordPress инициирует 404, и никакие сообщения не запрашиваются. Я смог использовать pre_get_posts чтобы манипулировать другими списками таксономии и страницами архива, но все же смог заставить его работать правильно с пользовательским query_var который я создал.

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

Вместо того, чтобы отображать все соответствующие события на вашей ?post_type=event странице, вы можете попытаться отобразить через ?post_type=event как это:

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

Это работает с моей установкой WordPress 3.5.1 с темой Twenty Twelve по умолчанию, с URL-адресом, подобным этому:

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