Как сортировать область администратора пользовательского типа сообщения WordPress в пользовательском поле

wordpress.stackexchange https://wordpress.stackexchange.com/questions/45

  •  16-10-2019
  •  | 
  •  

Вопрос

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

add_action('wp', 'check_page');

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

Это было полезно?

Решение

Как вы, вероятно, можете себе представить из -за отсутствия предоставленных ответов, решение не совсем тривиально. То, что я сделал, это создал несколько автономный пример, который предполагает пользовательский тип поста »movie"и пользовательский ключ поля"Жанр".

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

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

Первый крюк 'restrict_manage_posts'Что позволяет вам излучать HTML <select> в области над списком постов, где »Объемные действия" а также "Показать даты«Фильтры. Предоставленный код будет генерировать»Сортировать по:"Функциональность, как видно в этом фрагменте экрана:

How to Create Sort By functionality for a Custom Post Type in the WordPress Admin
(источник: mikeschinkel.com)

Код использует прямой SQL, потому что нет функции WordPress API для предоставления списка всех meta_keys для типов сообщений (звучит как будущее трака Билет мне ...) В любом случае, вот код. Обратите внимание, что он захватывает тип поста от $_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 с 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 Мы извлекаем пользовательское значение поля, которое сортируется по отображению его в нашем списке. Вот как это выглядит (помните, это тестовые данные, так что нет комментариев из галереи арахиса в классификациях фильма! :):

Custom Columns added for a Custom Post Type in the WordPress Admin
(источник: 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;
        }
    }
}

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

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

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

Другие советы

Столбцы WordPress 3.1 (я использую бета) столбцы теперь могут быть сортируемыми через их названия.

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

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

Вот простое решение:

/* --------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_custom_field'

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top