2016-12-29 11 views
0

Я написал эти функции, чтобы фильтровать сообщения на основе метаданных. Контекст - это сайт недвижимости, свойства которого являются CPT. В этих функциях я фильтрую свойства на стороне администратора агентами, продающими их. Функция работает при любой новой попытке. Если агент выбран, фильтр будет показывать только свойства, продаваемые этим агентом.Wordpress admin filter by meta, параметры фильтра исчезают после поиска

Проблема, с которой я столкнулся, сохраняется после этой начальной фильтрации. Список агентов просто исчезает. У меня возникает ощущение, что цикл, который я запускал для создания списка, останавливается по какой-либо причине.

Чтобы визуально прояснить, вот изображение того, как выглядит список фильтров перед поиском.

enter image description here

А вот как это выглядит после использования фильтра

enter image description here

Очевидно, если ADMIN_FILTER_FIELD_VALUE (идентификационный номер здесь) = появляется в URL с любым заданным значением, то цикл выиграл» t запустить.

Вот код всего этого.

add_filter('parse_query', 'agents_posts_filter'); 
function agents_posts_filter($query){ 
    global $pagenow; 
    $type = 'post'; 
    if (isset($_GET['post_type'])) { 
     $type = $_GET['post_type']; 
    } 
    if ('properties' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '') { 
     $query->query_vars['meta_key'] = 'select-agent-value'; 
     $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE']; 
    } 
} 

add_action('restrict_manage_posts', 'filter_post_type_by_agent'); 
function filter_post_type_by_agent(){ 
    global $pagenow; 
    $type = 'post'; 
    if (isset($_GET['post_type'])) { 
     $type = $_GET['post_type']; 
    } 

    if ('properties' == $type && is_admin() && $pagenow=='edit.php') { 
     ?> 
     <select name="ADMIN_FILTER_FIELD_VALUE"> 
     <option value=""><?php _e('Filter By Agent'); ?></option> 
     <?php 
      $args = array(
       'post_type' => 'agents', 
       'posts_per_page' => -1      
      ); 

      $posts = new WP_Query($args); 

      if($posts->have_posts()): while($posts->have_posts()) : $posts->the_post(); ?> 

       <option value="<?php the_ID(); ?>"> <?php the_title(); ?> </option> 

      <?php 

      endwhile; 

      endif; 
     ?> 
     </select> 
     <?php 
    } 
} 

Есть ли что-то очевидное, что я здесь отсутствует? Спасибо за любую помощь, которую любой может предоставить.

ответ

1

Я думаю, что query_vars (мета-ключ и метазначение) также добавляют в запрос WP_Query агенты типа сообщения ниже. (Dump $ posts для проверки meta_query) Попробуйте заменить WP_Query на get_posts. Может быть, поможет! ^^

РЕДАКТИРОВАТЬ:

Этот запрос также добавить в запросе ниже. Поэтому я попытаюсь исправить это ниже.

add_action('pre_get_posts', 'agents_posts_filter'); 
function agents_posts_filter($query){ 
    global $pagenow; 
    $type = 'post'; 
    if (isset($_GET['post_type'])) { 
     $type = $_GET['post_type']; 
    } 
    if ('post' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['abc']) && $_GET['abc'] != '' && $query->is_main_query()) { 
     $query->set('meta_key', 'select-agent-value'); 
     $query->set('meta_value', $_GET['abc']); 
    } 
} 
+0

Рассказать об этом решении. Я дам вам знать, если я его заработаю: O –

+0

Использование get_posts запускает цикл из одного и того же сообщения из совершенно другого пользовательского типа сообщения вместо агентов cpt:/ –

+0

Спасибо за помощь! : D добавление is_main_query() необходимо для того, чтобы список не был отправлен. Я никогда бы не догадался, что проблема связана с функцией agent_posts_filter. –