Ich habe diese benutzerdefinierte Taxonomie erstellt, die das Layout für einzelne Posts steuert. Grundsätzlich möchte ich zwei Optionen hinzufügen: Layout 1 und Layout 2.
// Register Custom Taxonomy
function custom_taxonomy() {
$labels = array(
'name' => _x( 'Layout', 'Taxonomy General Name', 'text_domain' ),
'singular_name' => _x( 'Layout', 'Taxonomy Singular Name', 'text_domain' ),
'menu_name' => __( 'Taxonomy', 'text_domain' ),
'all_items' => __( 'All Items', 'text_domain' ),
'parent_item' => __( 'Parent Item', 'text_domain' ),
'parent_item_colon' => __( 'Parent Item:', 'text_domain' ),
'new_item_name' => __( 'New Item Name', 'text_domain' ),
'add_new_item' => __( 'Add New Item', 'text_domain' ),
'edit_item' => __( 'Edit Item', 'text_domain' ),
'update_item' => __( 'Update Item', 'text_domain' ),
'separate_items_with_commas' => __( 'Separate items with commas', 'text_domain' ),
'search_items' => __( 'Search Items', 'text_domain' ),
'add_or_remove_items' => __( 'Add or remove items', 'text_domain' ),
'choose_from_most_used' => __( 'Choose from the most used items', 'text_domain' ),
'not_found' => __( 'Not Found', 'text_domain' ),
);
$capabilities = array(
'manage_terms' => 'foobar',
'edit_terms' => 'foobar',
'delete_terms' => 'foobar',
'assign_terms' => 'foobar'
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => false,
'show_in_nav_menus' => false,
'show_tagcloud' => false,
'capabilities' => $capabilities,
);
register_taxonomy( 'Layout', array( 'post' ), $args );
}
// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );
Die Funktionen sind auf ungültige Werte festgelegt, um zu verhindern, dass Begriffe bearbeitet werden, aber wp_insert_term funktioniert nicht.
Das Hinzufügen von zwei Begriffen zu meiner benutzerdefinierten Taxonomie kann nicht so schwierig sein, oder?
Die Verwendung dieser Option zum Einfügen eines Begriffs funktioniert nicht. Wenn ich jedoch meinen benutzerdefinierten Taxonomienamen in "Kategorie" geändert habe, dh WP-Standard, funktioniert dies einwandfrei. Was gibt?
function example_insert_category() {
$parent_term = term_exists( 'layout' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id
wp_insert_term(
'Example Category',
'layout',
array(
'description' => 'This is an example category created with wp_insert_term.',
'slug' => 'example-category'
)
);
}
add_action( 'after_setup_theme', 'example_insert_category' );
custom-taxonomy
Andy
quelle
quelle
Antworten:
BEARBEITEN 2
Wie versprochen, hier ist der Code zum Plugin.
Es ist bekannt, dass benutzerdefinierte Taxonomien und benutzerdefinierte Beitragstypen in ein Plugin und nicht in Ihr Thema aufgenommen werden sollten. Ich habe Teile von meinem Plugin entfernt.
WIE ES FUNKTIONIERT
Die Taxonomie wird wie gewohnt über das Plugin registriert. Informationen dazu finden Sie hier
register_taxonomy
. Der Teil, den ich hervorheben musste und der für diese Frage relevant ist, ist das Einfügen neuer Begriffe.Das Einfügen von Begriffen
wp_insert_terms
ist schnell und einfach, aber dieser Code kann auch die Ladezeit beeinträchtigen, wenn er nicht richtig verwendet wird. Die Idee ist, diese Funktion einmal und dann nie wieder auszuführen, fast so, als würde man sie nach dem ersten Ausführen entfernen.Um dies zu erreichen, werden Sie Ihre Funktion anhängen
register_activation_hook
. Dieser Hook wird einmal ausgeführt, dh wenn das Plugin aktiviert ist, wird es bei der Seitenaktualisierung nicht erneut ausgeführt. Das einzige Mal, dass es erneut ausgelöst wird, ist, wenn das Plugin deaktiviert und wieder aktiviert wirdSie müssen also zuerst Ihre Taxonomie registrieren, da Sie einer nicht vorhandenen Taxonomie keine Begriffe zuweisen können. Sobald Ihre Taxonomie registriert ist, können Sie Ihre Begriffe einfügen. Denken Sie daran, dass diese Aktion nur einmal ausgeführt wird und das Plugin dann aktiviert wird. Wenn Sie Begriffe hinzufügen müssen, müssen Sie das Plugin deaktivieren und erneut aktivieren
Sie möchten auch zuerst prüfen, ob ein Begriff vorhanden ist, bevor Sie versuchen, ihn zu erstellen und einzufügen.
Hier ist der Plugin-Code
BEARBEITEN 1
Ihr Problem beim Einfügen von Begriffen ist Ihr Haken.
after_setup_theme
wird zuvor ausgeführtinit
, was bedeutet, dass Sie versuchen, einen Begriff in eine Taxonomie einzufügen, die noch nicht registriert ist.Ich würde vorschlagen, dass Sie Ihre
wp_insert_term
Funktion in Ihre Init-Funktion direkt darunter verschiebenregister_taxonomy
Es ist auch ratsam,
term_exists
vor dem Einfügen zunächst zu prüfen, ob ein Begriff vorhanden ist ( )Beispiel:
Bitte beachten Sie, dass dies nicht getestet wurde
URSPRÜNGLICHE ANTWORT
Benutzerdefinierte Taxonomienamen (und benutzerdefinierte Posttypnamen) müssen einem ganz bestimmten Regelwerk entsprechen, da Sie sonst auf Fallstricke stoßen, für die es keine Problemumgehung gibt.
Hier ist eine Richtlinie für die Auswahl von Namen für benutzerdefinierte Taxonomien (und benutzerdefinierte Beitragstypen).
Folgendes ist in benutzerdefinierten Taxonomienamen und benutzerdefinierten Posttypnamen nicht zulässig
Großbuchstaben oder Kamelkoffer
Jede Art von Sonderzeichen, außer Unterstrichen (
_
)Räume
Mehr als 32 Zeichen für Taxonomien und 20 Zeichen für Beitragstypen
Alle reservierten Namen , und bitte beachten Sie, dass dies für jede benutzerdefinierte Namenskonvention gilt, nicht nur für Taxonomienamen.
Wenn ein Taxonomiename mehr als ein Wort enthält, müssen diese durch Unterstriche und nicht durch Bindestriche (
-
) getrennt werden. Ich wurde herausgefordert, dass Bindestriche der richtige Weg für SEO in URLs für Taxonomienamen sind. Es ist wahr, deshalb gibt es Umschreiberegeln, um Ihre URL entsprechend anzupassen. Ändern Sie niemals Taxonomienamen oder Posttypnamen für URL-SEO-ZweckeAußerdem sollten Sie diese seltsamen Funktionen entfernen. Es könnte auch ein Problem verursachen
Wenn dies Ihr Problem nicht löst, fügen Sie bitte den Code hinzu, mit dem Sie arbeiten
wp_insert_term
Referenz:
register_taxonomy
register_post_type
quelle
$taxonomy
Parameter überhaupt nicht bereinigt wird, wenn dasquery_var
Argument auf gesetzt wirdtrue
. Das ist eigentlich unglaublich. Und andernfalls wird es über bereinigtsanitize_title_with_dashes()
, was, nomen es omen, überall Dinge durch Striche ersetzt. Was auch unglaublich ist, da sie nicht verwendet werden sollten.register_post_type()
.