Insertion d'un terme dans une taxonomie personnalisée

9

A fait cette taxonomie personnalisée qui contrôlera la mise en page sur des messages uniques, je veux essentiellement ajouter deux options, la mise en page 1 et la 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 j'ai changé mon nom de taxonomie personnalisé en «catégorie», c'est-à-dire WP par défaut, cela fonctionne très bien. 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' );
Andy
la source
Comme promis, j'ai posté le code dans le plugin. J'espère que cela vous aidera :-)
Pieter Goosen

Réponses:

11

EDIT 2

Comme promis, voici le code du plugin.

C'est un fait connu que les taxonomies personnalisées et les types de publication personnalisés doivent aller dans un plugin, et non dans votre thème. J'ai supprimé des parties de mon plugin.

COMMENT ÇA FONCTIONNE

La taxonomie est enregistrée comme normale via le plugin. Pour toute information à ce sujet, vous pouvez aller vérifier register_taxonomy. La partie que je devais souligner et ce qui est pertinent pour cette question, c'est comment insérer de nouveaux termes.

Insérer des termes wp_insert_termsest rapide et facile, mais ce code peut également réduire le 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 la supprimer après la première exécution.

Pour ce faire, vous allez accrocher votre fonction register_activation_hook. Ce hook s'exécute une fois, c'est-à-dire lorsque le plugin est activé, il ne sera pas réexécuté lors de l'actualisation de la page. La seule fois où il se déclenchera à nouveau, c'est lorsque le plugin sera 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 n'aura lieu qu'une seule fois, et c'est à ce moment que le plugin est activé. Si vous devez ajouter des termes, vous devez désactiver le plugin et le réactiver

Vous voulez également 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_themes'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 suggère que vous déplaciez votre wp_insert_termfonction à l'intérieur de votre fonction init, juste en dessousregister_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'est pas testé

RÉPONSE ORIGINALE

Les noms de taxonomie personnalisés (et les noms de type de publication personnalisés) doivent se conformer à un ensemble de règles très spécifique, sinon vous rencontrerez des pièges pour lesquels il n'y a pas de solution.

Voici une ligne directrice lors du choix des noms pour les taxonomies personnalisées (et les types de publication personnalisés)

  1. Les éléments suivants ne sont pas autorisés dans les noms de taxonomie personnalisés et les noms de type de publication personnalisés

    • Lettres majuscules ou chameau

    • Tout type de caractère spécial, sauf les traits de soulignement ( _)

    • Les espaces

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

    • Tous les noms réservés , et veuillez noter que cela vaut pour toute convention de dénomination personnalisée, pas seulement les noms de taxonomie.

  2. S'il y a plus d'un mot dans un nom de taxonomie, ils doivent être séparés par des traits de soulignement et non par des tirets ( -). J'ai été mis au défi que les tirets soient 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 publication à des fins de référencement d'URL

En outre, vous devez supprimer ces capacités étranges. Cela pourrait également 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:

Pieter Goosen
la source
Après avoir regardé la source, je suis un peu perplexe, car le $taxonomyparamètre n'est pas purifié du tout, si l' query_varargument est défini sur true. C'est assez incroyable en fait. Et sinon, il est nettoyé via sanitize_title_with_dashes(), ce qui, nomen es omen, remplacera les trucs par des tirets partout. Ce qui est incroyable aussi, car ils ne devraient pas être utilisés.
Nicolai
Mis à part le fait, vous pouvez utiliser des chiffres comme vous le souhaitez, n'importe où, donc au début aussi, bien que vous puissiez lire partout que cela ne devrait pas être fait. Je n'ai pas pu trouver une raison précise contre les chiffres. Contrairement aux tirets, au moins il y a une déclaration »De plus, si le type de publication contient des tirets, vous ne pourrez pas ajouter de colonnes à la page d'administration du type de publication personnalisé (en utilisant l'action 'manage_ <Nom de type de publication personnalisé> _posts_columns') . «Sur la page du codex de register_post_type().
Nicolai
1
Wordpress a ses défauts, doit être d'accord. Certains sont de vrais crimes :-). Je pense que les tirets sont l'un des sujets les plus parlés et les plus utilisés dans les noms. Son échec est assez évident lorsque vous commencez à regarder la hiérarchie des modèles. Créez une taxonomie avec deux mots comme my-taxonomy séparés par un tiret, et créez un modèle de taxonomie taxonomy-my-taxonomy.php et vous verrez l'échec. J'ai lu quelque chose quelque part, je dois le revérifier cependant. C'est une liste de sécurité que j'utilise toujours pour rester en sécurité, et elle a parfaitement fonctionné. Merci pour toutes vos informations, appréciées
Pieter Goosen
1
Moi aussi, mais juste parce que je l'ai appris dès le début de la bonne façon. Comme j'ai appris le plus que je sache du développement WordPress et des personnes intelligentes et expérimentées ici. Il y a donc beaucoup d'erreurs que je n'ai jamais faites moi-même.
Nicolai
1
À mon humble avis, cette réponse doit être protégée. Les détails dans cette réponse / cet exemple sont très importants et ils ne sont pas assez souvent mentionnés dans le Codex.
Charles