So verwenden Sie Radioknöpfe mit Taxonomien

Die benutzerdefinierten Taxonomie-Funktionen von WordPress sind fantastisch. So können Sie Ihre Posts in verschiedenen Taxonomien organisieren, wobei Sie sich die harte Arbeit leisten müssen. Es kann jedoch auch etwas einschränkend sein. Wenn Sie Ihre Posts bearbeiten, verfügen Ihre Taxonomiebegriffe über eine eigene Metabox. Sie erscheinen entweder als Kontrollkästchen (für hierarchische Taxonomien) oder als Tag-Cloud (für nicht hierarchische Taxonomien). Das sind Ihre zwei Möglichkeiten.

Dies kann problematisch sein, wenn Sie sicherstellen möchten, dass für jeden Beitrag nur ein Begriff ausgewählt werden kann. Natürlich könnte man sich in die einhängen save_post Haken Sie alle überzähligen Begriffe aus und entfernen Sie sie, aber dies ist nicht besonders benutzerfreundlich und bietet sicherlich keine großartige Benutzeroberfläche. Manchmal wäre es nur ästhetisch wünschenswert, Ihre Taxonomien anders darzustellen. Dieser Artikel zeigt Ihnen, wie Sie genau das tun, und der gesamte Code, über den wir sprechen, sollte dem hinzugefügt werden Functions.php Datei in Ihrem Design. Wir werden uns auf die Optionsfelder konzentrieren, aber Sie können auch eine andere Eingabemethode verwenden, beispielsweise ein Dropdown-Menü.


Schritt 1 Entfernen Sie die Standard-Taxonomie-Metabox

WordPress erzeugt automatisch die Taxonomie-Metabox. Daher müssen wir sie zuerst entfernen, damit wir unsere eigene Taxonomie erstellen können. Ich werde davon ausgehen, dass unser Taxonomiename "mytaxonomy" ist (wenn Sie WordPress-Tags oder -kategorien ändern möchten, würden Sie dies durch "category" oder "post_tag" ersetzen)..

Um die Metabox zu entfernen, verwenden wir remove_meta_box, die aus einer Funktion aufgerufen werden soll, die mit dem admin_menu. Das remove_meta_box akzeptiert drei Argumente.

  1. ICH WÜRDE: Dies ist das ID-Attribut des div-Elements, das die Metabox enthält. Normalerweise wäre dies "mytaxonomydiv" für hierarchische Taxonomien oder "tagsdiv-mytaxonomy" für nicht hierarchische Taxonomien.
  2. Post-Typ: Der Post-Typ, für den die Metabox angezeigt wird (z. B. "Post" oder "Seite" usw.). Wenn Ihre Metabox für mehrere verschiedene Beitragstypen angezeigt wird, müssen Sie die Funktion remove_meta_box für jeden aufrufen.
  3. Kontext: Normal, fortgeschritten oder seitlich.
 add_action ('admin_menu', 'myprefix_remove_meta_box'); Funktion myprefix_remove_meta_box () remove_meta_box ('mytaxonomydiv', 'post', 'normal'); 

Schritt 2 Fügen Sie Ihre eigene Metabox hinzu

Hier haken wir uns am passend benannten an add_meta_boxes Haken Sie mit einer Funktion, die unsere Metabox hinzufügen wird. Dazu ruft die Funktion auf add_meta_box was einige Argumente braucht, darunter:

  1. ICH WÜRDE: Wie oben, geben Sie etwas Einzigartiges.
  2. Titel: Der Titel der Metabox.
  3. Ruf zurück: Der Name der Funktion, die die Innereien unserer Metabox erzeugen wird.
  4. Post-Typ: Gleich wie oben. Wieder müssen Sie diese Funktion für jeden Beitragstyp separat aufrufen.
  5. Kontext: Gleich wie oben.
  6. Priorität: Die Priorität innerhalb des Kontexts, an dem die Boxen angezeigt werden sollen.
 // Neue Taxonomie-Meta-Box hinzufügen add_action ('add_meta_boxes', 'myprefix_add_meta_box'); Funktion myprefix_add_meta_box () add_meta_box ('mytaxonomy_id', 'My Radio Taxonomy', 'myprefix_mytaxonomy_metabox', 'post', 'side', 'core');  Funktion myprefix_mytaxonomy_metabox ($ post) echo 'Dies ist meine Taxonomie-Metabox'; 

