Insertar un término en una taxonomía personalizada

9

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' );
andy
fuente
Como prometí, publiqué el código en el complemento. Espero que esto ayude :-)
Pieter Goosen

Respuestas:

11

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_termses 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 nuevamente

Por 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

<?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();

EDITAR 1

Su problema con la inserción de términos es su gancho. after_setup_themese ejecuta antes init, 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_termfunció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 insertarlo

Ejemplo:

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

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)

  1. 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.

  2. 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 URL

Ademá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:

Pieter Goosen
fuente
Después de buscar en la fuente , estoy un poco perplejo, porque el $taxonomyparámetro no se desinfecta en absoluto, si el query_varargumento se establece en true. Eso es bastante increíble en realidad. Y de lo contrario, se desinfecta a través de sanitize_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.
Nicolai
Además del hecho, puede usar los números que desee, en cualquier lugar, así que al principio también, aunque puede leer en todas partes que esto no debería hacerse. Sin embargo, no se pudo encontrar una razón definitiva contra los números. A diferencia de los guiones, al menos hay una declaración ». Además, si el tipo de publicación contiene guiones, no podrá agregar columnas a la página de administración del tipo de publicación personalizada (mediante la acción 'manage_ <Nombre de tipo de publicación personalizado> _posts_columns') . «En la página del códice de register_post_type().
Nicolai
1
Wordpress tiene sus defectos, debe estar de acuerdo. Algunos son crímenes reales :-). Creo que los guiones son uno de los temas más hablados y también más utilizados en los nombres. Su falla es bastante evidente cuando comienzas a mirar la jerarquía de plantillas. Cree una taxonomía con dos palabras como my-taxonomy separadas por un guión, y cree una plantilla de taxonomía taxonomy-my-taxonomy.php y verá un error. He leído el número en alguna parte, sin embargo, tengo que volver a verificarlo. Esta es una lista de seguridad que siempre uso para mantenerme a salvo, y ha funcionado perfectamente. Gracias por toda su información, apreciada
Pieter Goosen
1
Como yo, pero solo porque lo aprendí desde el principio de la manera correcta. Como aprendí lo más que sé del desarrollo de WordPress y las personas inteligentes y experimentadas aquí. Así que hay muchos errores que nunca cometí.
Nicolai
1
En mi opinión, esta respuesta debe estar protegida. Los detalles en esta respuesta / ejemplo son muy importantes y no se señalan con suficiente frecuencia en el Codex.
Charles