So sortieren Sie den Administratorbereich eines WordPress -benutzerdefinierten Post -Typs nach einem benutzerdefinierten Feld
-
16-10-2019 - |
Frage
Wenn Sie einen meiner benutzerdefinierten Beitragstypen bearbeiten, möchte ich alle Einträge anstelle des Datums, das sie veröffentlicht werden, alle Einträge über ein benutzerdefiniertes Feld auflisten können (was für einen benutzerdefinierten Beitragstyp wahrscheinlich nicht relevant ist). Ich habe einen Vorsprung aus den Kommentaren eines Blog -Beitrags über benutzerdefinierte Post -Typen erhalten und der Autor sagte, es sei möglich und er habe es sogar geschafft, damit Sie auf die Spaltennamen für eine benutzerdefinierte Sortierung klicken können. Er erwähnte das posts_orderby
Funktion, die ich in meinen eigenen Kommentaren bemerkte, aber jetzt kann ich den Blog -Beitrag mehr finden. Irgendwelche Vorschläge? Ich habe eine Lösung gesehen, die verwendet wurde
add_action('wp', 'check_page');
Und die check_page
Funktion verwendet add_filter
Um die Abfrage zu ändern, aber ich bin mir ziemlich sicher, dass sie nur in den Themendateien funktionieren würde, nicht im Administratorbereich.
Lösung
Wie Sie sich wahrscheinlich durch den Mangel an Antworten vorstellen können, ist die Lösung nicht gerade trivial. Was ich getan habe, ist ein etwas in sich geschlossenes Beispiel zu erstellen, das einen benutzerdefinierten postentypen annimmt "movie
"und benutzerdefinierte Feldschlüssel von"Genre".
Haftungsausschluss: Dies funktioniert mit WP3.0, aber ich kann nicht sicher sein, dass es mit früheren Versionen funktioniert.
Sie müssen im Grunde zwei (2) Haken anschließen, damit es funktioniert, und zwei weitere (2), um es offensichtlich und nützlich zu machen.
Der erste Haken ist 'restrict_manage_posts
'Mit dem können Sie eine HTML ausgeben <select>
im Bereich über der Liste der Beiträge, in denen das "Massenaktionen" und "Showdaten"Filter. Der angegebene Code generiert das"Sortieren nach:"Funktionalität, wie in diesem Bildschirmausschnitt zu sehen ist:
(Quelle: mikeschinkel.com)
Der Code verwendet direkt SQL, da keine WordPress -API -Funktion vorhanden ist, um die Liste aller Meta_Keys für einen Post -Typen anzugeben (klingt nach einer Zukunft Trac Ticket für mich ...) Wie auch immer, hier ist der Code. Beachten Sie, dass es den Post -Typ abgreift $_GET
und validiert, um sicherzustellen, dass es sich sowohl um einen gültigen Postyp handelt post_type_exists()
sowie ein movie
Post-Typ (diese beiden Schecks sind übertrieben, aber ich habe es getan, um Ihnen zu zeigen, wie ich den Post-Typ nicht harte Code haben möchten.) Schließlich verwende ich die sortby
URL -Parameter, da er in WordPress nichts anderes in Konflikt steht:
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);
}
}
}
Der zweite erforderliche Schritt besteht darin, die zu verwenden parse_query
Haken, der nach WordPress bezeichnet wird, entscheidet eine Abfrage, die ausgeführt werden sollte, aber bevor sie die Abfrage ausführt. Hier können wir Werte von festlegen orderby
und meta_key
in der Abfrage query_var
Array, die sind im Codex dokumentiert in dem orderby
Parameter für query_posts()
. Wir testen, um sicherzustellen:
- Wir sind im Administrator (
is_admin()
), - Wir sind auf der Seite, auf der Beiträge im Administrator aufgeführt sind (
$pagenow=='edit.php'
), - Die Seite wurde mit einem aufgerufen
post_type
URL -Parameter gleich gleichmovie
, und - Die Seite wurde auch mit einem aufgerufen
sortby
URL -Parameter und dass es nicht übergeben wurde.Keiner'
Wenn all diese Tests bestehen, setzen wir die dann die query_vars
(Wie dokumentiert hier) zu meta_value
und unser sortby
Wert für 'Genre':
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'];
}
}
Und das ist alles, was Sie tun müssen; nein "posts_order
" oder "wp
"Haken benötigt! Natürlich müssen Sie tatsächlich mehr tun. Sie müssen einige Spalten auf Ihrer Seite hinzufügen, in der die Beiträge aufgeführt sind, damit Sie tatsächlich die Werte sehen können, die sie sortieren, ansonsten werden die Benutzer mucho verwirrt. manage_{$post_type}_posts_columns
Hook, in diesem Fall manage_movie_posts_columns
. Dieser Haken wird durch das Standardarray von Spalten übergeben und ich habe ihn zum Einfachheit halber durch zwei Standardspalten ersetzt. ein Kontrollkästchen (cb
) und ein Postname (title
). (Sie können inspizieren posts_columns
mit einer print_r()
Um zu sehen, was standardmäßig sonst noch verfügbar ist.)
Ich beschloss, eine "hinzuzufügen"Sortiert nach:"Denn wenn es ein gibt sortby
URL -Parameter und wenn dies nicht der Fall ist 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;
}
Endlich benutzen wir das manage_pages_custom_column
Haken, um den Wert tatsächlich anzuzeigen, wenn es einen Beitrag des entsprechenden Post -Typs gibt und mit dem wahrscheinlich redundanten Test für is_admin()
und $pagenow=='edit.php'
. Wenn es ein gibt sortby
URL -Parameter Wir extrahieren den benutzerdefinierten Feldwert, der nach einer Anzeige in unserer Liste sortiert wird. So sieht es aus (denken Sie daran, dies sind Testdaten, also keine Kommentare aus der Erdnussgalerie zu den Filmklassifikationen! :):
(Quelle: mikeschinkel.com)
Und hier ist der Code:
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;
}
}
}
Beachten Sie, dass dies nur das erste aufnimmt "Genre" Für ein movie
, dh der erste meta_value im Fall von mehreren Werten für einen bestimmten Schlüssel. Aber andererseits bin ich mir nicht sicher, wie es sonst funktionieren würde!
Und für diejenigen, die nicht vertraut sind, wo Sie diesen Code einsetzen können, können Sie ihn in ein Plugin oder wahrscheinlicher für den Neuling in der functions.php
Datei in Ihrem aktuellen Thema.
Wie das hilft.
Andere Tipps
Ab WordPress 3.1 (ich verwende die Beta) können Spalten jetzt über ihre Titel sortierbar sein.
Im folgenden Beitrag werden beschrieben, wie sie implementiert werden.
Hier ist eine einfache Lösung:
/* --------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" );
Einfach ersetzen Ihr Post -Typ und 'your_custom_field'