Intereting Posts
Получить последние сообщения по дате в Multisite Ограничьте фильтр специальным типом сообщения. Правильно ли я это делаю? Подключение сайта wordpress к устройству AngularJS APP Как добавить палитру в заголовок WordPress? Верхнее меню, отображаемое как Обычный текст перед загрузкой страницы Как получить архив пользовательских сообщений в папке Список блогов Страница 404 С настраиваемым типом почтового сообщения для родителя блога Ссылки на арабскую внутреннюю страницу перенаправляются на главную страницу wp_nav_menu (), как изменить класс <li>? Какой лучший способ использовать Bootstrap внутри панели администратора? Страница архива без формата сообщения (только стандартная запись) Почему абстрагирование html из кода плагина приводит к потере доступа к функциям wordpress? Возможно ли использовать различные шаблоны продуктов для определенной категории в WooCommerce? Удалить 100+ сообщений или медиафайлов из WordPress быстрее, чем по умолчанию? Изменение описания метатега wordpress с использованием функций WP

Я не могу установить meta_key в свой пользовательский запрос типа сообщения

Я создал пользовательскую запись, events и сохранил метаданные event_year для каждого события. Я пытаюсь получить архив событий года. Когда я иду по следующему URL-адресу, meta_key и meta_value по какой-либо причине не установлены, и, следовательно, архив событий не фильтруется.

 /?post_type=events&meta_key=event_year&meta_value=2011 

Отладка значений:

 echo $wp_query->query_vars['post_type']; // 'events' echo $wp_query->query_vars['meta_key']; // -blank- echo $wp_query->query_vars['meta_value']; // -blank- 

Почему я не могу установить meta_key и meta_value?

Мета-значения сохраняются в событиях. Я успешно показал их:

 get_post_meta($post->ID, 'event_year', true); // '2011' 

Это потому, что «meta_key» и «meta_value» не являются публичными вазами запросов. Другими словами, вы не можете использовать их в URL-адресах напрямую и не должны.

Вместо этого зарегистрируйте конкретный запрос var, например:

 function register_my_qv() { global $wp; $wp->add_query_var( 'my_qv' ); } add_action( 'init', 'register_my_qv' ); 

Затем вы можете перейти к URL-адресу, подобному этому ?my_qv=foobar

Все, что вам нужно сделать, это сопоставить свой запрос var с фактическим запросом, который вы хотите сделать:

 function map_my_qv( $wp_query ) { if ( $meta_value = $wp_query->get( 'my_qv' ) ) { $wp_query->set( 'meta_key', 'some_meta_key' ); $wp_query->set( 'meta_value', $meta_value ); } } add_action( 'parse_query', 'map_my_qv' ); 

Я не могу добавить комментарий к превосходному ответу scribu из-за низкой репутации, но все же вторая часть кода (функция map_my_qv ) во время работы над WP 4.2 давала мне 404s, отсутствующие сообщения в администраторах и PHP-уведомления о переменной $meta_value не задано. Поэтому здесь отредактированный код:

 function map_my_qv( $wp_query ) { if ( is_admin() || ! $wp_query->is_main_query() ) return; if ( $wp_query->get( 'my_qv1' ) ) { $wp_query->set( 'meta_key', 'my_meta_key1' ); $wp_query->set( 'meta_value', $wp_query->get( 'my_qv1' ) ); } if ( $wp_query->get( 'my_qv2' ) ) { $wp_query->set( 'meta_key', 'my_meta_key2' ); $wp_query->set( 'meta_value', $wp_query->get( 'my_qv2' ) ); } } add_action( 'parse_query', 'map_my_qv' );