Soporte » WordPress Avanzado » No me guarda una taxonomía personalizada en un CPT

  • Buenos días. Tengo un CTP con una taxonomía personalizada. En el post en cuestión, tengo creado un metabox para elegir la taxonomía, y las distintas taxonomías se eligen mediante un radio button. Sin embargo, no me guarda el valor elegido, cosa que sí hace desde la Edición Rápida (por este motivo, sé que el problema está en la metabox). Me gustaría mostrar una metabox en el que elegir la categoría, pero una única. Este es el código que tengo ahora mismo:

    /* CAMBIO A RADIO BUTTON LA TAXONOMÍA SISTEMA */
    
    //add_action( 'admin_menu', 'myprefix_remove_meta_box');
    function myprefix_remove_meta_box(){
       remove_meta_box('sistemasdiv', 'cliente-satisfecho', 'normal');
    }
    
    //Add new taxonomy meta box
     add_action( 'add_meta_boxes', 'myprefix_add_meta_box');
     function myprefix_add_meta_box() {
         add_meta_box( 'sistema_id', 'Sistemas','sistema_metabox','cliente-satisfecho' ,'side','core');
     }
     
     //Callback to set up the metabox
    function sistema_metabox( $post ) {
        //Get taxonomy and terms
        $taxonomy = 'sistemas';
     
        //Set up the taxonomy object and get terms
        $tax = get_taxonomy($taxonomy);
        $terms = get_terms($taxonomy,array('hide_empty' => 0));
     
        //Name of the form
        $name = 'tax_input[' . $taxonomy . ']';
     
        //Get current and popular terms
        $popular = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );
        $postterms = get_the_terms( $post->ID,$taxonomy );
        $current = ($postterms ? array_pop($postterms) : false);
        $current = ($current ? $current->term_id : 0);
        ?>
     
        <div id="taxonomy-<?php echo $taxonomy; ?>" class="categorydiv">
     
            <!-- Display tabs-->
            <ul id="<?php echo $taxonomy; ?>-tabs" class="category-tabs">
                <li class="tabs"><a href="#<?php echo $taxonomy; ?>-all" tabindex="3"><?php echo $tax->labels->all_items; ?></a></li>
                <li class="hide-if-no-js"><a href="#<?php echo $taxonomy; ?>-pop" tabindex="3"><?php _e( 'Más usados' ); ?></a></li>
            </ul>
     
            <!-- Display taxonomy terms -->
            <div id="<?php echo $taxonomy; ?>-all" class="tabs-panel">
                <ul id="<?php echo $taxonomy; ?>checklist" class="list:<?php echo $taxonomy?> categorychecklist form-no-clear">
                    <?php   foreach($terms as $term){
                        $id = $taxonomy.'-'.$term->term_id;
                        echo "<li id='$id'><label class='selectit'>";
                        echo "<input type='radio' id='in-$id' name='{$name}'".checked($current,$term->term_id,false)."value='$term->term_id' />$term->name<br />";
                       echo "</label></li>";
                    }?>
               </ul>
            </div>
     
            <!-- Display popular taxonomy terms -->
            <div id="<?php echo $taxonomy; ?>-pop" class="tabs-panel" style="display: none;">
                <ul id="<?php echo $taxonomy; ?>checklist-pop" class="categorychecklist form-no-clear" >
                    <?php   foreach($popular as $term){
                        $id = 'popular-'.$taxonomy.'-'.$term->term_id;
                        echo "<li id='$id'><label class='selectit'>";
                        echo "<input type='radio' id='in-$id'".checked($current,$term->term_id,false)."value='$term->term_id' />$term->name<br />";
                        echo "</label></li>";
                    }?>
               </ul>
           </div>
     
        </div>
        <?php
    }
     
     add_action('admin_enqueue_scripts','myprefix_radiotax_javascript');
     
     function myprefix_radiotax_javascript(){
        wp_register_script( 'radiotax', get_template_directory_uri() . '/js/radiotax.js', array('jquery'), null, true ); // We specify true here to tell WordPress this script needs to be loaded in the footer
        wp_enqueue_script( 'radiotax' );
    } 

    Gracias

    Por cierto, tengo habilitado Gutemberg en el CPT. No sé si será eso. Además, tampoco me aparece una metabox para la etiquetas. ¿Cómo podría crear una metabox para las etiquetas?

    La página con la que necesito ayuda: [accede para ver el enlace]

