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' );
custom-taxonomy
andy
fonte
fonte
Respostas:
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 novamentePortanto, 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
EDIT 1
Seu problema com a inserção de termos é o seu gancho.
after_setup_theme
é executado antesinit
, 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_term
funçã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-loExemplo:
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)
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.
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 URLAlé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:
register_taxonomy
register_post_type
fonte
$taxonomy
parâmetro não é higienizado, se oquery_var
argumento é definido comotrue
. Isso é realmente inacreditável. E, caso contrário, é higienizado viasanitize_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.register_post_type()
.