Einfügen eines Begriffs in eine benutzerdefinierte Taxonomie

9

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' );
Andy
quelle
Wie versprochen habe ich den Code in das Plugin gepostet. Hoffe das hilft :-)
Pieter Goosen

Antworten:

11

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_termsist 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 wird

Sie 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

<?php
/**
Plugin Name: Create terms
Plugin URI: http://wordpress.stackexchange.com/q/163541/31545
Description: Create terms
Version: 1.0
Author: Pieter Goosen
License: GPLv2 or later
*/
class Test_Terms {

    function __construct() {
        register_activation_hook( __FILE__,array( $this,'activate' ) );
        add_action( 'init', array( $this, 'create_cpts_and_taxonomies' ) );
    } 

    function activate() {
        $this->create_cpts_and_taxonomies();
        $this->register_new_terms();
    }

    function create_cpts_and_taxonomies() {

        $args = array( 
            'hierarchical'                      => true,  
            'labels' => array(
                'name'                          => _x('Test Tax', 'taxonomy general name' ),
                'singular_name'                 => _x('Test Tax', 'taxonomy singular name'),
                'search_items'                  => __('Search Test Tax'),
                'popular_items'                 => __('Popular Test Tax'),
                'all_items'                     => __('All Test Tax'),
                'edit_item'                     => __('Edit Test Tax'),
                'edit_item'                     => __('Edit Test Tax'),
                'update_item'                   => __('Update Test Tax'),
                'add_new_item'                  => __('Add New Test Tax'),
                'new_item_name'                 => __('New Test Tax Name'),
                'separate_items_with_commas'    => __('Seperate Test Tax with Commas'),
                'add_or_remove_items'           => __('Add or Remove Test Tax'),
                'choose_from_most_used'         => __('Choose from Most Used Test Tax')
            ),  
            'query_var'                         => true,  
            'rewrite'                           => array('slug' =>'test-tax')        
        );
        register_taxonomy( 'test_tax', array( 'post' ), $args );
    }

    function register_new_terms() {
        $this->taxonomy = 'test_tax';
        $this->terms = array (
            '0' => array (
                'name'          => 'Tester 1',
                'slug'          => 'tester-1',
                'description'   => 'This is a test term one',
            ),
            '1' => array (
                'name'          => 'Tester 2',
                'slug'          => 'tester-2',
                'description'   => 'This is a test term two',
            ),
        );  

        foreach ( $this->terms as $term_key=>$term) {
                wp_insert_term(
                    $term['name'],
                    $this->taxonomy, 
                    array(
                        'description'   => $term['description'],
                        'slug'          => $term['slug'],
                    )
                );
            unset( $term ); 
        }

    }
}
$Test_Terms = new Test_Terms();

BEARBEITEN 1

Ihr Problem beim Einfügen von Begriffen ist Ihr Haken. after_setup_themewird zuvor ausgeführt init, 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_termFunktion in Ihre Init-Funktion direkt darunter verschiebenregister_taxonomy

Es ist auch ratsam, term_existsvor dem Einfügen zunächst zu prüfen, ob ein Begriff vorhanden ist ( )

Beispiel:

// Register Custom Taxonomy
function custom_taxonomy() {

   //CODE TO REGISTER TAXONOMY

   if( !term_exists( 'Example Category', 'layout' ) ) {
       wp_insert_term(
           'Example Category',
           'layout',
           array(
             'description' => 'This is an example category created with wp_insert_term.',
             'slug'        => 'example-category'
           )
       );
   }
}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );

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).

  1. 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.

  2. 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-Zwecke

Auß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:

Pieter Goosen
quelle
Nachdem ich mir die Quelle angesehen habe, bin ich etwas ratlos, weil der $taxonomyParameter überhaupt nicht bereinigt wird, wenn das query_varArgument auf gesetzt wird true. Das ist eigentlich unglaublich. Und andernfalls wird es über bereinigt sanitize_title_with_dashes(), was, nomen es omen, überall Dinge durch Striche ersetzt. Was auch unglaublich ist, da sie nicht verwendet werden sollten.
Nicolai
Abgesehen von der Tatsache, dass Sie Zahlen überall verwenden können, wie Sie möchten, also auch am Anfang, obwohl Sie überall lesen können, dass dies nicht getan werden sollte. Konnte keinen eindeutigen Grund gegen Zahlen finden. Im Gegensatz zu Bindestrichen gibt es zumindest eine Anweisung »Wenn der Beitragstyp Bindestriche enthält, können Sie der Administrationsseite des benutzerdefinierten Beitragstyps keine Spalten hinzufügen (mithilfe der Aktion 'manage_ <Name des benutzerdefinierten Beitragstyps> _posts_columns'). . «Auf der Codex-Seite von register_post_type().
Nicolai
1
Wordpress hat seine Mängel, muss zustimmen. Einige sind tatsächliche Verbrechen :-). Ich denke, Bindestriche sind eines der am meisten diskutierten Themen und werden auch am häufigsten in Namen verwendet. Der Fehler ist offensichtlich, wenn Sie sich die Vorlagenhierarchie ansehen. Erstellen Sie eine Taxonomie mit zwei Wörtern wie my-taxonomy, die durch einen Bindestrich getrennt sind, und erstellen Sie eine Taxonomievorlage taxonomy-my-taxonomy.php. Ich habe die Nummer irgendwo gelesen, muss sie aber noch einmal überprüfen. Dies ist eine Liste, die ich immer verwende, um sicher zu bleiben, und sie hat perfekt funktioniert. Vielen Dank für alle Ihre Informationen, geschätzt
Pieter Goosen
1
Wie ich, aber nur weil ich es von Anfang an richtig gelernt habe. Wie ich am meisten gelernt habe, weiß ich von WordPress Development und den klugen und erfahrenen Leuten hier. Es gibt also viele Fehler, die ich selbst nie gemacht habe.
Nicolai
1
Imho sollte diese Antwort geschützt werden. Details in dieser Antwort / diesem Beispiel sind sehr wichtig und werden im Kodex nicht oft genug erwähnt.
Charles