web-dev-qa-db-fra.com

Insertion d'un terme dans une taxonomie personnalisée

Vous avez créé cette taxonomie personnalisée qui permet de contrôler la mise en page sur des publications uniques. En gros, je souhaite ajouter deux options: Mise en page 1 et Mise en page 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 );

Les capacités sont définies sur des valeurs non valides pour empêcher la modification des termes, mais je ne parviens pas à faire fonctionner wp_insert_term.

Ajouter deux termes à ma taxonomie personnalisée ne peut pas être si difficile, non?

Utiliser ceci pour insérer un terme ne fonctionne pas, bien que si je changeais mon nom de taxonomie personnalisé en 'catégorie', c'est-à-dire WP par défaut, cela fonctionnerait parfaitement. Ce qui donne?

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' );
9
andy

EDIT 2

Comme promis, voici le code du plugin.

Il est de notoriété publique que les taxonomies personnalisées et les types de publication personnalisés doivent être insérés dans un plugin, et not dans votre thème. J'ai enlevé des parties de mon plugin.

COMMENT ÇA MARCHE

La taxonomie est enregistrée comme d'habitude via le plugin. Pour toute information à ce sujet, vous pouvez aller voir register_taxonomy. La partie que je devais mettre en évidence et ce qui est pertinent pour cette question est de savoir comment insérer de nouveaux termes.

Il est rapide et facile d'insérer des termes à l'aide de wp_insert_terms, mais ce code peut également nuire au temps de chargement s'il n'est pas utilisé correctement. L'idée est d'exécuter cette fonction une fois, puis plus jamais, presque comme si vous la supprimiez après la première exécution.

Pour ce faire, vous allez associer votre fonction à register_activation_hook. Ce hook fonctionne une fois, c'est-à-dire que, lorsque le plug-in est activé, il ne sera pas réexécuté lors de l'actualisation de la page. Le seul moment où il se déclenchera à nouveau est le moment où le plug-in est désactivé et réactivé

Vous devez donc d’abord enregistrer votre taxonomie, car vous ne pouvez pas attribuer de termes à une taxonomie qui n’existe pas. Une fois votre taxonomie enregistrée, vous pouvez insérer vos termes. N'oubliez pas que cette action ne se produira qu'une seule fois, c'est-à-dire lorsque le plug-in est activé. Si vous devez ajouter des termes, vous devez désactiver le plugin et le réactiver.

Vous voulez aussi d'abord vérifier si un terme existe avant d'essayer de le créer et de l'insérer.

Voici le code du plugin

<?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();

EDIT 1

Votre problème avec l'insertion de termes est votre crochet. after_setup_theme s'exécute avant init , ce qui signifie que vous essayez d'insérer un terme dans une taxonomie qui n'est pas encore enregistrée.

Je vous suggère de déplacer votre fonction wp_insert_term dans votre fonction init, juste en dessous de register_taxonomy

Il est également conseillé de vérifier d'abord si un terme existe ( term_exists ) avant de l'insérer.

Exemple:

// 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 );

Veuillez noter que ceci n'a pas été testé

RÉPONSE ORIGINALE

Les noms de taxonomie personnalisés (et les noms de type de publication personnalisés) doivent être conformes à un ensemble de règles très spécifique, sinon vous rencontrerez des pièges pour lesquels il n’ya pas de solution de rechange.

Voici un guide pour choisir des noms pour des taxonomies personnalisées (et des types de publication personnalisés)

  1. Les éléments suivants sont not autorisés dans les noms de taxonomie personnalisés et les noms de types de publication personnalisés

    • Lettres majuscules ou camelcase

    • Tout type de caractère spécial, à l'exception des traits de soulignement (_)

    • Les espaces

    • Plus de 32 caractères pour les taxonomies et 20 pour les types de message

    • N'importe quel noms réservés , et notez bien que ceci est valable pour any convention de nommage personnalisée, pas seulement les noms de taxonomie.

  2. S'il y a plus d'un mot dans un nom de taxinomie, ils doivent être séparés par des traits de soulignement et non par des traits d'union (-). On m'a mis au défi de dire que les traits d'union sont la voie à suivre pour le référencement dans les URL des noms de taxonomie. C'est vrai, c'est pourquoi il existe des règles de réécriture pour ajuster votre URL en conséquence. Ne modifiez jamais les noms de taxonomie ou les noms de type de message à des fins de référencement d'URL

En outre, vous devriez supprimer ces capacités étranges. Cela pourrait aussi créer un problème

Si cela ne résout pas votre problème, veuillez ajouter le code que vous utilisez avec wp_insert_term

Référence:

11
Pieter Goosen