So ändern Sie eine bereits registrierte Taxonomie

18

Heute musste ich die Argumente für eine benutzerdefinierte Taxonomie ändern, die bereits von einem Plugin eines Drittanbieters registriert wurde . Konkret wollte ich das show_admin_columnArgument auf setzen trueund die rewriteSchnecke so ändern , dass es nicht nur die Taxonomie-Schnecke war. In diesem Fall handelte es sich um einen Beitragstyp "Personen" mit einer benutzerdefinierten Taxonomie "Personenkategorie".

Ich war überrascht, dass dies vorher nicht gestellt wurde. Hier ist eine Frage und Antwort.

mrwweb
quelle
Nur eine Randnotiz für alle, die stecken bleiben. Denken Sie daran, die Permalinks zu spülen, bevor Sie das Ergebnis überprüfen.
un.pez.vivo

Antworten:

22

register_taxonomy()ist das Werkzeug für den Job. Aus dem Kodex:

Diese Funktion fügt eine Taxonomie hinzu oder überschreibt sie.

Eine Möglichkeit wäre, die zu kopieren register_taxonomy() $argsund zu ändern. Dies würde jedoch bedeuten, dass zukünftige Änderungen des ursprünglichen register_taxonomy()Codes überschrieben würden.

Daher ist es zumindest in diesem Fall vorzuziehen, die ursprünglichen Argumente abzurufen, die zu ändernden zu ändern und dann die Taxonomie neu zu registrieren. Die Inspiration für diese Lösung geht an @Otto in dieser Antwort auf eine ähnliche Frage zu benutzerdefinierten Beitragstypen .

Verwendung der people benutzerdefinierten Beitragstyp und die people_categoryTaxonomie aus dem Beispiel:

function wpse_modify_taxonomy() {
    // get the arguments of the already-registered taxonomy
    $people_category_args = get_taxonomy( 'people_category' ); // returns an object

    // make changes to the args
    // in this example there are three changes
    // again, note that it's an object
    $people_category_args->show_admin_column = true;
    $people_category_args->rewrite['slug'] = 'people';
    $people_category_args->rewrite['with_front'] = false;

    // re-register the taxonomy
    register_taxonomy( 'people_category', 'people', (array) $people_category_args );
}
// hook it up to 11 so that it overrides the original register_taxonomy function
add_action( 'init', 'wpse_modify_taxonomy', 11 );

Beachten Sie, dass ich das dritte register_taxonomy()Argument auf den erwarteten Array-Typ typisiert habe. Dies ist nicht unbedingt erforderlich, da register_taxonomy()Verwendungen, wp_parse_args()die mit einem objectoder umgehen können array. Das heißt, register_taxonomy()'s $argssollen arraylaut Kodex als eingereicht werden , also fühlt sich das für mich richtig an.

mrwweb
quelle
Ich versuche dies zu tun, um eine flache Taxonomie in eine hierarchische Taxonomie zu ändern. Ich ändere einfach die hierarchische Eigenschaft auf true. Auf diese Weise werden zwei Meta-Felder für die Taxonomie auf der rechten Seite des Post-Bearbeitungsbildschirms angezeigt, und ich kann keine Taxonomien hinzufügen ...
Joel Worsham,
Stellen Sie sicher, dass Sie denselben Slug (z. B. 'people_category') wie die ursprüngliche Taxonomie verwenden, damit Sie ihn überschreiben.
Mrwweb
1
Genius! Einfach genial! Perfekt funktioniert!
DaveyJake
1
Bei dieser Lösung capabilitiesist ein Problem aufgetreten: Der Parameter wird intern gespeichert, capsodass er nicht an die neu registrierte Taxonomie übergeben wird. Siehe meine Antwort auf eine ähnliche Frage hier
Fabien Quatravaux
1
Das ist wunderbar. Ich habe es verwendet, um einer benutzerdefinierten Taxonomie hierarchische URLs hinzuzufügen.
Brian Peat