annikabackstrom
  • 0
Гуру

Как отсортировать админку пользовательского типа записи WordPress по настраиваемому полю

  • 0

При редактировании одного из моих настраиваемых типов сообщений я хочу иметь возможность перечислять все записи по настраиваемым полям, а не по дате их публикации (что для настраиваемого типа сообщений, вероятно, не имеет значения). Я получил наводку из комментариев к сообщению в блоге о настраиваемых типах сообщений, и автор сказал, что это возможно, и что он даже сделал так, чтобы вы могли щелкать имена столбцов для пользовательской сортировки. Он упомянул posts_orderby функцию, которую я отметил в своих комментариях, но теперь я больше не могу найти сообщение в блоге. Какие-либо предложения? Я видел одно решение, которое использовало

add_action('wp', 'check_page');

И check_page функция использовалась add_filter для изменения запроса, но я уверен, что она будет работать только в файлах темы, а не в админке.

Share
  1. Вот еще один полезный ответ, чтобы сортировать сообщения по….
    wordpress.stackexchange.com/questions/66455/…

    • 0
  2. Как вы, вероятно, можете себе представить по отсутствию ответов, решение не совсем тривиальное. Что я сделал, так это создал несколько автономный пример, который предполагает настраиваемый тип записи » movie » и настраиваемый ключ поля » Жанр «.

    Отказ от ответственности : это работает с WP3.0, но я не уверен, что это будет работать с более ранними версиями.

    В основном вам нужно зацепить два (2) крючка, чтобы заставить его работать, и еще два (2), чтобы сделать его очевидным и полезным.

    Первый хук — это ‘ restrict_manage_posts ‘, который позволяет вам создать HTML -код <select> в области над списком сообщений, где установлены фильтры » Массовые действия » и » Показать даты «. Предоставленный код сгенерирует функцию « Сортировать по: », как показано на этом фрагменте экрана:

    Как создать функцию сортировки для произвольного типа записи в панели администратора WordPress
    (источник: mikeschinkel.com )

    В коде используется прямой SQL, потому что нет функции WordPress API для предоставления списка всех мета_ключей для типов сообщений (звучит для меня как билет на будущее ) В любом случае, вот код. Обратите внимание, что он берет тип сообщения $_GET и проверяет, является ли он как допустимым типом сообщения post_type_exists(), так и movie типом сообщения (эти две проверки являются излишними, но я сделал это, чтобы показать вам, как, если вы не хотите жестко кодируйте тип сообщения.) Наконец, я использую sortby параметр URL, поскольку он не конфликтует ни с чем другим в WordPress:

    add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
    function restrict_manage_movie_sort_by_genre() {
        if (isset($_GET['post_type'])) {
            $post_type = $_GET['post_type'];
            if (post_type_exists($post_type) && $post_type=='movie') {
                global $wpdb;
                $sql=<<<SQL
    SELECT pm.meta_key FROM {$wpdb->postmeta} pm
    INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
    WHERE p.post_type='movie' AND pm.meta_key='Genre'
    GROUP BY pm.meta_key
    ORDER BY pm.meta_key
    SQL;
                $results = $wpdb->get_results($sql);
                $html = array();
                $html[] = "<select id="sortby" name="sortby">";
                $html[] = "<option value="None">No Sort</option>";
                $this_sort = $_GET['sortby'];
                foreach($results as $meta_key) {
                    $default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
                    $value = esc_attr($meta_key->meta_key);
                    $html[] = "<option value="{$meta_key->meta_key}"$default>{$value}</option>";
                }
                $html[] = "</select>";
                echo "Sort by: " . implode("\n",$html);
            }
        }
    }
    

    Второй необходимый шаг — использовать parse_query хук, который вызывается после того, как WordPress решает, какой запрос следует выполнить, но до того, как он запустит запрос. Здесь мы можем установить значения orderby и meta_key в query_var массиве запроса, которые задокументированы в Кодексе в orderby параметре для query_posts() . Мы тестируем, чтобы убедиться, что:

    1. Мы в админке ( is_admin() ),
    2. Мы находимся на странице со списком постов в админке ( $pagenow=='edit.php' ),
    3. Страница была вызвана с post_type параметром URL, равным movie, и
    4. Страница также была вызвана с sortby параметром URL, и ей не было передано значение « Нет ».

    Если все эти тесты пройдены, мы затем устанавливаем query_vars (как описано здесь ) meta_value и наше sortby значение для « Жанр »:

    add_filter( 'parse_query', 'sort_movie_by_meta_value' );
    function sort_movie_by_meta_value($query) {
        global $pagenow;
        if (is_admin() && $pagenow=='edit.php' &&
            isset($_GET['post_type']) && $_GET['post_type']=='movie' && 
            isset($_GET['sortby'])  && $_GET['sortby'] !='None')  {
            $query->query_vars['orderby'] = 'meta_value';
            $query->query_vars['meta_key'] = $_GET['sortby'];
        }
    }
    

    И это все, что вам нужно сделать; крючки » posts_order » или » wp » не требуются! Конечно, на самом деле вам нужно делать больше; вам нужно добавить несколько столбцов на свою страницу, в которых перечислены сообщения, чтобы вы могли фактически видеть значения, по которым он сортируется, иначе пользователи сильно запутаются. Так что добавьте manage_{$post_type}_posts_columns крючок, в этом случае manage_movie_posts_columns . Этот хук получает массив столбцов по умолчанию, и для простоты я просто заменил его двумя стандартными столбцами; флажок ( cb ) и название записи ( title ). (Вы можете проверить posts_columns с помощью a, print_r() чтобы увидеть, что еще доступно по умолчанию.)

    Я решил добавить « Сортировать по: », когда есть sortby параметр URL, а когда нет None :

    add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
    function manage_movie_posts_columns($posts_columns) {
        $posts_columns = array(
            'cb' => $posts_columns['cb'],
            'title' => 'Movie Name',
            );
        if (isset($_GET['sortby']) && $_GET['sortby'] !='None') 
            $posts_columns['meta_value'] = 'Sorted By';
    
        return $posts_columns;
    }
    

    Наконец, мы используем manage_pages_custom_column хук, чтобы фактически отображать значение, когда есть сообщение соответствующего типа сообщения и с, вероятно, избыточным тестом для is_admin() и $pagenow=='edit.php' . Когда есть sortby параметр URL, мы извлекаем значение настраиваемого поля, которое сортируется, отображая его в нашем списке. Вот как это выглядит (помните, это тестовые данные, поэтому никаких комментариев из галереи арахиса по классификации фильмов! :):

    Пользовательские столбцы добавлены для пользовательского типа записи в панели администратора WordPress.
    (источник: mikeschinkel.com )

    А вот код:

    add_action('manage_pages_custom_column', 'manage_movie_pages_custom_column',10,2);
    function manage_movie_pages_custom_column($column_name,$post_id) {
        global $pagenow;
        $post = get_post($post_id);
        if ($post->post_type=='movie' && is_admin() && $pagenow=='edit.php')  {
            switch ($column_name) {
                case 'meta_value':
                    if (isset($_GET['sortby']) && $_GET['sortby'] !='None') {
                        echo get_post_meta($post_id,$_GET['sortby'],true);
                    }
                    break;
            }
        }
    }
    

    Обратите внимание, что это выбирает только первый « Жанр » для a movie, то есть первое мета_значение в случае нескольких значений для данного ключа. Но опять же, я не уверен, как это будет работать иначе!

    А для тех, кто не знает, куда поместить этот код, вы можете поместить его в плагин или, что более вероятно для новичка, в functions.php файл в вашей текущей теме.

    Как это помогает.

    • 0
  3. Начиная с WordPress 3.1 (я использую бета-версию) столбцы теперь можно сортировать по их заголовкам.

    В следующем посте подробно описано, как их реализовать.

    http://scribu.net/wordpress/custom-sortable-columns.html

    • 0
  4. Вот простое решение:

    /* --------Sortable Events on Dashboard - show start date, time, venue--------- */
    
    /*-------------------------------------------------------------------------------
        Custom Columns
    -------------------------------------------------------------------------------*/
    
    function my_*YOUR POST TYPE*_columns($columns)
    {
        $columns = array(
            'cb'        => '<input type="checkbox" />',
            'title'     => 'Title',
            'your_custom_field'     => 'Custom Field Name',          
            'date'      =>  'Date',
        );
        return $columns;
    }
    
    function my_custom_columns($column)
    {
        global $post;
        if($column == 'your_custom_field')
        {
            if(get_post_meta($post->ID, 'your_custom_field', true);)
            {
                echo get_post_meta($post->ID, 'your_custom_field', true);
            }
        }
    
    }
    
    add_action("manage_posts_custom_column", "my_custom_columns");
    add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");
    
    /*-------------------------------------------------------------------------------
        Sortable Columns
    -------------------------------------------------------------------------------*/
    
    function my_column_register_sortable( $columns )
    {
        $columns['your_custom_field'] = 'your_custom_field';
        return $columns;
    }
    
    add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );
    

    Просто замените YOUR POST TYPE и your_custom_field

    • 0

Оставить ответ

You must login to add an answer.