Intereting Posts
Фильтрация сообщений по названию категории на основе slug страницы Исключить конкретные термины из всех запросов, используя posts_where или что-то похожее register_deactivation_hook argument -> передать аргументы в выбранной функции отключить лайтбокс в плагине Удаление прерывания WordPress из короткого кода на странице / Обновление сообщения Безопасно говорить, что в версиях безопасности WordPress нет обновлений базы данных Есть ли крючок или фильтр, когда возврат средств осуществляется через admin -woocommerce Истекает вторичная роль пользователя через X дней после его выделения Как запрашивать сообщения (в иерархическом пользовательском типе сообщений), в которых есть дети? Предварительные сообщения для одной записи Отредактируйте функцию the_content (), чтобы добавить обертку div Создать шаблон настраиваемого вложения, который обрабатывается из папки плагина? Запрос по категориям и настраиваемое поле – Shortcode как перенаправить на другой пост без получения заголовков уже отправленных ошибок? вырвать пользовательский html

Добавление переменных для отправки запроса

Как добавить пользовательские переменные в запрос wordpress без необходимости дважды ударять по базе данных. В приведенном ниже примере я хочу добавить некоторые мета-фильтры. Весь этот код работает нормально, но я выполнял query_posts () для его выполнения. Я хочу иметь возможность добавить к запросу, прежде чем он будет запущен по умолчанию, поэтому мне не нужно дважды запрашивать db.

В этом я надеялся, что если я изменю запрос $ wp_query-> до его выполнения, мои изменения будут добавлены в запрос. Запрос изменяется отлично, а не выход. Есть идеи? Благодарю.

add_action('pre_get_posts', 'my_custom_query'); function my_custom_query(){ if(isset($_SESSION['size']) && $_SESSION['size'] != 'all'){ $cfilter[] = array( 'key' => 'cc_size', 'value' => $_SESSION['size'] ); } if(isset($_SESSION['gender']) && $_SESSION['gender'] != 'all'){ $cfilter[] = array( 'key' => 'cc_gender', 'value' => $_SESSION['gender'] ); } $extraArgs = array( 'orderby' => 'post-title', 'paged' => get_query_var('paged') ); if(!empty($cfilter)){ $extraArgs['meta_query'] = $cfilter; } global $wp_query; $wp_query->query = array_merge( $wp_query->query, $extraArgs ); 

}

Solutions Collecting From Web of "Добавление переменных для отправки запроса"

Как сказал toscho, вы можете изменить запрос в крюке pre_get_posts . Этот hook получает объект запроса, переданный как аргумент, поэтому вам не нужно читать глобальную переменную.

 add_action( 'pre_get_posts', 'wpse12692_pre_get_posts' ); function wpse12692_pre_get_posts( &$wp_query ) { if( isset( $_SESSION['size'] ) && $_SESSION['size'] != 'all' ) { $wp_query->query_vars['meta_query'] = array( 'key' => 'cc_size', 'value' => $_SESSION['size'], ); } if( isset( $_SESSION['gender'] ) && $_SESSION['gender'] != 'all' ) { $wp_query->query_vars['meta_query'] = array( 'key' => 'cc_gender', 'value' => $_SESSION['gender'], ); } $wp_query->query_vars['orderby'] = 'post-title'; // The next line is redundant, get_query_vars reads it from the global $wp_query object $wp_query->query_vars['paged'] = get_query_var('paged'); } 

Я вижу, что ваш запрос зависит от переменных сеанса. Это может затруднить отправку ссылки на страницу кому-то другому. Вы считали, что поместили это в URL-адрес и прочитали его оттуда? Вы можете сделать это, создав дополнительные правила перезаписи.

'pre_get_posts' к действию 'pre_get_posts' .
Пример:

 add_action( 'pre_get_posts', 'no_sticky_on_front' ); function no_sticky_on_front() { is_front_page() and $GLOBALS['wp_query']->query_vars['ignore_sticky_posts'] = TRUE; }