WordPress pozwala modyfikować i dodawać kolumny do listy postów, stron lub dowolnego niestandardowego typu postu w panelu administracyjnym. W tym poście przyjrzymy się, jak!
Do rozważenia są dwa haki: jeden filtr dla pozycji i nagłówka kolumny oraz jedna akcja dla danych wyjściowych kolumny dla każdego posta. Typ słupka jest częścią nazw haków. Przyjrzyjmy się im po kolei, zaczynając od filtra.
Filtr kolumnowy
Filtr do modyfikacji, usuwania lub dodawania kolumn do listy postów w panelu administracyjnym WordPressa to manage_{$post_type}_posts_columns. Wymień {$post_type}z żądanym typem postu. Na przykład; jeśli chcesz edytować kolumny dla typu posta „ post", nazwa filtra to manage_post_posts_columns. A dla niestandardowego typu posta „ product„, nazwą filtra będzie manage_product_posts_columns.
PS: WordPress ma filtr kolumn wyłącznie dla typu posta „ page„: manage_pages_columns, ale ten sam wynik osiągniesz, używając filtra manage_page_posts_columns.
Podany jako argument filtru, otrzymujesz pełną tablicę wszystkich kolumn dla tego typu postu. Każda kolumna ma unikalny klucz, a ich wartości są etykietami widocznymi w nagłówku kolumny. Przykładowe klucze to „ cb” dla kolumny pola wyboru i „ title” dla kolumny tytułu posta. Kolejność elementów w tablicy określa kolejność kolumn.
To, co musisz zrobić, aby dodać nową kolumnę, to po prostu dodanie nowej pary klucz + wartość do tablicy i zwrócenie jej. Możesz dowolnie manipulować tablicą – na przykład zmieniając jej kolejność.
Hak zawartości kolumny
Którego zaczepu należy użyć do kontrolowania wyjścia zawartości kolumny, zależy od tego, czy typ posta jest ustawiony jako hierarchiczny, czy nie. Hierarchiczny typ stanowiska został zdefiniowany jak 'hierarchical' => truew register_post_type. Wszelkie niehierarchiczne typy postów, w tym wbudowany typ postów WordPress „ post„, używają nazwy haka manage_{$post_type}_custom_column. Wszelkie hierarchiczne typy postów, w tym wbudowany typ posta WordPress „ page„, używają nazwy haka manage_pages_custom_column(uwaga: brak wstrzykiwania nazwy typu posta w nazwie haka).
Jako argumenty do tego haka otrzymasz nazwę kolumny, która jest kluczem wymienionym w powyższym filtrze kolumn (np. ’ cb’ dla kolumny z polem wyboru), a po drugie identyfikator postu. Ten haczyk jest uruchamiany przy każdym poście, a podstawowym założeniem jest to, że sprawdzasz, czy jesteśmy w odpowiednim typie kolumny (za pomocą klawisza), a jeśli tak, użyj identyfikatora posta, aby pobrać meta postu lub podobne i wyślij, co chcesz.
Przykłady
Spójrzmy na kod praktycznych przykładów.
Dodaj niestandardową kolumnę do postów, która wyświetla niestandardową meta postu
To najprostsze zastosowanie dodawania kolumn niestandardowych. Załóżmy, że chcemy dodać niestandardową kolumnę do wpisu typu „post”. Chcemy, aby znajdował się na samym końcu kolumn, o nazwie „Zweryfikowany”, i powinien generować „Tak” lub „Nie” w zależności od niestandardowej wartości meta postu. Uwaga: ten przykład nie obejmuje zapisywania ani aktualizowania niestandardowej meta postu.
W naszym functions.phplub w dowolnym miejscu naszego motywu lub kodu wtyczki dodamy samą kolumnę, łącząc ją z tablicą kolumn, a w haczyku dla danych wyjściowych kolumny pobieramy wartość meta postu i wypisujemy ją.
add_filter('manage_post_posts_columns', function($columns) {
return array_merge($columns, ['verified' => __('Verified', 'textdomain')]);
});
add_action('manage_post_posts_custom_column', function($column_key, $post_id) {
if ($column_key == 'verified') {
$verified = get_post_meta($post_id, 'verified', true);
if ($verified) {
echo '<span style="color:green;">'; _e('Yes', 'textdomain'); echo '</span>';
} else {
echo '<span style="color:red;">'; _e('No', 'textdomain'); echo '</span>';
}
}
}, 10, 2);
Dane wyjściowe mogą być dowolne, po prostu dodałem spandane wyjściowe z różnymi kolorami tekstu, aby ułatwić identyfikację.
Dodaj niestandardową kolumnę do hierarchicznego niestandardowego typu wpisu, który wyświetla wpis przodka
Gdy typ wpisu jest hierarchiczny, wpisy mogą mieć wpisy nadrzędne. Załóżmy, że mamy hierarchiczny, niestandardowy typ wpisów „ subject” dla przedmiotów szkolnych, w których jest zwyczajem publikowanie wielu wpisów dla dzieci, a nawet wpisów dla dzieci. Dla lepszego przeglądu chcemy dodać kolumnę, która wyświetla rodzica przodka posta („temat główny”). Jeśli post jest postem najwyższego poziomu, wyświetlany jest prosty „-„, w przeciwnym razie kolumna wyświetla tytuł posta nadrzędnego przodka w linku do edycji posta.
Ponieważ odwołujemy się do hierarchicznego typu wpisu, musimy użyć innego zaczepu do wyprowadzania zawartości kolumny niż w powyższym przykładzie, ale proces jest dokładnie taki sam.
Ten kod pokazuje również przykład, jak wstrzyknąć kolumnę do środka tablicy kolumn. Definiujemy, że nasza kolumna powinna znajdować się przed 'autorem’ i używamy funkcji tablicowych PHP, aby wstawić element we właściwej pozycji.
add_filter('manage_subject_posts_columns', function($columns) {
$offset = array_search('author', array_keys($columns));
return array_merge(array_slice($columns, 0, $offset), ['ancestor' => __('Ancestor', 'textdomain')], array_slice($columns, $offset, null));
});
add_action('manage_pages_custom_column', function($column_key, $post_id) {
if ($column_key == 'ancestor') {
$ancestors = get_ancestors($post_id, 'subject', 'post_type');
$post_ancestor = end($ancestors);
if ($post_ancestor != 0) {
echo '<a href="'. get_edit_post_link($post_ancestor). '">'. get_the_title($post_ancestor). '</a>';
} else {
echo '-';
}
}
}, 10, 2);
Usuwanie kolumny
Usunięcie kolumny z typu posta jest dość proste; wystarczy przefiltrować kolumny postów, usunąć element z tablicy i zwrócić go. Nie musisz podpinać się pod zaczep wyjściowy kolumny. Na przykład; usunięcie domyślnej datekolumny „ ” z typu postu „ post„:
add_filter('manage_post_posts_columns', function($columns) {
unset($columns['date']);
return $columns;
});
Zmiana domyślnych nazw lub pozycji kolumn
Załóżmy, że mamy niestandardowy typ posta „ book” i chcemy zastąpić domyślną nazwę kolumny „Autor” nazwą „Wydawca”. Po prostu filtrujemy filtr kolumn i nadajemy kluczowi „ author” inną wartość:
add_filter('manage_book_posts_columns', function($columns) {
$columns['author'] = __('Publisher', 'textdomain');
return $columns;
});
Zmiana kolejności kolumn może być wykonana za pomocą funkcji tablicowych PHP. Pamiętaj, że wynikowa tablica musi być tablicą asocjacyjną z kolumną „ID” jako kluczami i ich etykietą jako wartościami. Oto prosty przykład wyjęcia authorkolumny „ ” i umieszczenia jej na samym końcu, zmieniając w ten sposób kolejność kolumn:
add_filter('manage_post_posts_columns', function($columns) {
$taken_out = $columns['author'];
unset($columns['author']);
$columns['author'] = $taken_out;
return $columns;
});
Ustawianie niestandardowej kolumny jako możliwej do sortowania
Domyślnie niektóre kolumny WordPressa można sortować, na przykład tytuł posta, liczba komentarzy i data. Możliwe jest sortowanie niestandardowej kolumny, ale wymaga to nieco więcej kodu i podpięcia się pod hak zapytania postu WordPress, aby poinformować WordPressa, jak zamawiać według meta postu.
Załóżmy, że mamy niestandardowy typ posta „ movie„, a za pomocą poniższego kodu dodajemy niestandardową kolumnę, która wyświetla niestandardową meta posta „ duration„.
add_filter('manage_movie_posts_columns', function($columns) {
return array_merge($columns, ['duration' => __('Duration', 'textdomain')]);
});
add_action('manage_movie_posts_custom_column', function($column_key, $post_id) {
if ($column_key == 'duration') {
$duration = get_post_meta($post_id, 'duration', true);
echo (!empty($duration))? sprintf(__('%s minutes', 'textdomain'), $duration): __('Unknown', 'textdomain');
}
}, 10, 2);
Aby powiedzieć WordPressowi, że chcemy, aby nasza kolumna była możliwa do sortowania, musimy podpiąć się pod filtr manage_edit-{$post_type}_sortable_columns. Dodajemy naszą kolumnę do tablicy kolumn, którą można filtrować, a następnie określamy, jaka orderbypowinna być wartość „ „. Ustawiamy tam unikalną wartość niestandardową – taką samą nazwę jak nasza kolumna – do której możemy się później odwołać w naszym haczyku zapytania.
add_filter('manage_edit-movie_sortable_columns', function($columns) {
$columns['duration'] = 'duration';
return $columns;
});
Jeśli odświeżysz teraz WordPress, powinieneś zobaczyć, że nasza niestandardowa kolumna jest rzeczywiście klikalna i możliwa do sortowania, ale nie jest poprawnie sortowana. Dzieje się tak, ponieważ WordPress nie rozumie „ duration” jako wartości „ orderby„. To naprawimy, dołączając do „ pre_get_posts„:
add_action('pre_get_posts', function($query) {
if (!is_admin()) {
return;
}
$orderby = $query->get('orderby');
if ($orderby == 'duration') {
$query->set('meta_key', 'duration');
$query->set('orderby', 'meta_value_num');
}
});
Ponieważ nasza niestandardowa meta posta „ duration” zawsze będzie liczbą, możemy zdefiniować „ orderby” jako „ meta_value_num” w celu porównania liczb. Dostosuj argumenty zapytania, aby pasowały do niestandardowych wartości meta postu.
Wyłącz sortowanie dla domyślnych kolumn
Wyłączenie sortowania dla domyślnej kolumny jest dość proste. Wszystko, co musimy zrobić, to podłączyć się do filtra manage_edit-{$post_type}_sortable_columnsi usunąć z tablicy kolumnę, według której nie chcemy sortować. Na przykład usuwa sortowanie dla kolumny daty dla typu posta „ post„.
add_filter('manage_edit-post_sortable_columns', function($columns) {
unset($columns['date']);
return $columns;
});
