Inserindo um termo em uma taxonomia customizada

9

Fiz essa taxonomia personalizada que controlará o layout em postagens únicas, basicamente quero adicionar duas opções, Layout 1 e 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 );

Os recursos são definidos com valores inválidos para impedir que os termos sejam editados, mas não consigo fazer o wp_insert_term funcionar.

Adicionar dois termos à minha taxonomia personalizada não pode ser tão difícil, certo?

Usar isso para inserir um termo não funciona, embora se eu mudei meu nome de taxonomia personalizado para 'categoria', ou seja, o padrão WP funcionará perfeitamente. O que da?

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
fonte
Como prometido, publiquei o código no plug-in. Espero que isso ajude :-)
Pieter Goosen

Respostas:

11

EDIT 2

Como prometido, aqui está o código para o plugin.

É um fato conhecido que taxonomias personalizadas e tipos de postagem personalizados devem entrar em um plug-in, e não no seu tema. Tirei partes do meu plugin.

COMO FUNCIONA

A taxonomia é registrada como normal através do plugin. Para qualquer informação sobre isso, você pode ir e confira register_taxonomy. A parte que eu precisava destacar e o que é relevante para essa pergunta é como inserir novos termos.

A inserção de termos wp_insert_termsé rápida e fácil, mas esse código também pode prejudicar o tempo de carregamento, se não for usado corretamente. A idéia é executar essa função uma vez e nunca mais, quase como removê-la após a primeira execução.

Para conseguir isso, você irá conectar sua função register_activation_hook. Esse gancho é executado uma vez, ou seja, quando o plug-in é ativado, ele não é executado novamente na atualização da página. A única vez que ele será acionado novamente é quando o plug-in é desativado e ativado novamente

Portanto, primeiro você precisa registrar sua taxonomia, pois não pode atribuir termos a uma taxonomia que não existe. Depois de registrar sua taxonomia, você poderá inserir seus termos. Lembre-se de que esta ação ocorrerá apenas uma vez e é quando o plug-in é ativado. Se precisar adicionar termos, desative o plug-in e ative-o novamente

Você também deseja verificar primeiro se existe um termo antes de tentar criá-lo e inseri-lo.

Aqui está o código do 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

Seu problema com a inserção de termos é o seu gancho. after_setup_themeé executado antes init, o que significa que você está tentando inserir um termo em uma taxonomia que ainda não está registrada.

Eu sugiro que você mova sua wp_insert_termfunção para dentro da sua função init, logo abaixoregister_taxonomy

Também é aconselhável verificar primeiro se existe um termo ( term_exists) antes de inseri-lo

Exemplo:

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

Observe que isso não foi testado

RESPOSTA ORIGINAL

Os nomes de taxonomia personalizados (e os nomes de tipo de postagem personalizados) precisam obedecer a um conjunto muito específico de regras; caso contrário, você encontrará armadilhas para as quais não há solução.

Aqui está uma linha de guia ao escolher nomes para taxonomias personalizadas (e tipos de postagem personalizados)

  1. O seguinte não é permitido em nomes de taxonomia personalizados e nomes de tipos de postagem personalizados

    • Letras maiúsculas ou camelcase

    • Qualquer tipo de caractere especial, exceto sublinhados ( _)

    • Espaços

    • Mais de 32 caracteres para taxonomias e 20 para tipos de postagem

    • Quaisquer nomes reservados e observe que isso vale para qualquer convenção de nomenclatura personalizada, não apenas para nomes de taxonomia.

  2. Se houver mais de uma palavra em um nome de taxonomia, elas deverão ser separadas por sublinhados, não por hífens ( -). Fui desafiado que os hífens são o caminho a percorrer para SEO em URLs para nomes de taxonomia. É verdade, é por isso que existem regras de reescrita para ajustar seu URL de acordo. Nunca altere nomes de taxonomia ou nomes de tipo de postagem para fins de SEO de URL

Além disso, você deve remover esses recursos estranhos. Isso também pode criar um problema

Se isso não resolver o seu problema, adicione o código que você usa com wp_insert_term

Referência:

Pieter Goosen
fonte
Depois de procurar na fonte , estou um pouco perplexo, porque o $taxonomyparâmetro não é higienizado, se o query_varargumento é definido como true. Isso é realmente inacreditável. E, caso contrário, é higienizado via sanitize_title_with_dashes(), o que substituirá o material por hífens por todo o lugar. O que é inacreditável também, pois eles não devem ser usados.
Nicolai
Além do fato, você pode usar números como quiser, em qualquer lugar, e também no começo, embora possa ler em qualquer lugar que isso não deve ser feito. Não foi possível encontrar uma razão definida contra os números. Diferentemente dos traços, pelo menos há uma instrução »Além disso, se o tipo de postagem contiver traços, você não poderá adicionar colunas à página de administração do tipo de postagem personalizado (usando a ação 'manage_ <Nome do tipo de postagem personalizado> _posts_columns') . «Na página do códice de register_post_type().
Nicolai
11
Wordpress tem suas falhas, deve concordar. Alguns são crimes reais :-). Eu acho que traços é um dos assuntos mais comentados e também mais usado em nomes. Sua falha é bastante evidente quando você começa a examinar a hierarquia do modelo. Crie uma taxonomia com duas palavras como my-taxonomy, separadas por um traço, e crie um modelo de taxonomia taxonomy-my-taxonomy.php e você verá falhas. Eu li a coisa número em algum lugar, preciso verificar novamente isso embora. Esta é uma lista de permanência segura que eu sempre uso para me manter segura e funcionou perfeitamente. Obrigado por todas as suas informações, apreciado
Pieter Goosen
11
Como eu, mas só porque eu aprendi desde o começo, do jeito certo. Como aprendi o máximo que conheço no WordPress Development e nas pessoas inteligentes e experientes aqui. Portanto, existem muitos erros que eu nunca cometi.
Nicolai
11
Imho esta resposta deve ser protegida. Os detalhes nesta resposta / exemplo são muito importantes e nem sempre são apontados no Codex.
Charles