add_filter, где вопрос о статусе

Я пытаюсь получить начальные и конечные даты для сообщений, отфильтрованных, и я нашел документацию для фильтра «posts_where», я просто тестирую его до сих пор, но когда я добавляю фильтр, он, кажется, втягивает данные цикла для основная навигация (т. е. из wp_nav_menu ())

Я добавил:

<?php remove_filter('posts_where', 'uc_filter_where'); ?> <?php wp_nav_menu(array('sort_column' => 'menu_order', 'menu_class' => 'nav', 'theme_location' => 'primary-menu')); ?> 

в попытке очистить фильтр для сообщений, но нет такой удачи. Кто-нибудь объяснит мне, что я делаю неправильно.

Solutions Collecting From Web of "add_filter, где вопрос о статусе"

Поэтому прежде всего вы захотите убедиться, что вы хотите, и WHERE в. posts_where будет posts_where (почти) каждый запрос, чтобы вы были уверены, что добавляете его в нужное. Это можно сделать с использованием условных тегов .

Примечание: добавляется WHERE 1=1 потому что это означает, что добавлено действительное выражение WHERE и может быть расширено с posts_where фильтра posts_where (т. posts_where Просто добавив AND X=Y ). Infact WordPress жестко кодирует WHERE и добавляет в условные выражения – так что ему нужно что-то, чтобы быть уверенным, что SQL-запрос действителен

 add_filter('posts_where', 'wpse55985_posts_where',10,2); function wpse55985_posts_where($where, $query){ global $wpdb; //$query is a WP_Query object if( $query->is_main_query() && is_tax('my-tax') ){ //This is the main query for the 'my-tax' taxonomy page if( isset($_GET[POSTS_END_DATE_NAME]) && isset($_GET[POSTS_START_DATE_NAME]) ){ //Variables are set. $start = $_GET[POSTS_START_DATE_NAME]; $end = $_GET[POSTS_END_DATE_NAME]; //Append our additional 'WHERE' clause $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date BETWEEN %s AND %s ", $start,$end ) ; } } return $where } 

объяснение

  1. Прежде всего используйте is_main_query() чтобы проверить, что это запрос, который является «основным» запросом для страницы. Условные все относятся к этому основному запросу. Поэтому я проверяю, что это основной запрос, и запрос для таксономии «мой налог» – в частности, просматривается страница таксономии «мой налог». Таким образом, вышеизложенное должно фильтровать сообщения на странице таксономии my-tax . См. is_tax() . В противном случае мы просто возвращаем предложение $where , не делая ничего.

  2. Убедитесь, что $_GET переменные $_GET вы используете. Вы действительно должны регистрировать пользовательские переменные запроса и использовать метод $query->get() чем напрямую обращаться с $_GET . Если они не установлены, мы не изменяем запрос.

  3. Используйте класс $wpdb чтобы получить имя $wpdb и безопасно подготовить запрос. См. Эту страницу Codex и последнюю часть этой статьи . Эта часть жизненно важна для защиты себя от SQL-инъекции.

Обратите внимание: я не тестировал это, и могут быть синтаксические ошибки.