Viendo 8 respuestas - 1 de 8 (de 8 total)
  • Hola. Ya conocía ese plugin. Estoy haciendo pruebas con él, y veo que tengo dos problemas. El primero, si quito todo el código que puse arriba, en el post del CPT no me aparece ninguna metabox para seleccionar la taxonomía. ¿Cómo soluciono esto?

    Hola @zelarra
    Te sugeri ese plugin para que vieses su codigo y asi compararlo para ver que tienes mal en el tuyo.
    Como comentas que no aparece entiendo que el problema tambien lo tienes en como registras la taxonomia o como asocias esa taxonomia al post type.
    Revisa el codigo mirando el codex o pasate por generatewp.com y creas el codigo para el post type y la taxonomia y comprueba que aparece, despues prueba el plugin o tu codigo.
    Como usas un metabox personalizado en el codigo usa ‘meta_box_cb’ para registrar el metabox, tienes mas info aqui; https://codex.wordpress.org/Function_Reference/register_taxonomy

    Hola, estoy revisando con generatewp.com el código. Lo tengo exactamente igual, y sigue sin aparecer en los posts del CPT. Mira, este es el código:

    //* AÑADIR CATEGORÍA SISTEMA AL CPT
    
    function taxonomy_sistemas() {
    
    	$labels = array(
    		'name'                       => _x( 'Sistemas', 'Taxonomy General Name', 'energanova' ),
    		'singular_name'              => _x( 'Sistema', 'Taxonomy Singular Name', 'energanova' ),
    		'menu_name'                  => __( 'Sistemas', 'energanova' ),
    		'all_items'                  => __( 'Todos los sistemas', 'energanova' ),
    		'parent_item'                => __( 'Sistema padre', 'energanova' ),
    		'parent_item_colon'          => __( 'Sistema padre:', 'energanova' ),
    		'new_item_name'              => __( 'Nuevo sistema', 'energanova' ),
    		'add_new_item'               => __( 'Añadir nuevo sistema', 'energanova' ),
    		'edit_item'                  => __( 'Editar sistema', 'energanova' ),
    		'update_item'                => __( 'Actualizar sistema', 'energanova' ),
    		'view_item'                  => __( 'Ver sistema', 'energanova' ),
    		'separate_items_with_commas' => __( 'Separar sistemas con comas', 'energanova' ),
    		'add_or_remove_items'        => __( 'Añadir o eliminar sistemas', 'energanova' ),
    		'choose_from_most_used'      => __( 'Elige uno de los más usados', 'energanova' ),
    		'popular_items'              => __( 'Sistemas populares', 'energanova' ),
    		'search_items'               => __( 'Buscar sistemas', 'energanova' ),
    		'not_found'                  => __( 'No se han encontrado sistemas', 'energanova' ),
    		'no_terms'                   => __( 'No hay sistemas', 'energanova' ),
    		'items_list'                 => __( 'Items list', 'energanova' ),
    		'items_list_navigation'      => __( 'Items list navigation', 'energanova' ),
    	);
    	$args = array(
    		'labels'                     => $labels,
    		'post-type'					 => 'cliente-satisfecho',
    		'hierarchical'               => true,
    		'public'                     => true,
    		'show_ui'                    => true,
    		'show_admin_column'          => true,
    		'show_in_nav_menus'          => true,
    		'show_tagcloud'              => true,
    	);
    	register_taxonomy( 'sistemas', array('cliente-satisfecho'), $args );
    
    }
    add_action( 'init', 'taxonomy_sistemas', 0 ); 

    Digo yo que si no estuviera bien registrada la taxonomía, o bien asociada al CPT, no saldría en el listado de posts del CPT, como sucede actualmente. Mira:

    https://www.dropbox.com/s/3who2ltzaguntb2/ScreenShot001.jpg?dl=0

    De hecho, en esa pantalla que puedes ver en la imagen sí que me guarda la taxonomía cuando la cambio.

    Si no sabes porqué me pasa esto, lo voy a dejar así. Es una putada, pero es creo que está todo bien.

    Mil gracias. Un saludo.

    Pues la verdad, es que ahora no sabria.

    Aparentemente esta bien registrado todo, y sin modificar nada del metabox deberia funcionarte bien, eso es cierto?

    ¿Qué quieres decir con «sin modificar nada del metabox»? El código primero que pegué aquí lo he quitado, y no aparece ningún metabox con la taxonomía.

    Como te decia no lo tienes bien y revisando el codigo que pusistes arriba te falta añadir el rest api ('show_in_rest' => true y los otros si necesitas unos diferentes a los predeterminados) ya que el Gutenberg lo usa, y sobre usar radio en vez del checkbox lo que debes hacer es especificar el metabox en los argumentos ('meta_box_cb' => 'tu_function_del_metabox') y si consideras que fuese necesario añadir tambien el sanitize ('meta_box_sanitize_cb' => 'tu_function_of_sanitize').

    Hola, ahora funciona. Me faltaba añadir el rest api. Con respecto a los radio buttons, creo que lo voy a dejar de momento. No es algo que aporte mucho, y es código de más que le meto a la web.

    Mil gracias por la ayuda, un saludo.

Viendo 8 respuestas - 1 de 8 (de 8 total)
  • Debes estar registrado para responder a este debate.