Як сортувати область адміністрування користувальницького типу WordPress за спеціальним полем


52

Редагуючи один із моїх спеціальних типів публікацій, я хочу мати змогу перелічити всі записи за спеціальним полем замість дати їх публікації (що для типового типу публікації, мабуть, не відповідає). Я отримав керівництво з коментарів до публікації в блозі про користувацькі типи публікацій, і автор сказав, що це можливо, і що він навіть зробив це, щоб ви могли натиснути на назви стовпців для користувацького сортування. Він згадав про posts_orderbyфункцію, яку я зазначив у власних коментарях, але тепер я вже можу знайти допис у блозі. Будь-які пропозиції? Я бачив одне рішення, яке використовувалося

add_action('wp', 'check_page');

І check_pageфункція, що використовується add_filterдля зміни запиту, але я впевнений, що він буде працювати лише у файлах тем, а не в області адміністратора.


1
Ось ще одна корисна відповідь, щоб сортувати повідомлення за .... <br/> wordpress.stackexchange.com/questions/66455/…
Т.Тодуа

Відповіді:


66

Як ви, напевно, можете собі уявити через відсутність наданих відповідей, рішення не зовсім тривіальне. Що я зробив , це створити кілька самодостатнього приклад , який передбачає для користувача поштовий тип « movie» і призначений для користувача ключ поля « Жанр ».

Відмова від відповідальності : це працює з WP3.0, але я не можу бути впевнений, що він буде працювати з більш ранніми версіями.

По суті, вам потрібно підключити два (2) гака, щоб зробити його ще одним (2), щоб зробити його очевидним і корисним.

Перший гак - " restrict_manage_posts", що дозволяє вам надсилати HTML <select>в області над списком публікацій, де фільтри " Масові дії " та " Показати дати ". Наданий код генерує функцію " Сортувати за: ", як показано на цьому фрагменті екрана:

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

Код використовує прямий SQL , бо не WordPress функції API , щоб надати список всіх meta_keys на пост типів (звучить як майбутній в Trac квиток мені ...) У всякому разі, ось код. Зауважте, що він захоплює тип публікації $_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масиві запитів, які задокументовані в Codex в orderbyпараметрі для query_posts(). Ми перевіряємо, щоб переконатися, що:

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

Якщо всі ці тести проходять, ми встановлюємо 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, ми дістаємо значення спеціального поля, яке сортується за допомогою відображення його у нашому списку. Ось як це виглядає (пам’ятайте, це тестові дані, тому жодних коментарів з арахісової галереї щодо класифікацій фільмів! :):

Для користувальницького типу допису в адміністраторі 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файлі у вашій поточній темі.

Як це допомагає.


2
+1, лише за зусилля. Але було б ще краще, якби кола були намальовані вручну :-)
Ян Фабрі,

Будь-яка ідея, як повністю видалити фільтр ПОКАЗУВАТЬ ВСІ ДАТИ, щоб відображалися лише мої спеціальні фільтри для певного типу публікації?
RailsTweeter

@RailsTweeter Використовуйте техніку , яку я показав тут , де два гачки , що кронштейн генерації HTML є 'months_dropdown_results'і 'restrict_manage_posts'. PS Оновлення завжди цінуються. :)
MikeSchinkel

@MikeSchinkel, тепер, коли є WP API, це оновить ваш код дещо?
samjco

@samjco Не впевнений. На жаль, наразі не вдається переглянути це.
MikeSchinkel

8

Станом на WordPress 3.1 (я використовую бета-версію) стовпці тепер можна сортувати за їх заголовками.

У наступній публікації детально описано, як їх реалізувати.

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


-1

Ось просте рішення:

/* --------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"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.