Hacer que las categorías principales no sean seleccionables

2

Me gustaría que mis categorías que tienen categorías secundarias no se puedan seleccionar en la página de publicación del artículo.

Lo que quiero hacer es eliminar la casilla de verificación antes de su etiqueta.

He buscado en la documentación del filtro pero no pude encontrar ningún filtro que se adapte a mi necesidad.

    
pregunta koskoz 13.07.2011 - 15:05

5 respuestas

3

Realmente dudo que esto sea filtrable, así que jQuery viene a rescatar :)

El Código

add_action( 'admin_footer-post.php', 'wpse_22836_remove_top_categories_checkbox' );
add_action( 'admin_footer-post-new.php', 'wpse_22836_remove_top_categories_checkbox' );

function wpse_22836_remove_top_categories_checkbox()
{
    global $post_type;

    if ( 'post' != $post_type )
        return;
    ?>
        <script type="text/javascript">
            jQuery("#categorychecklist>li>label input").each(function(){
                jQuery(this).remove();
            });
        </script>
    <?php
}

El resultado

Avanzado

Hayunaadvertencia:cuandoseseleccionaunasubcategoría,sesaledelajerarquía...

Porlotanto,elsiguienteeselcódigodelexcelentecomplementodeScribu, Árbol de lista de verificación de categorías , junto con el código anterior.

  

En la pantalla de edición de publicaciones, después de guardar una publicación, notará que las categorías marcadas se muestran arriba, rompiendo la jerarquía de categorías. Este complemento elimina esa "característica".

O utiliza el código anterior e instala el complemento, o simplemente suelta esto en functions.php de su tema o en un plugin personalizado tuyo (preferible, por lo que todos tus ajustes serán independientes del tema).

/*
Based on Category Checklist Tree, by scribu
Preserves the category hierarchy on the post editing screen
Removes parent categories checkbox selection
*/
class Category_Checklist {

    function init() {
        add_filter( 'wp_terms_checklist_args', array( __CLASS__, 'checklist_args' ) );
    }

    function checklist_args( $args ) {
        add_action( 'admin_footer', array( __CLASS__, 'script' ) );

        $args['checked_ontop'] = false;

        return $args;
    }

    // Scrolls to first checked category
    function script() {
?>
<script type="text/javascript">
    jQuery(function(){
        jQuery('[id$="-all"] > ul.categorychecklist').each(function() {
            var $list = jQuery(this);
            var $firstChecked = $list.find(':checked').first();

            if ( !$firstChecked.length )
                return;

            var pos_first = $list.find(':checkbox').position().top;
            var pos_checked = $firstChecked.position().top;

            $list.closest('.tabs-panel').scrollTop(pos_checked - pos_first + 5);
        });

        jQuery("#categorychecklist>li>label input").each(function(){
            jQuery(this).remove();
        });

    });
</script>
<?php
    }
}

Category_Checklist::init();
    
respondido por el brasofilo 14.07.2012 - 23:26
3

Casi exactamente igual a brasofilo, mi código a continuación también tiene en cuenta las diferentes taxonomías y elimina la casilla de verificación de las categorías principales en el nivel superior, solo si tienen hijos. Esto permite que otras categorías de nivel superior que no tienen hijos sigan siendo seleccionables. Pongo este código simple de las funciones de mi tema. Archivo de php:

class Category_Checklist {

function init() {
    add_filter( 'wp_terms_checklist_args', array( __CLASS__, 'checklist_args' ) );
}

function checklist_args( $args ) {
    add_action( 'admin_footer', array( __CLASS__, 'script' ) );

    $args['checked_ontop'] = false;

    return $args;
}

// Scrolls to first checked category
function script() {
?>
<script type="text/javascript">
(function($){
    $('[id$="-all"] > ul.categorychecklist').each(function() {
        var list = $(this);
        var firstChecked = list.find(':checked').first();

        if ( !firstChecked.length )
            return;

        var pos_first = list.find(':checkbox').position().top;
        var pos_checked = firstChecked.position().top;

        list.closest('.tabs-panel').scrollTop(pos_checked - pos_first + 5);
    });

    $(".categorychecklist>li>label input").each(function(){
        if ($(this).parent().next('ul').hasClass('children')) {
            $(this).remove();
        }
    });

})(jQuery);
</script>
<?php
    }
}

Category_Checklist::init();
    
respondido por el Mike Kormendy 17.05.2015 - 05:35
0

También se puede hacer con el complemento "Árbol de lista de verificación de categorías" para mantener la jerarquía de taxonomía como dice brasofilo y algo de CSS:

