Inserindo um termo em uma taxonomia personalizada

8

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

As capacidades são definidas 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 alterei meu nome de taxonomia personalizada para 'categoria', isto é, o padrão WP funcione bem. O que dá?

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' );
    
por andy 06.10.2014 / 04:38

1 resposta

11

EDIT 2

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

Sabe-se que as taxonomias personalizadas e os tipos de postagem personalizados devem entrar em um plug-in e não no seu tema. Eu tirei partes do meu plugin.

COMO FUNCIONA

A taxonomia é registrada como normal por meio do plug-in. 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 questão é como inserir novos termos.

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

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

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

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

Aqui está o código do plug-in

<?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 de init , o que significa que você está tentando inserir um termo em uma taxonomia que ainda não está registrada.

Sugiro que você mova sua função wp_insert_term para dentro de sua função init, logo abaixo de register_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 );

Por favor note que isto não foi testado

RESPOSTA ORIGINAL

Nomes de taxonomia personalizados (e nomes de tipos de post personalizado) precisam estar de acordo com um conjunto muito específico de regras, caso contrário, você encontrará armadilhas nas quais não há nenhuma alternativa.

Aqui está uma linha de orientação ao escolher nomes para taxonomias personalizadas (e tipos de postagem personalizados)

  1. Os itens a seguir não são permitidos em nomes de taxonomia personalizados e nomes de tipo 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 nomes de taxonomia.

  2. Se houver mais de uma palavra em um nome de taxonomia, elas precisam ser separadas por sublinhados, não hífens ( - ). Eu fui desafiado que hífens são o caminho a percorrer para SEO em URLs para nomes de taxonomia. É verdade, é por isso que há regras de reescrita para ajustar seu URL de acordo. Nunca mude nomes de taxonomia nem poste nomes de tipos para fins de SEO de URL

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

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

Referência:

por Pieter Goosen 06.10.2014 / 06:35