webentwicklung-frage-antwort-db.com.de

Machen Sie übergeordnete Kategorien nicht auswählbar

Ich möchte, dass meine Kategorien mit untergeordneten Kategorien nicht auf der Post-Artikel-Seite auswählbar sind.

Was ich tun möchte, ist das Kontrollkästchen vor ihrer Bezeichnung zu entfernen.

Ich habe die Filterdokumentation durchgesehen, konnte jedoch keinen Filter finden, der meinen Anforderungen entspricht.

2
koskoz

Ich bezweifle wirklich, dass dies filterbar ist, also kommt jQuery zur Rettung :)

Der Code

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
}

Das Ergebnis

no parent categories


Fortgeschritten

Es gibt eine Einschränkung: Wenn eine Unterkategorie ausgewählt wird, verlässt sie die Hierarchie ...

Das Folgende ist also der Code aus dem exzellenten Plugin von Scribu, Category Checklist Tree , gekoppelt mit dem vorherigen Code.

Nachdem Sie einen Beitrag gespeichert haben, werden Sie feststellen, dass die aktivierten Kategorien im Bearbeitungsbildschirm oben angezeigt werden und die Kategoriehierarchie aufgehoben wird. Dieses Plugin entfernt diese "Funktion".

Entweder Sie verwenden den vorherigen Code und installieren das Plugin, oder Sie fügen ihn einfach in den functions.php Ihres Themas oder in ein benutzerdefiniertes Plugin von Ihnen ein (am besten, damit alle Ihre Änderungen themenunabhängig sind).

/*
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();
3
brasofilo

Fast genauso wie bei brasofilo, mein Code unten berücksichtigt auch verschiedene Taxonomien und entfernt das Kontrollkästchen für übergeordnete Kategorien auf der obersten Ebene, nur wenn sie Kinder haben. Dies ermöglicht, dass andere Kategorien der obersten Ebene, die kinderlos sind, noch auswählbar sind. Ich habe diesen einfachen Code in die Datei functions.php meines Themas geschrieben:

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();
3
Mike Kormendy

Es kann auch mit dem Plugin "Category Checklist Tree" durchgeführt werden, um die Taxonomie-Hierarchie wie in brasofilo und einigen CSS zu erhalten:

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

(#categorychecklist kann durch #yourcustomtaxonomychecklist ersetzt werden, um dies auf eine custo-Taxonomie anzuwenden.)

Um dieses und anderes CSS zu WordPress-Admin hinzuzufügen, kann die Datei functions.php wie folgt ergänzt werden:

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

Fügen Sie dann das Stylesheet "admin.css" zu Ihrem Themenverzeichnis hinzu und fügen Sie das obige CSS hinzu

0
Peanut

Ich habe eine Kombination der oben genannten verwendet, um meine Lösung zu erhalten. Ich mochte den reinen CSS-Ansatz, aber die Label-Klick-Aktion würde das Attribut "angehakt" des Kontrollkästchens immer noch ändern, obwohl es nicht angezeigt wurde. Beachten Sie, dass es schwierig ist, die ersten beiden Kategorienebenen auszublenden.

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 (Wenn das Kontrollkästchen ausgeblendet ist, brechen Sie das Klickereignis ab. Funktioniert auf jeder Ebene):

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

Und um auf admin zu verweisen:

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');
0
Nathan Pond

Folgendes habe ich verwendet, um die übergeordneten Kategorien zu deaktivieren und nur eine Kategorie pro Beitrag zuzulassen. Dieser Code ändert auch die Schnellbearbeitungskategorien. Ich begrüße jemanden, der es aufräumt. Ich bin nicht sicher in Javascript.

Ich habe den ersten Teil hier: https://wordpress.org/support/topic/making-category-selection-radio-buttons

    /* 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();
0
Carole Magouirk

Die folgende Lösung verhindert, dass das Kontrollkästchen ausgegeben wird. Dies scheint meiner Meinung nach viel sauberer zu sein.

Ich erstelle einen benutzerdefinierten Walker, der den Kern Walker_Category_Checklist erweitert und die Funktion start_el außer Kraft setzt, sodass $args['list_only'] unter bestimmten Bedingungen auf true gesetzt werden kann. In diesem Fall prüft die Funktion, ob wir einen Begriff der obersten Ebene ($category->parent == 0) haben, der Unterausdrücke ($args['has_children']) enthält, und natürlich, ob wir die richtige Taxonomie verwenden. Wenn diese Bedingungen erfüllt sind, wird $args['list_only'] auf true gesetzt und die übergeordnete Methode aufgerufen, die das Kontrollkästchen für dieses Element jetzt nicht ausgibt.

class Wpse22836_Walker_Category_Checklist extends Walker_Category_Checklist {
    public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
        if ( 'category' ==  $args['taxonomy'] 
                && $args['has_children'] 
                && 0 === $category->parent) {
            $args['list_only'] = true;
        }
        parent::start_el( $output, $category, $depth, $args, $id );
    }
}

Um WordPress zu veranlassen, diese Walker-Klasse anstelle der ursprünglichen zu verwenden, können wir den Filter wp_terms_checklist_args in wp_terms_checklist() verwenden:

add_filter( 'wp_terms_checklist_args', function( $args, $post_id ) {
    $args['walker'] = new Wpse22836_Walker_Category_Checklist();
    return $args;
}, 10, 2 );

Diese Lösung hat den Vorteil, dass sie automatisch an allen Stellen funktioniert, an denen die Kernfunktion wp_terms_checklist() verwendet wird, und dass sie nicht von JavaScript abhängt.

0
JHoffmann