Hice esta taxonomía personalizada que controlará el diseño en publicaciones individuales, básicamente quiero agregar dos opciones, Diseño 1 y Diseño 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 );
Las capacidades se establecen en valores no válidos para evitar que los términos se editen, pero no puedo hacer que wp_insert_term funcione.
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 cambié el nombre de mi taxonomía personalizada a 'categoría', es decir, el valor predeterminado de WP, funciona bien. ¿Lo 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
fuente
fuente
Respuestas:
EDITAR 2
Como se prometió, aquí está el código del complemento.
Es un hecho conocido que las taxonomías personalizadas y los tipos de publicaciones personalizadas deben ir en un complemento, y no en su tema. He eliminado partes de mi plugin.
CÓMO FUNCIONA
La taxonomía se registra como normal a través del complemento. Para cualquier información sobre esto, puede ir y ver
register_taxonomy
. La parte que necesitaba resaltar y lo que es relevante para esta pregunta es cómo insertar nuevos términos.Insertar términos
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 vez y luego nunca más, casi como eliminarla después de la primera ejecución.Para lograr esto, vas a conectar tu función
register_activation_hook
. Este enlace se ejecuta una vez, es decir, cuando se activa el complemento, no se volverá a ejecutar al actualizar la página. La única vez que se activará nuevamente es cuando el complemento se desactiva y se activa nuevamentePor lo tanto, primero debe registrar su taxonomía, ya que no puede asignar términos a una taxonomía que no existe. Una vez que su taxonomía esté registrada, puede insertar sus términos. Recuerde, esta acción solo tendrá lugar una vez, y es cuando se activa el complemento. Si necesita agregar términos, debe desactivar el complemento y activarlo nuevamente
También debe verificar primero si existe un término antes de intentar crearlo e insertarlo.
Aquí está el código del complemento
EDITAR 1
Su problema con la inserción de términos es su gancho.
after_setup_theme
se ejecuta antesinit
, lo que significa que está intentando insertar un término en una taxonomía que aún no está registrada.Sugeriría que mueva su
wp_insert_term
función dentro de su función de inicio, justo debajoregister_taxonomy
También es recomendable verificar primero si existe un término (
term_exists
) antes de insertarloEjemplo:
Tenga en cuenta que esto no se ha probado
RESPUESTA ORIGINAL
Los nombres de taxonomía personalizados (y los nombres de tipo de publicación personalizados) deben cumplir con un conjunto muy específico de reglas, de lo contrario, encontrará dificultades para las que no hay solución.
Aquí hay una guía para elegir nombres para taxonomías personalizadas (y tipos de publicaciones personalizadas)
Los siguientes no están permitidos en nombres de taxonomía personalizados y nombres de tipo de publicación personalizados
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 publicación
Cualquier nombre reservado , y tenga en cuenta que esto se aplica a cualquier convención de nomenclatura personalizada, no solo a los nombres de taxonomía.
Si hay más de una palabra en un nombre de taxonomía, deben estar separadas por guiones bajos, no guiones (
-
). Me desafiaron que los guiones son el camino a seguir para SEO en URL para nombres de taxonomía. Es cierto, por eso hay reglas de reescritura para ajustar su URL en consecuencia. Nunca cambie los nombres de taxonomía ni los nombres de tipo de publicación con fines de SEO de URLAdemás, debe eliminar esas capacidades extrañas. También podría crear un problema
Si esto no resuelve su problema, agregue el código que usa con
wp_insert_term
Referencia:
register_taxonomy
register_post_type
fuente
$taxonomy
parámetro no se desinfecta en absoluto, si elquery_var
argumento se establece entrue
. Eso es bastante increíble en realidad. Y de lo contrario, se desinfecta a través desanitize_title_with_dashes()
, que, nomen es omen, reemplazará cosas con guiones por todo el lugar. Lo que también es increíble, ya que no deberían usarse.register_post_type()
.