• Решено Kazantsev

    (@kazantsev)


    Здравствуйте,

    Понадобилось сделать фильтрацию записей для custom type post. Вставил, но возникла проблема — если выбрать один определенный из списка term, то пишет что ничего не находит 🙁 Другие категории прекрасно определяются.

    Выкладываю код:

    add_action('restrict_manage_posts','my_restrict_manage_posts');
    
    		function my_restrict_manage_posts() {
    			global $typenow;
    
    			if ($typenow=='projektid'){
                             $args = array(
                                 'show_option_all' => "Show All Categories",
                                 'taxonomy'        => 'kategooriad',
                                 'name'               => 'kategooriad'
    
                             );
    				wp_dropdown_categories($args);
                            }
    		}
    add_action( 'request', 'my_request' );
    function my_request($request) {
    	if (is_admin() && $GLOBALS['PHP_SELF'] == '/wp-admin/edit.php' && isset($request['post_type']) && $request['post_type']=='projektid') {
    		$request['term'] = get_term($request['kategooriad'],'kategooriad')->name;
    
    	}
    	return $request;
    }

    Подскажите хотя бы в какую сторону копать? Ума не приложу почему не находит. Форма посылает идентичный (за исключением номера терма) запрос:

    edit.php?s&post_status=all&post_type=projektid&mode=list&action=-1&m=0&lang=et&kategooriad=16&action2=-1.
    При этом запрос типа edit.php?kategooriad=uus-media&post_type=projektid показывает правильно все. А как послать такой запрос из фильтра?

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Проблему решил изменив

    $request[‘term’] = get_term($request[‘kategooriad’],’kategooriad’)->name;

    на

    $request[‘term’] = get_term($request[‘kategooriad’],’kategooriad’)->slug;

    Теперь все записи показывает правильно. Но не пойму почему так все таки.. Везде написан вариант с name.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Спасибо, что поделились.

    Но не пойму почему так все таки..

    Скорее всего, потому что функция get_queried_object() предполагает, что в параметре term передаётся именно ярлык:

    $slug = $this->get('term');
    $term = &get_terms($tax, array( 'slug' => $slug, 'hide_empty' => false ) );

    Гуру, кто опытный — объясните пожалуйста пример который здесь приведён. Пытаюсь сделать фильтрацию пользовательского типа в админке по пользовательской таксонимии, но по данному примеру не работает.

    add_action('restrict_manage_posts','my_restrict_manage_posts');
    function my_restrict_manage_posts() {
     global $typenow;
     if ($typenow=='projektid'){//если работаем с пользовательским типом
      $args = array(
       'show_option_all' => "Show All Categories",//лейба когда фильтрации нет
       'taxonomy'  => 'kategooriad',//имя пользовательской таксономии
       'name'  => 'kategooriad'//имя поля формы
      );
     wp_dropdown_categories($args);//тогда добавляем выпадающий список с перечнем пунктов нашей таксономии
     }
    }

    Первая часть кода мне понятна — вешаем выпадающий список, как это работает можно подсмотреть в файле «class-wp-posts-list-table.php» с 213 по 223 строку.

    А вот функция function my_request($request) мне не понятна. Что значит эта строка:

    $request['term'] = get_term($request['kategooriad'],'kategooriad')->slug;

    Откуда берёться массив $request, и как повлияет на фильтрацию записей присвоение такое выражение например $request['term']=my-type

    У меня не работает и вот с таким вариантом:
    edit.php?kategooriad=my-type&post_type=projektid

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

    ВСЁ — РАЗОБРАЛСЯ!!!!

    Привожу здесь тот пример который работает у меня:

    //Добавляем пользовательскую таксономию
    add_action( 'init', 'build_taxonomies', 0 );
    function build_taxonomies() {
    
    	$args = array(
    		'hierarchical' => true
    		,'label' => 'Все типы'
    		,'query_var' => true
    		,'public' => true
    		,'show_in_nav_menus' => true
    		,'show_ui' => true
    		,'rewrite' => true
    	);
    
    	register_taxonomy( TAXONOMY_TYPE, NAMEPOSTTYPE, $args );
    }
    
    //Добавляем выподающий список типов недвижимости для фильтра
    add_action("restrict_manage_posts", "ki_property_dropdown_property_type");
    function ki_property_dropdown_property_type(){
    
    global $post_type;
    //global $typenow; //тоже значение что и $post_type
    global $wp_query;
    
    if ( is_object_in_taxonomy( $post_type, TAXONOMY_TYPE ) ) {
    	$dropdown_options = array(
    	'show_option_all' => 'Вся недвижимость',
    	'taxonomy' => TAXONOMY_TYPE,
    	'name' => TAXONOMY_TYPE,
    	'orderby' => 'name',
    	'selected' => $_GET[TAXONOMY_TYPE],
    	'hierarchical' => true,
    	'depth'           =>  3,
            'show_count'      =>  true, // Show # listings in parens
            'hide_empty'      =>  false // показывать даже пустые пункты
    );
    wp_dropdown_categories( $dropdown_options );
    }
    }
    
    //этот код нужен чтобы работала фильтрация по пользоваттельскому типу
    add_action( 'request', 'my_request' );
    function my_request( $request ) {
    
    if ( is_admin() && $GLOBALS['PHP_SELF'] == '/wp-admin/edit.php' && isset($request['post_type']) && $request['post_type']==NAMEPOSTTYPE ){
    
    $request[TAXONOMY_TYPE] = get_term($request[TAXONOMY_TYPE],TAXONOMY_TYPE)->slug
    }
    	return $request;
    }

    Как это работает:
    1) При создании пользовательской таксономии не забываем параметр ‘query_var’ => true — это добавит в запрос к базе данных новую переменную, по которой можно будет выбирать нужные нам записи, соответственно в массиве $request также появится переменная имя которой будет название вашей таксономии т.е. запись $request[TAXONOMY_TYPE] — станет актуальной.

    2) Создаём выпадающий список с перечнем значений нашей таксономии с помощью хука restrict_manage_posts и встроенной функции wp_dropdown_categories, на что обращаем внимание:
    — ‘taxonomy’ и ‘name’ — должны быть равны и содержать имя вашей таксономии в моём случае TAXONOMY_TYPE;
    — ‘selected’ я приравнял к $_GET[TAXONOMY_TYPE], т.к. значения списка являются целыми числами, а не значения slug, благодаря этому мой список помнит последнее значение;

    3)Вешаем функцию my_request(), которая перед тем как обратится к базе данных и выдать нужные нам записи на основе выбранного значения узнает значение slug, и подставит его вместо term_id.

    Пример приведенный выше отказывался у меня работать пока я не поменял $request[‘term’] на $request[TAXONOMY_TYPE]. Подозреваю, что массив $request — формируется где то выше, и содержит все значения переменных которые получает сервер $_GET, а возможно и $_POST. Где это происходит я в коде WordPress не нашёл.

    Этот код работает при фильтрации по нескольким пользовательским таксономиям!!!

    Много информации почерпнул вот по этому адресу wordpress.stackexchange.com, пример большой, всё расписано, но и он, как есть, у меня не заработал (не заработала именно фильтрация).

    Если есть у кого поправки к моему примеру, уточнения или если кто сможет более глубоко описать механизм фильтрации по пользовательской таксономии — будет очень здорово.

    Уточнение:
    query_var — этот параметр определяет имя переменной, которая будет отвечать в запросе за отбор нашей таксономии. Т.е. при такой записи ‘query_var’ => ‘name_var’, необходимо подправить код:

    1) 'name' => 'name_var' — это при формировании списка
    2) $request['name_var'] = get_term($request['name_var'],TAXONOMY_TYPE)->slug — это при замене term_id на slug
    3) 'selected' => $_GET['name_var']

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Тема «фильтрация для custom type не всегда работает» закрыта для новых ответов.