#categorychecklist > li > label.selectit > input { display: none !important; }

(#categorychecklist puede reemplazarse con #yourcustomtaxonomychecklist para aplicar esto a una taxonomía de custo)

Para agregar esto, y otros css a wordpress admin, se puede agregar lo siguiente a functions.php:

function my_admin_head() {
    echo '<link rel="stylesheet" type="text/css"
    href="'.get_bloginfo('stylesheet_directory').'/admin.css">';
}
add_action('admin_head', 'my_admin_head');

Y luego agregue la hoja de estilo "admin.css a su directorio de temas y agregue el css arriba

    
respondido por el Peanut 23.02.2013 - 16:38
0

Esto es lo que usé para deshabilitar las categorías principales y solo permitir una categoría por publicación. Este código también cambia las categorías de edición rápida. Doy la bienvenida a alguien para que lo limpie, no confío en javascript.

Obtuve la primera parte aquí: enlace

    /* ONLY ALLOW ONE CATEGORY PER POST */
add_action( 'admin_footer', 'catlist2radio' );
function catlist2radio(){
    echo '<script type="text/javascript">';
    echo 'jQuery("#categorychecklist .children input, #categorychecklist-pop .children input, .cat-checklist .children input")';
    echo '.each(function(){this.type="radio"});</script>';
}

/* DISABLE PARENT CATEGORIES FOR POSTS */
/*
Based on Category Checklist Tree, by scribu
Preserves the category hierarchy on the post editing screen
Removes parent categories checkbox selection
*/
class Category_Checklist {
    function init() {
        add_filter( 'wp_terms_checklist_args', array( __CLASS__, 'checklist_args' ) );
    }
    function checklist_args( $args ) {
        add_action( 'admin_footer', array( __CLASS__, 'script' ) );
        $args['checked_ontop'] = false;
        return $args;
    }

    // Scrolls to first checked category
    function script() {
?>
<script type="text/javascript">
    jQuery(function(){
        jQuery('[id$="-all"] > ul.categorychecklist').each(function() {
            var $list = jQuery(this);
            var $firstChecked = $list.find(':checked').first();
            if ( !$firstChecked.length )
                return;
            var pos_first = $list.find(':checkbox').position().top;
            var pos_checked = $firstChecked.position().top;
            $list.closest('.tabs-panel').scrollTop(pos_checked - pos_first + 5);
        });
        jQuery("#categorychecklist>li>label input").each(function(){
            jQuery(this).remove();
        });
    });
        jQuery(function(){
        jQuery('[id$="-all"] > ul.cat-checklist').each(function() {
            var $list = jQuery(this);
            var $firstChecked = $list.find(':checked').first();
            if ( !$firstChecked.length )
                return;
            var pos_first = $list.find(':checkbox').position().top;
            var pos_checked = $firstChecked.position().top;
            $list.closest('.tabs-panel').scrollTop(pos_checked - pos_first + 5);
        });
        jQuery(".cat-checklist>li>label input").each(function(){
            jQuery(this).remove();
        });
    });
        jQuery('#category-tabs .hide-if-no-js').remove();
</script>
<?php
    }
}
Category_Checklist::init();
    
respondido por el Carole Magouirk 17.09.2014 - 01:36
0

Utilicé una combinación de lo anterior para obtener mi solución. Me gustó el enfoque css puro, sin embargo, la acción de hacer clic en la etiqueta cambiaría el atributo "marcado" de la casilla de verificación aunque no se mostrara. Aquí está mi solución, tenga en cuenta que es difícil codificar los dos primeros niveles de categorías.

css:

#categorychecklist > li > label.selectit,
#categorychecklist > li > ul.children > li > label.selectit {cursor: text;}

#categorychecklist > li > label.selectit > input,
#categorychecklist > li > ul.children > li > label.selectit > input { display: none !important; }

js (si la casilla de verificación está oculta, cancele el evento de clic. Funcionará en cualquier nivel):

$('#categorychecklist > li label.selectit').on('click', function(event) {
        if (!$(this).children("input").is(':visible'))
            event.preventDefault();
    });

Y para referenciar en admin:

function add_admin_assets() {
    wp_enqueue_style( "admin-custom-css", get_bloginfo('template_url').'/assets/styles/custom/admin.css');
    wp_enqueue_script('admin-custom-js', get_bloginfo('template_url').'/inc/js/admin.js', array(), null, true);
}
add_action('admin_head', 'add_admin_assets');
    
respondido por el Nathan Pond 28.11.2016 - 00:41

Lea otras preguntas en las etiquetas