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

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

add_action ('wp', 'check_page');

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

51 голос | спросил tooshel 12 AM000000120000004931 2010, 00:16:49

3 ответа


65

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

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

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

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

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

В коде используется прямой SQL, потому что нет функции WordPress API для предоставления списка всех мета-ключей для типов сообщений (звучит как будущее trac билет ко мне ...) В любом случае, вот код. Обратите внимание, что он захватывает тип сообщения из $ _ GET и проверяет, является ли он действительным типом post post_type_exists (), а также является movie code> post type (эти две проверки переполнены, но я сделал это, чтобы показать вам, как вы не хотите жестко кодировать тип сообщения.) Наконец, я использую параметр URL sortby, так как он не работает конфликт с чем-либо еще в 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') {
            глобальный $ 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 = 'Жанр'
ГРУППА 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 "Сортировать по:". взрывать ( "\ п", $ HTML);
        }
    }
}

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

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

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

add_filter ('parse_query', 'sort_movie_by_meta_value');
function sort_movie_by_meta_value ($ query) {
    глобальный $ 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'];
    }
}

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

Я решил добавить « Sorted By: », если есть параметр URL sortby и когда он не 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' => «Название фильма»,
        );
    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'. Когда есть URL-адрес sortby, мы извлекаем значение настраиваемого поля, которое сортируется по его отображению в нашем списке. Вот как это выглядит (помните, это тестовые данные, поэтому никаких комментариев из галереи арахиса по классификациям фильмов!:):

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

И вот код:

add_action ('manage_pages_custom_column', 'manage_movie_pages_custom_column', 10,2);
function manage_movie_pages_custom_column ($ column_name, $ post_id) {
    глобальный $ 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);
                }
                ломать;
        }
    }
}

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

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

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

ответил MikeSchinkel 12 AM00000050000004931 2010, 05:13:49
8

Как и WordPress 3.1 (я использую бета-версию), столбцы теперь можно сортировать по их названиям.

В следующей статье описывается, как реализовать их.

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

ответил 12 SunEurope/Moscow2010-12-12T15:23:06+03:00Europe/Moscow12bEurope/MoscowSun, 12 Dec 2010 15:23:06 +0300 2010, 15:23:06
-1

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

/* -------- Сортируемые события на панели инструментов - показать дату начала, время, место проведения --------- * /

/* ------------------------------------------------ -------------------------------
    Пользовательские столбцы
-------------------------------------------------- ----------------------------- * /

function my_ * YOUR POST TYPE * _columns ($ columns)
{
    $ columns = array (
        'cb' => '<input type = "checkbox" />',
        'title' => 'Заглавие',
        'your_custom_field' => «Пользовательское имя поля»,
        'date' => 'Дата',
    );
    return $ columns;
}

функция my_custom_columns (столбец $)
{
    глобальные $ 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");

/* ------------------------------------------------ -------------------------------
    Сортируемые столбцы
-------------------------------------------------- ----------------------------- * /

функция 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");

Просто замените ВАШЕГО ТИПА POST и 'your_custom_field'

ответил jake 16 Maypm16 2016, 15:57:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132