So ändern oder fügen Sie benutzerdefinierte Spalten zur Beitragsliste in WordPress Admin hinzu
Mit WordPress können Sie Spalten zur Liste der Beiträge, Seiten oder benutzerdefinierten Beitragstypen im Admin-Bereich ändern und hinzufügen. In diesem Beitrag schauen wir uns an, wie!
Es sind zwei Haken zu berücksichtigen: ein Filter für die Position und Überschrift der Spalte und eine Aktion für die Ausgabe der Spalte für jeden Beitrag. Der Beitragstyp ist ein Teil der Hakennamen. Sehen wir sie uns nacheinander an, beginnend mit dem Filter.
Spaltenfilter
Der Filter zum Ändern, Entfernen oder Hinzufügen von Spalten zur Beitragsliste im WordPress-Adminbereich ist manage_{$post_type}_posts_columns. Austausch {$post_type}mit dem gewünschten Beitragstyp. Zum Beispiel; Wenn Sie Spalten für den Beitragstyp „ “ bearbeiten möchten, postwäre der Filtername manage_post_posts_columns. Und für einen benutzerdefinierten Beitragstyp „ product“ wäre der Filtername manage_product_posts_columns.
PS: WordPress hat einen Spaltenfilter ausschließlich für den Beitragstyp „ page„: manage_pages_columns, aber Sie erzielen das gleiche Ergebnis, wenn Sie den Filter verwenden manage_page_posts_columns.
Als Argument für den Filter erhalten Sie das vollständige Array aller Spalten für diesen Beitragstyp. Jede Spalte hat einen eindeutigen Schlüssel und ihre Werte sind die Beschriftungen, die in der Spaltenüberschrift angezeigt werden. Beispiele für Schlüssel sind „ cb“ für die Checkbox-Spalte und „ title“ für die Beitragstitel-Spalte. Die Reihenfolge der Elemente im Array bestimmt die Reihenfolge der Spalten.
Was Sie tun müssen, um eine neue Spalte hinzuzufügen, ist einfach ein neues Schlüssel + Wert-Paar zum Array hinzuzufügen und es zurückzugeben. Sie können das Array nach Belieben manipulieren – zum Beispiel neu anordnen.
Hook für Spalteninhalte
Welchen Hook Sie verwenden müssen, um die Ausgabe der Spalteninhalte zu steuern, hängt davon ab, ob Ihr Beitragstyp hierarchisch eingestellt ist oder nicht. Ein hierarchischer Beitragstyp wurde wie 'hierarchical' => trueim definiert register_post_type. Alle nicht hierarchischen Beitragstypen, einschließlich des in WordPress integrierten Beitragstyps „ post„, verwenden den Hook-Namen manage_{$post_type}_custom_column. Alle hierarchischen Beitragstypen, einschließlich des in WordPress integrierten Beitragstyps „ page„, verwenden den Hook-Namen manage_pages_custom_column(Hinweis: keine Einfügung des Namens des Beitragstyps in den Hook-Namen).
Als Argumente für diesen Haken erhalten Sie den Spaltennamen, der der oben im Spaltenfilter erwähnte Schlüssel ist (z. B. ‚ cb‚ für Checkbox-Spalte), und zweitens die Beitrags-ID. Dieser Hook wird bei jedem Post ausgeführt, und die grundlegende Prämisse ist, dass Sie überprüfen, ob wir beim richtigen Spaltentyp sind (durch den Schlüssel), und wenn ja, verwenden Sie die Post-ID, um Post-Meta oder ähnliches abzurufen und was auszugeben Sie wollen.
Beispiele
Schauen wir uns einen Code mit praktischen Beispielen an.
Fügen Sie Posts eine benutzerdefinierte Spalte hinzu, die ein benutzerdefiniertes Post-Meta anzeigt
Dies ist die einfachste Verwendung zum Hinzufügen benutzerdefinierter Spalten. Angenommen, wir möchten dem Beitragstyp „Beitrag“ eine benutzerdefinierte Spalte hinzufügen. Wir möchten, dass es ganz am Ende der Spalten mit der Bezeichnung „Verifiziert“ steht und je nach benutzerdefiniertem Post-Metawert „Ja“ oder „Nein“ ausgeben sollte. Hinweis: Dieses Beispiel beinhaltet nicht das Speichern oder Aktualisieren der benutzerdefinierten Post-Meta.
In unserem functions.phpoder irgendwo in unserem Design- oder Plugin-Code fügen wir die Spalte selbst hinzu, indem wir sie in das Spaltenarray zusammenführen, und im Hook für die Spaltenausgabe holen wir den Wert des Post-Metas und geben ihn aus.
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);
Die Ausgabe kann alles sein, was Sie wollen, ich habe einfach ein spanrund um die Ausgabe mit verschiedenen Textfarben zur einfachen Identifizierung hinzugefügt.
Fügen Sie eine benutzerdefinierte Spalte zu einem hierarchischen benutzerdefinierten Beitragstyp hinzu, der seinen Vorfahren-Beitrag anzeigt
Wenn ein Beitragstyp hierarchisch ist, können Beiträge übergeordnete Beiträge haben. Nehmen wir an, wir haben einen hierarchischen benutzerdefinierten Beitragstyp ‚ subject‚ für Schulfächer, in denen es eine Gewohnheit ist, viele Kinderbeiträge zu erstellen, und sogar Kinder-von-Kinder-Beiträgen. Zur besseren Übersicht wollen wir eine Spalte hinzufügen, die den übergeordneten Vorfahren des Beitrags („Root Subject“) anzeigt. Wenn es sich bei dem Beitrag um einen Beitrag der obersten Ebene handelt, wird ein einfaches „-“ angezeigt, andernfalls gibt die Spalte den Titel des übergeordneten Beitrags des Vorfahren in einem Link zum Bearbeiten des Beitrags aus.
Da wir uns auf einen hierarchischen Beitragstyp beziehen, müssen wir einen anderen Hook für die Ausgabe von Spalteninhalten verwenden als im obigen Beispiel, aber der Prozess ist genau derselbe.
Dieser Code zeigt auch ein Beispiel, wie eine Spalte in die Mitte des Spaltenarrays eingefügt wird. Wir definieren, dass unsere Spalte vor „Autor“ stehen soll, und verwenden PHP-Array-Funktionen, um das Element an der richtigen Position einzufügen.
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);
Entfernen einer Spalte
Das Entfernen einer Spalte aus einem Beitragstyp ist ziemlich einfach; Sie müssen lediglich die Post-Spalten filtern, das Element aus dem Array entfernen und es zurückgeben. Sie müssen sich nicht in den Spaltenausgangshaken einhaken. Zum Beispiel; Entfernen der Standardspalte „ date“ aus dem Beitragstyp „ post„:
add_filter('manage_post_posts_columns', function($columns) {
unset($columns['date']);
return $columns;
});
Namen oder Position der Standardspalten ändern
Nehmen wir an, wir haben einen benutzerdefinierten Beitragstyp „ book„, und wir möchten den Standardspaltennamen „Autor“ durch „Herausgeber“ ersetzen. Wir filtern einfach den Spaltenfilter und geben dem Schlüssel „ author“ einen anderen Wert:
add_filter('manage_book_posts_columns', function($columns) {
$columns['author'] = __('Publisher', 'textdomain');
return $columns;
});
Das Neuordnen von Spalten kann mithilfe von PHP-Array-Funktionen erfolgen. Denken Sie daran, dass das resultierende Array ein assoziatives Array mit Spalten-IDs als Schlüssel und ihrer Bezeichnung als Werte sein muss. Dies ist ein einfaches Beispiel für das Herausnehmen der authorSpalte „ “ und das Platzieren ganz am Ende, wodurch die Spalten neu angeordnet werden:
add_filter('manage_post_posts_columns', function($columns) {
$taken_out = $columns['author'];
unset($columns['author']);
$columns['author'] = $taken_out;
return $columns;
});
Festlegen einer benutzerdefinierten Spalte als sortierbar
Standardmäßig sind einige der Spalten von WordPress sortierbar, zum Beispiel der Beitragstitel, die Anzahl der Kommentare und das Datum. Es ist möglich, Ihre benutzerdefinierte Spalte sortierbar zu machen, aber es erfordert etwas mehr Code und das Einhängen in den Post-Query-Hook von WordPress, um WordPress mitzuteilen, wie es nach Ihrem Post-Meta sortieren soll.
Nehmen wir an, wir haben einen benutzerdefinierten Post-Typ „ movie„, und mit dem folgenden Code fügen wir eine benutzerdefinierte Spalte hinzu, die das benutzerdefinierte Post-Meta „ “ anzeigt 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);
Um WordPress mitzuteilen, dass unsere Spalte sortierbar sein soll, müssen wir uns in den Filter einklinken manage_edit-{$post_type}_sortable_columns. Wir fügen unsere Spalte dem filterbaren Spaltenarray hinzu und definieren dann, was der orderbyWert „ “ sein soll. Wir legen dort einen eindeutigen benutzerdefinierten Wert fest – den gleichen Namen wie unsere Spalte – auf den wir später in unserem Abfrage-Hook verweisen können.
add_filter('manage_edit-movie_sortable_columns', function($columns) {
$columns['duration'] = 'duration';
return $columns;
});
Wenn Sie WordPress jetzt aktualisieren, sollten Sie sehen, dass unsere benutzerdefinierte Spalte zwar anklickbar und sortierbar ist, aber nicht richtig sortiert wird. Das liegt daran, dass WordPress ‚ duration‚ nicht als ‚ orderby‚ Wert versteht. Das werden wir beheben, indem wir uns in ‚ pre_get_posts‚ einklinken:
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');
}
});
Da unser benutzerdefiniertes Post-Meta „ duration“ immer eine Zahl sein wird, können wir „ orderby“ als „ meta_value_num“ für den Zahlenvergleich definieren. Passen Sie die Abfrageargumente an Ihre benutzerdefinierten Post-Metawerte an.
Deaktivieren Sie die Sortierung für Standardspalten
Das Deaktivieren der Sortierung für eine Standardspalte ist ziemlich einfach. Alles, was wir tun müssen, ist, uns in den Filter einzuklinken manage_edit-{$post_type}_sortable_columnsund die Spalte, nach der wir nicht sortieren möchten, aus dem Array zu entfernen. Dies entfernt beispielsweise die Sortierung für die Datumsspalte für den Beitragstyp „ post„.
add_filter('manage_edit-post_sortable_columns', function($columns) {
unset($columns['date']);
return $columns;
});