Zusammen sollte das Obige die Standard-Metabox entfernen und durch Ihre eigene ersetzen, die momentan nur die Meldung "This is my taxonomy metabox" anzeigt. Der nächste Schritt besteht darin, die Rückruffunktion so zu ändern, dass angezeigt wird, was wir möchten.


Schritt 3 Erstellen der Radioknöpfe

Wir möchten, dass unsere Metabox so aussieht wie die Standard-Metaboxen wie möglich. In den WordPress-Kerndateien finden Sie hier den Ort, an dem das Innere der Metabox hergestellt wird. Die unten abgebildete benutzerdefinierte Funktion wird die Kernfunktion nachahmen, jedoch mit einigen Änderungen an der Darstellung unserer Begriffe.

Lassen Sie uns unsere Funktion Stück für Stück durchgehen. Das erste Bit legt einige der Variablen fest. Sie müssen nur das wirklich ändern $ Taxonomie Variable, die Ihrem Taxonomienamen entspricht. Beachten Sie auch die $ name Variable. Wir geben den Eingabefeldern den Namen tax_input [mytaxonomy]. Dies ist der Name für die Eingabe in der Standard-Metabox. Auf diese Weise übernimmt WordPress automatisch die Aktualisierung des Taxonomiebegriffs eines Beitrags.

 // Einrichten des Taxonomieobjekts und Abrufen der Begriffe $ taxonomy = 'mytaxonomy'; $ tax = get_taxonomy ($ taxonomy); // Dies ist das Taxonomieobjekt // Der Name der Form $ name = 'tax_input ['. $ Taxonomie. ']'; // Holen Sie sich alle Begriffe für diese Taxonomie. $ Terms = get_terms ($ taxonomy, array ('hide_empty' => 0));

Wir wollen die ID der aktuellen Laufzeit des Beitrags (wir erwarten nur eine)..

 $ postterms = get_the_terms ($ post-> ID, $ taxonomy); $ current = ($ postterms? array_pop ($ postterms): falsch); $ current = ($ current? $ current-> term_id: 0);

Wenn Sie einen Blick auf die Kategorie-Metabox von WordPress werfen, werden Sie eine Registerkarte sehen, auf der die am häufigsten verwendeten Begriffe angezeigt werden. Um dies zu reproduzieren, benötigen wir die 10 beliebtesten Begriffe. Wir nehmen das get_terms Funktion wieder, aber diesmal wählt man höchstens 10 Begriffe und sortiert nach Anzahl (Anzahl der Beiträge, die diese Taxonomie haben).

 $ popular = get_terms ($ taxonomy, array ('orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchisch' => false));

Als Nächstes möchten wir die Registerkarten "Alle Kategorien" und "Meistgenutzt" anzeigen (es wird empfohlen, die Taxonomie-Beschriftungen möglichst zu verwenden). Wenn Sie keine Registerkarten wünschen, können Sie dieses Bit einfach entfernen:

  
  • -all "tabindex =" 3 ">labels-> all_items; ?>
  • -pop "tabindex =" 3 ">

Als Nächstes möchten wir festlegen, was angezeigt werden soll, wenn wir auf der Registerkarte "Alle Kategorien" sind:

  
    term_id; Echo "
  • ";?>

Dies ist wirklich nur die Anzeige einer Liste innerhalb eines div-Elements, und jedes Listenelement ist eine Radiooption. Natürlich können Sie diese Liste einfach durch ein Dropdown-Menü oder ein beliebiges anderes ersetzen.

Jetzt machen wir dasselbe für die 'meistgenutzte' Registerkarte:

  
    term_id; Echo "
  • ";?>

Schritt 4 Unsere Complete Callback-Funktion

Setze es zusammen und unsere komplette Funktion ist

 // Rückruf zum Einrichten der Metabox-Funktion myprefix_mytaxonomy_metabox ($ post) // Taxonomie und Begriffe abrufen $ taxonomy = 'mytaxonomy'; // Einrichten des Taxonomieobjekts und Abrufen der Bedingungen $ tax = get_taxonomy ($ taxonomy); $ terms = get_terms ($ taxonomy, array ('hide_empty' => 0)); // Name des Formulars $ name = 'tax_input ['. $ Taxonomie. ']'; // Aktuelle und beliebte Begriffe erhalten $ popular = get_terms ($ taxonomy, array ('orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchisch' => false)) ; $ postterms = get_the_terms ($ post-> ID, $ taxonomy); $ current = ($ postterms? array_pop ($ postterms): falsch); $ current = ($ current? $ current-> term_id: 0); ?> 
  • -all "tabindex =" 3 ">labels-> all_items; ?>
  • -pop "tabindex =" 3 ">
    term_id; Echo "
  • ";?>
    term_id; Echo "
  • ";?>

