Insertando un término en una taxonomía personalizada
Creé esta taxonomía personalizada que controlará el diseño en posts individuales, básicamente quiero agregar dos opciones, Diseño 1 y Diseño 2.
// Registrar Taxonomía Personalizada
function custom_taxonomy() {
$labels = array(
'name' => _x( 'Diseño', 'Nombre General de Taxonomía', 'text_domain' ),
'singular_name' => _x( 'Diseño', 'Nombre Singular de Taxonomía', 'text_domain' ),
'menu_name' => __( 'Taxonomía', 'text_domain' ),
'all_items' => __( 'Todos los Elementos', 'text_domain' ),
'parent_item' => __( 'Elemento Padre', 'text_domain' ),
'parent_item_colon' => __( 'Elemento Padre:', 'text_domain' ),
'new_item_name' => __( 'Nombre del Nuevo Elemento', 'text_domain' ),
'add_new_item' => __( 'Agregar Nuevo Elemento', 'text_domain' ),
'edit_item' => __( 'Editar Elemento', 'text_domain' ),
'update_item' => __( 'Actualizar Elemento', 'text_domain' ),
'separate_items_with_commas' => __( 'Separar elementos con comas', 'text_domain' ),
'search_items' => __( 'Buscar Elementos', 'text_domain' ),
'add_or_remove_items' => __( 'Agregar o eliminar elementos', 'text_domain' ),
'choose_from_most_used' => __( 'Elegir entre los elementos más usados', 'text_domain' ),
'not_found' => __( 'No Encontrado', '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 );
}
// Conectar a la acción 'init'
add_action( 'init', 'custom_taxonomy', 0 );
Las capacidades están establecidas con valores inválidos para evitar que los términos sean editados, pero no puedo hacer funcionar wp_insert_term.
Agregar dos términos a mi taxonomía personalizada no puede ser tan difícil, ¿verdad?
Usar esto para insertar un término no funciona, aunque si cambio el nombre de mi taxonomía personalizada a 'category', es decir, la taxonomía por defecto de WP, funciona perfectamente. ¿Qué sucede?
function example_insert_category() {
$parent_term = term_exists( 'layout' ); // se devuelve un array si se proporciona la taxonomía
$parent_term_id = $parent_term['term_id']; // obtener el id numérico del término
wp_insert_term(
'Categoría de Ejemplo',
'layout',
array(
'description' => 'Esta es una categoría de ejemplo creada con wp_insert_term.',
'slug' => 'categoria-ejemplo'
)
);
}
add_action( 'after_setup_theme', 'example_insert_category' );

EDIT 2
Como prometí, aquí está el código del plugin.
Es un hecho conocido que las taxonomías personalizadas y los tipos de contenido personalizados deben ir en un plugin, y no en tu tema. He eliminado partes de mi plugin.
CÓMO FUNCIONA
La taxonomía se registra normalmente a través del plugin. Para cualquier información sobre esto, puedes consultar register_taxonomy
. La parte que necesitaba resaltar y que es relevante para esta pregunta, es cómo insertar nuevos términos.
Insertar términos mediante wp_insert_terms
es rápido y fácil, pero este código también puede afectar el tiempo de carga si no se usa correctamente. La idea es ejecutar esa función una sola vez, y luego nunca más, casi como eliminarla después de la primera ejecución.
Para lograr esto, vas a enganchar tu función a register_activation_hook
. Este gancho se ejecuta una vez, que es cuando el plugin se activa, no se volverá a ejecutar al actualizar la página. La única vez que se disparará nuevamente es cuando el plugin se desactive y active de nuevo.
Primero necesitas registrar tu taxonomía ya que no puedes asignar términos a una taxonomía que no existe. Una vez que tu taxonomía está registrada, puedes insertar tus términos. Recuerda, esta acción solo ocurrirá una vez, y es cuando el plugin se activa. Si necesitas agregar términos, debes desactivar el plugin y activarlo nuevamente.
También debes verificar primero si un término existe antes de intentar crearlo e insertarlo.
Aquí está el código del plugin:
<?php
/**
Plugin Name: Crear términos
Plugin URI: http://wordpress.stackexchange.com/q/163541/31545
Description: Crear términos
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('Taxonomía de Prueba', 'nombre general de taxonomía' ),
'singular_name' => _x('Taxonomía de Prueba', 'nombre singular de taxonomía'),
'search_items' => __('Buscar Taxonomía de Prueba'),
'popular_items' => __('Taxonomías de Prueba Populares'),
'all_items' => __('Todas las Taxonomías de Prueba'),
'edit_item' => __('Editar Taxonomía de Prueba'),
'edit_item' => __('Editar Taxonomía de Prueba'),
'update_item' => __('Actualizar Taxonomía de Prueba'),
'add_new_item' => __('Agregar Nueva Taxonomía de Prueba'),
'new_item_name' => __('Nuevo Nombre de Taxonomía de Prueba'),
'separate_items_with_commas' => __('Separar Taxonomías de Prueba con Comas'),
'add_or_remove_items' => __('Agregar o Eliminar Taxonomías de Prueba'),
'choose_from_most_used' => __('Elegir de las Taxonomías de Prueba Más Usadas')
),
'query_var' => true,
'rewrite' => array('slug' =>'taxonomia-prueba')
);
register_taxonomy( 'test_tax', array( 'post' ), $args );
}
function register_new_terms() {
$this->taxonomy = 'test_tax';
$this->terms = array (
'0' => array (
'name' => 'Prueba 1',
'slug' => 'prueba-1',
'description' => 'Este es un término de prueba uno',
),
'1' => array (
'name' => 'Prueba 2',
'slug' => 'prueba-2',
'description' => 'Este es un término de prueba dos',
),
);
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
Tu problema al insertar términos es tu gancho. after_setup_theme
se ejecuta antes de init
, lo que significa que estás intentando insertar un término en una taxonomía que aún no está registrada.
Sugeriría que muevas tu función wp_insert_term
dentro de tu función init, justo debajo de register_taxonomy
.
También es recomendable verificar primero si un término existe (term_exists
) antes de insertarlo.
Ejemplo:
// Registrar Taxonomía Personalizada
function custom_taxonomy() {
//CÓDIGO PARA REGISTRAR TAXONOMÍA
if( !term_exists( 'Categoría de Ejemplo', 'layout' ) ) {
wp_insert_term(
'Categoría de Ejemplo',
'layout',
array(
'description' => 'Esta es una categoría de ejemplo creada con wp_insert_term.',
'slug' => 'categoria-ejemplo'
)
);
}
}
// Enganchar a la acción 'init'
add_action( 'init', 'custom_taxonomy', 0 );
Nota: esto no ha sido probado
RESPUESTA ORIGINAL
Los nombres de taxonomías personalizadas (y tipos de contenido personalizados) deben cumplir con un conjunto muy específico de reglas, de lo contrario encontrarás problemas para los que no hay solución.
Aquí hay una guía al elegir nombres para taxonomías personalizadas (y tipos de contenido personalizados):
Lo siguiente no está permitido en nombres de taxonomías personalizadas y tipos de contenido personalizados:
Letras mayúsculas o camelCase
Cualquier tipo de carácter especial, excepto guiones bajos (
_
)Espacios
Más de 32 caracteres para taxonomías y 20 para tipos de contenido
Cualquier nombre reservado, y ten en cuenta que esto aplica para cualquier convención de nombres personalizados, no solo nombres de taxonomías.
Si hay más de una palabra en un nombre de taxonomía, deben estar separadas por guiones bajos, no por guiones (
-
). Me han cuestionado que los guiones son mejores para SEO en URLs para nombres de taxonomías. Es cierto, por eso existen reglas de reescritura para ajustar tu URL en consecuencia. Nunca cambies nombres de taxonomías o tipos de contenido por motivos de SEO en URLs.
Además, deberías eliminar esas capacidades extrañas. También podrían crear un problema.
Si esto no resuelve tu problema, por favor agrega el código que usas con wp_insert_term
.
Referencias:

Después de revisar el código fuente, estoy un poco perplejo porque el parámetro $taxonomy
no se sanitiza en absoluto si el argumento query_var
se establece en true
. Es bastante increíble, en realidad. De lo contrario, se sanitiza mediante sanitize_title_with_dashes()
, que, como su nombre indica, reemplazará cosas con guiones por todas partes. Lo cual también es increíble, ya que no deberían usarse.

Aparte del hecho de que puedes usar números como quieras, en cualquier lugar, incluso al principio, aunque puedes leer en todas partes que esto no debería hacerse. No pude encontrar una razón definitiva en contra de los números. A diferencia de los guiones, donde al menos hay una declaración »Además, si el tipo de publicación contiene guiones, no podrás agregar columnas a la página de administración del tipo de publicación personalizada (usando la acción 'manage_<Nombre del Tipo de Publicación Personalizada>_posts_columns')« en la página del codex de register_post_type()
.

Aunque está algo oculto en la sección »Tipos de Publicación Reservados«. No sé si cosas así - potencial o definitivamente problemáticas - deberían imponerse. De lo contrario, es simplemente pedir problemas sin una buena razón.

WordPress tiene sus defectos, hay que admitirlo. Algunos son auténticos crímenes :-). Creo que los guiones son uno de los temas más discutidos y también más utilizados en los nombres. Su fallo es bastante evidente cuando empiezas a mirar la jerarquía de plantillas. Crea una taxonomía con dos palabras como mi-taxonomía separadas por un guión, y crea una plantilla de taxonomía taxonomy-mi-taxonomía.php y verás el fallo. He leído lo de los números en algún sitio, tendré que volver a comprobarlo. Esta es una lista de seguridad que siempre uso para estar a salvo, y me ha funcionado perfectamente. Gracias por toda tu información, se agradece.

Yo también, pero sólo porque lo aprendí desde el principio de la manera correcta. Como aprendí casi todo lo que sé de [wordpress.se] y de la gente inteligente y experimentada de aquí. Así que hay muchos errores que en realidad nunca he cometido yo mismo.

En mi opinión, esta respuesta debería estar protegida. Los detalles en esta respuesta/ejemplo son muy importantes y no se señalan con suficiente frecuencia en el Codex.
