Jak zapewne można sobie wyobrazić z powodu braku odpowiedzi, rozwiązanie nie jest trywialne. To, co zrobiłem, to stworzenie dość samodzielnego przykładu, który zakłada niestandardowy typ posta „ movie
” i niestandardowy klucz pola „ Gatunek ”.
Oświadczenie : działa z WP3.0, ale nie mogę być pewien, że będzie działać z wcześniejszymi wersjami.
Zasadniczo musisz zaczepić dwa (2) haki, aby działało, a kolejne dwa (2), aby uczynić je oczywistym i użytecznym.
Pierwszy haczyk to „ restrict_manage_posts
”, który pozwala emitować kod HTML <select>
w obszarze nad listą postów, w których filtry „ Akcje zbiorcze ” i „ Pokaż daty ”. Podany kod wygeneruje funkcję „ Sortuj według: ”, jak widać na tym fragmencie ekranu:
(źródło: mikeschinkel.com )
Kod używa bezpośredniego SQL, ponieważ nie ma funkcji API WordPress, która zapewnia listę wszystkich meta_keys dla typów postów (brzmi jak przyszły bilet trac dla mnie ...) W każdym razie, oto kod. Pamiętaj, że pobiera typ postu $_GET
i sprawdza, czy jest to zarówno prawidłowy typ postu, post_type_exists()
jak i movie
typ postu (te dwie kontrole są przesadzone, ale zrobiłem to, aby pokazać ci, jak jeśli nie chcesz, aby- kod typu postu.) Wreszcie używam sortby
parametru URL, ponieważ nie powoduje konfliktu z niczym innym w 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);
}
}
}
Drugim wymaganym krokiem jest użycie parse_query
haka, który jest wywoływany po tym, jak WordPress decyduje, które zapytanie powinno zostać uruchomione, ale przed uruchomieniem zapytania. Tutaj możemy ustawić wartości orderby
i meta_key
w query_var
tablicy zapytania, które są udokumentowane w Kodeksie w orderby
parametrze dla query_posts()
. Testujemy, aby upewnić się, że:
- Jesteśmy w admin (
is_admin()
),
- Jesteśmy na stronie z listą postów w admin (
$pagenow=='edit.php'
),
- Strona została wywołana z
post_type
parametrem URL równym movie
, i
- Strona została również wywołana z
sortby
parametrem URL i że nie przekazano jej wartości „ Brak ”
Jeśli wszystkie te testy zakończą się pomyślnie, ustawiamy query_vars
(zgodnie z opisem tutaj ) meta_value
i naszą sortby
wartość dla „ Gatunek ”:
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'];
}
}
I to wszystko, co musisz zrobić; nie są wymagane haki „ posts_order
” ani „ wp
”! Oczywiście musisz zrobić więcej; musisz dodać na swojej stronie kilka kolumn, które zawierają listę postów, abyś mógł zobaczyć wartości, według których się sortuje, w przeciwnym razie użytkownicy bardzo się pomylą. Więc dodaj manage_{$post_type}_posts_columns
haczyk w tym przypadku manage_movie_posts_columns
. Ten hak dostaje domyślną tablicę kolumn i dla uproszczenia właśnie zastąpiłem ją dwiema standardowymi kolumnami; pole wyboru ( cb
) i nazwa posta ( title
). (Możesz sprawdzić za posts_columns
pomocą a, print_r()
aby zobaczyć, co jeszcze jest dostępne domyślnie.)
Zdecydowałem się dodać „ Posortowane według: ”, gdy istnieje sortby
parametr adresu URL, a gdy nie jest to 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;
}
Na koniec używamy manage_pages_custom_column
haka do wyświetlania wartości, gdy jest słupek odpowiedniego typu słupka i prawdopodobnie z redundantnym testem dla is_admin()
i $pagenow=='edit.php'
. Gdy istnieje sortby
parametr adresu URL, wyodrębniamy niestandardową wartość pola, która jest sortowana, wyświetlając ją na naszej liście. Oto jak to wygląda (pamiętaj, że to dane testowe, więc nie ma komentarzy z galerii orzechów w klasyfikacjach filmowych! :):
(źródło: mikeschinkel.com )
A oto kod:
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;
}
}
}
Zauważ, że to wybiera tylko pierwszy „ gatunek ” dla a movie
, tj. Pierwszą meta_wartość w przypadku wielu wartości dla danego klucza. Ale z drugiej strony nie jestem pewien, jak inaczej by to działało!
A dla tych, którzy nie wiedzą, gdzie umieścić ten kod, możesz umieścić go we wtyczce lub bardziej prawdopodobne dla początkującego w functions.php
pliku w bieżącym motywie.
Jak to pomaga.