Schritt 5 Ein bisschen JavaScript…

Ich war vorsichtig bei der Benennung von IDs und Optionsfeldern in der Rückruffunktion. Wenn Sie jetzt alles ausprobieren, werden Sie feststellen, dass WordPress automatisch die Aktualisierung von Post-Termini übernimmt. Darüber hinaus übernimmt das Javascript von WordPress automatisch die Navigation der Registerkarten. Es gibt einen leichten Schluckauf. Die Optionsfelder "Alle Kategorien" stimmen nicht mit den "am häufigsten verwendeten" überein. Wenn Sie sich entschlossen haben, auf die Registerkarte "am häufigsten verwendeten" zu verzichten, können Sie diesen Abschnitt ignorieren. Ansonsten müssen wir nur ein kleines bisschen Javascript hinzufügen, um dieses Problem zu beheben.

Wir möchten der Seite ein bisschen Javascript hinzufügen. Daher verwenden wir in unserer Callback-Funktion einen Hook, der ausgelöst wird, wenn Javascript im Administrator hinzugefügt wird. Das ist die admin_enqueue_scripts Haken. Da wir diesem Hook in unserer Callback-Funktion unsere Funktion hinzufügen, wird sie nur geladen, wenn sie benötigt wird. Fügen Sie einfach diese Zeile oben in unsere Rückruffunktion ein:

 add_action ('admin_enqueue_scripts', 'myprefix_radiotax_javascript');

Wenn die Javascripts auf der Admin-Seite geladen werden, wird unsere Funktion ausgelöst. Diese Funktion dient lediglich dazu, unser Javascript, das wir in die Fußzeile laden möchten, zu registrieren und einzuordnen:

 Funktion myprefix_radiotax_javascript () wp_register_script ('radiotax', get_template_directory_uri (). '/js/radiotax.js', array ('jquery'), null, true); // Wir geben hier true an, um WordPress mitzuteilen, dass dieses Skript in die Fußzeile geladen werden muss. Wp_enqueue_script ('radiotax'); 

Erstellen Sie nun für das tatsächlich benötigte Javascript eine Datei in Ihrem Thema js Mappe. Wir werden es nennen radiotax.js, und hier ist der Code zum Einfügen:

 jQuery (Dokument) .ready (Funktion ($) var taxonomy = 'mytaxonomy'; $ ('#' + taxonomy + 'checkliste li: radio, #' + taxonomy + 'checkliste-pop: radio'). live (' click ', function () var t = $ (this), c = t.is (': checked '), id = t.val (); $ (' # '+ taxonomy +' checkliste li: radio, # '+ taxonomy +' checklist-pop: radio '). prop (' checked ', false); $ (' # in- '+ taxonomy +' - '+ id +', # in-popular- '+ taxonomy +' - '+ id) .prop (' checked ', c);););

Was tun also diese paar Zeilen? Wenn Sie ein Optionsfeld markieren, werden alle anderen Kontrollkästchen (auf beiden Registerkarten) deaktiviert, und die Optionsfelder, die diesem Begriff entsprechen, werden überprüft.


Fazit

Und damit sind wir fertig. WordPress erledigt den Rest für uns. Es gibt jedoch noch Verbesserungsbedarf… was ist mit dem Hinzufügen neuer Begriffe? Ich habe das aus unserer Metabox herausgenommen, weil es wirklich unglaublich schwierig ist. Es würde viel mehr Javascript und ein bisschen Aktion auf der Serverseite beinhalten.


Aktualisieren:

Wie von Roberto gefordert, finden Sie hier einen Link zum vollständigen Code auf GitHub. Dies ist eine Klassenimplementierung des in diesem Lernprogramm verwendeten Codes. Um zu beginnen, müssen Sie nur die statischen Variablen der Klasse oben ändern.