Benutzerdefinierte WordPress-Kategorie-Bearbeitungsseite
Das Hinzufügen zusätzlicher Meta-Boxen, Felder und anderer Informationen zu WordPress ist einfach, wenn Sie die richtigen Hooks und die richtigen APIs kennen, denen Sie folgen müssen. Aber was ist, wenn Sie Informationen zu einer WordPress-Taxonomieseite hinzufügen möchten?
Angenommen, Sie möchten eine benutzerdefinierte WordPress-Kategorie-Bearbeitungsseite erstellen oder zumindest einige benutzerdefinierte Informationen zu einer Taxonomie-Seite hinzufügen?
Es ist immer noch möglich, dies zu tun, und es ist immer noch relativ einfach, aber auch hier müssen Sie die richtigen Hooks kennen, die Sie verwenden können, und es hängt auch davon ab, ob Sie mit den integrierten Taxonomien oder einer benutzerdefinierten Taxonomie arbeiten.
In diesem Beitrag zeige ich, wie man dies mit einer benutzerdefinierten, hierarchischen Taxonomie (oder einfacher ausgedrückt einer benutzerdefinierten Kategorie) macht.
Benutzerdefinierte WordPress-Kategorie-Bearbeitungsseite
Erstens, wenn Sie sich entscheiden, mit einer Standard-Kategorieseite zu arbeiten, werden Sie wahrscheinlich so etwas sehen:
Und die beiden Haken, mit denen Sie arbeiten müssen, sind:
Wenn Sie auf einen der beiden Links geklickt haben, werden Sie feststellen, dass der letztere keine Informationen enthält, aber der erstere lautet:
Die Aktion/Hook edit_category_form kann verwendet werden, um zusätzliche Aktionen auf dem Bildschirm „Kategorie bearbeiten“ auszuführen. Sie können beispielsweise Formularfelder hinzufügen, um zusätzliche Informationen für eine bestimmte Kategorie zu speichern.
Zu diesem Zweck entscheide ich mich im Allgemeinen dafür, diesen Haken zu verwenden, da er im Codex gut definiert ist. In diesem Beitrag geht es mir jedoch nur um das Rendern von Informationen – nicht um das Hinzufügen zusätzlicher Felder, die gespeichert werden müssen.
Dinge verkabeln
In der einfachsten Form besteht der beste Weg, um mit dem Hinzufügen benutzerdefinierter Informationen zu dieser Art von Seite zu beginnen, darin, eine Funktion zu erstellen und sie an den oben aufgeführten Hook anzuhängen. In seiner einfachsten Form sieht das ungefähr so aus:
<?php
add_action('edit_category_form', 'acme_display_object_ids');
/**
* Displays an ordered list of all of the object IDs for a given
* taxonomy.
*/
function acme_display_object_ids()
{
// Code for displaying the Object IDs goes here.
}
Wenn Sie jedoch den objektorientierten Weg gehen, können Sie sich für eine Klasse entscheiden, die einen Hook als Argument im Konstruktor akzeptiert und darauf wartet, dass dieses Ereignis ausgelöst wird. Wenn das der Fall ist, könnte Ihr Code so aussehen :
<?php
class ObjectIdSubscriber
{
/**
* @var string the hook to which this class subscribes
*/
private $hook;
/**
* @param string $hook the hook to which this class is registered with WordPress
*/
public function __construct(string $hook)
{
$this->hook = $hook;
}
/**
* Renders all of the information for the object IDs.
*/
public function load()
{
// Code for displaying the Object IDs goes here.
}
}
Unabhängig davon müssen Sie eine Klasse oder Funktion haben, die mit einem Hook verbunden ist, der Informationen rendert, wenn der Bildschirm angezeigt wird.
Anzeigen von Informationen
Von hier aus benötigen Sie etwas zum Rendern. Ich bin ein Fan davon, meine Logik getrennt zu halten, also erstelle ich normalerweise ein View- Verzeichnis und platziere dann die Teildateien für die Ansichten in diesem Verzeichnis.
Natürlich können Sie den HTML-String immer in der PHP-Funktion erstellen (aber stellen Sie sicher, dass Sie die Ausgabe mit etwas wie wp_kses bereinigen ).
In diesem Beispiel werde ich es einfach halten: Ich möchte nur eine Liste aller Posts (oder Objekte, wie Sie gleich sehen werden) aus der Datenbank ziehen und die Informationen auf der Seite auflisten. Dazu benötige ich ein paar Datenbankabfragen und kann dann die Ergebnisliste durchlaufen.
Zuerst brauche ich eine Abfrage, die die term_taxonomy_id aus der angegebenen Kategorie abruft:
<?php
// This will retrieve all of the term relationships from where we can get post IDs.
global $wpdb;
$termTaxonomyId = $wpdb->get_results(
$wpdb->prepare(
"
SELECT DISTINCT term_taxonomy_id
FROM $wpdb->term_taxonomy
WHERE term_id = %s
",
$tagId
),
ARRAY_A
);
$termTaxonomyId = isset($termTaxonomyId[0])? $termTaxonomyId[0]: null;
if (null === $termTaxonomyId) {
return null;
}
Dann muss ich eine Liste aller Objekt-IDs abrufen, die mit dieser term_taxonomy_id verknüpft sind :
<?php
// This will retrieve all of the post IDs.
$postIds = $wpdb->get_results(
$wpdb->prepare(
"
SELECT object_id
FROM $wpdb->term_relationships
WHERE term_taxonomy_id = %s
",
$termTaxonomyId
),
ARRAY_A
);
if (empty($postIds)) {
return null;
}
Von hier aus kann ich dann die ursprüngliche Funktion (oder Klasse) verwenden, die ich zuvor erstellt habe, um die Informationen zu rendern :
<ul>
<?php foreach ($postIds as $postId): ?>
<li><?php echo $postId; ?></li>
<?php endforeach; ?>
</ul>
Aber es gibt viele zusätzliche Dinge, die Sie von dort aus tun können.
Es gibt mehr
Wie bereits erwähnt, gibt dies die IDs der Objekte zurück, die im Wesentlichen Beitrags-IDs sind (oder Seiten-IDs oder benutzerdefinierte Beitragstyp-IDs oder was auch immer aus der wp_posts- Tabelle).
Sobald Sie diese Informationen haben, können Sie alle Informationen wie Titel, Inhalt, Metadaten, verschiedene Datumsinformationen usw. abrufen.
Der Sinn des Beitrags besteht jedoch nicht darin, zu zeigen, welche Informationen abgerufen werden sollen, sondern wie Informationen für eine bestimmte Taxonomie abgerufen und dann auf einer benutzerdefinierten WordPress-Kategorieseite gerendert werden. Und dies ist ein einfacher Weg, um genau das zu tun.
