Як ви, напевно, можете собі уявити через відсутність наданих відповідей, рішення не зовсім тривіальне. Що я зробив , це створити кілька самодостатнього приклад , який передбачає для користувача поштовий тип « movie
» і призначений для користувача ключ поля « Жанр ».
Відмова від відповідальності : це працює з WP3.0, але я не можу бути впевнений, що він буде працювати з більш ранніми версіями.
По суті, вам потрібно підключити два (2) гака, щоб зробити його ще одним (2), щоб зробити його очевидним і корисним.
Перший гак - " restrict_manage_posts
", що дозволяє вам надсилати HTML <select>
в області над списком публікацій, де фільтри " Масові дії " та " Показати дати ". Наданий код генерує функцію " Сортувати за: ", як показано на цьому фрагменті екрана:
(джерело: 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()
. Ми перевіряємо, щоб переконатися, що:
- Ми в адміністраторі (
is_admin()
),
- Ми знаходимось на сторінці, де перелічені публікації в адміністраторі (
$pagenow=='edit.php'
)
- Сторінка викликається з
post_type
параметром URL, рівним movie
та
- Сторінку також викликали
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, ми дістаємо значення спеціального поля, яке сортується за допомогою відображення його у нашому списку. Ось як це виглядає (пам’ятайте, це тестові дані, тому жодних коментарів з арахісової галереї щодо класифікацій фільмів! :):
(джерело: 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
файлі у вашій поточній темі.
Як це допомагає.